- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个由静态 ArrayList 对象组成的自定义类。由于某种我似乎无法弄清楚的原因,当我在另一个 ArrayList 对象上调用clear() 方法时,对象中的元素被覆盖。这就是我要说的:
Notice on the itemsArray.clear() line, I will explain further down below
public class AddItemsActivity extends AppCompatActivity{
// Global variables
// For the Description
private EditText descEditText;
// For the Price
private EditText priceEditText;
// Temporary array to store the list of items which will be passed into the Diner
public static ArrayList<Item> itemsArray = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// THIS HAS PROBLEM!!!!
itemsArray.clear();
// Set the content to use the activity_add_items xml file
setContentView(R.layout.activity_add_items);
final ItemsListAdapter adapter = new ItemsListAdapter(this, itemsArray);
// Find the ListView to display the adapter on
ListView listView = (ListView) findViewById(R.id.items_list);
// Set the ListView with the adapter
listView.setAdapter(adapter);
Button addDetailsFragment = (Button) findViewById(R.id.add_item_button);
addDetailsFragment.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Setting up a new dialog
final Dialog dialog = new Dialog(AddItemsActivity.this);
dialog.setContentView(R.layout.item_add_dialog);
dialog.setCancelable(true);
dialog.setTitle(R.string.add_item_title);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.setCanceledOnTouchOutside(false);
Button num1 = (Button) dialog.findViewById(R.id.key_1);
Button num2 = (Button) dialog.findViewById(R.id.key_2);
Button num3 = (Button) dialog.findViewById(R.id.key_3);
Button num4 = (Button) dialog.findViewById(R.id.key_4);
Button num5 = (Button) dialog.findViewById(R.id.key_5);
Button num6 = (Button) dialog.findViewById(R.id.key_6);
Button num7 = (Button) dialog.findViewById(R.id.key_7);
Button num8 = (Button) dialog.findViewById(R.id.key_8);
Button num9 = (Button) dialog.findViewById(R.id.key_9);
Button num0 = (Button) dialog.findViewById(R.id.key_0);
Button numPeriod = (Button) dialog.findViewById(R.id.key_period);
Button numDel = (Button) dialog.findViewById(R.id.key_del);
Button numAdd = (Button) dialog.findViewById(R.id.key_add_item);
// Properties for description field
descEditText = (EditText) dialog.findViewById(R.id.details_desc_input);
// Properties for price field
priceEditText = (EditText) dialog.findViewById(R.id.details_price_input);
// Keypad OnClickListener to append or delete digits in the price input field
View.OnClickListener keyOnClickListener = new View.OnClickListener() {
@Override
// Program logic when one of the buttons is pressed
public void onClick(View v) {
priceEditText.requestFocus();
CharSequence originalText = priceEditText.getText();
Button button = (Button)v;
// Prevents app from crashing when trying to delete an empty field
if (button.getText() == getString(R.string.details_button_delete_text)
&& originalText != null && originalText.length()>0) {
// Deletes one character/digit, deletes '$' if required
if (originalText.length() == 2 && originalText.charAt(0) == '$') {
priceEditText.setText("");
} else {
priceEditText.setText("");
priceEditText.append(originalText.subSequence(0, originalText.length() - 1));
}
// Delete key does nothing instead of displaying 'Del'
} else if (button.getText() == getString(R.string.details_button_delete_text)) {
priceEditText.append("");
// Prevents a second period from appearing in the field
} else if (button.getText().toString()
.equals(getString(R.string.details_button_period_text))
&& originalText.toString().contains(".")) {
priceEditText.append("");
// Adds a $ sign
} else if (originalText == null || originalText.length() == 0) {
priceEditText.append("$");
priceEditText.append(button.getText());
// Else, input the digit pressed
} else {
priceEditText.append(button.getText());
}
}
};
// Add key OnClickListener to add items into Diner's editItemsArray
View.OnClickListener addOnClickListener = new View.OnClickListener() {
@Override
// Program logic when one of the buttons is pressed
public void onClick(View v) {
priceEditText.requestFocus();
CharSequence originalText = priceEditText.getText();
Button button = (Button)v;
// If the input field is empty, do nothing. Else, add the items
if (originalText == null && button.getText() == getString(R.string.details_button_add_text)) {
priceEditText.append("");
// Adds the items into the editItemsArray ArrayList
} else {
Item itemToAdd = new Item(descEditText.getText().toString(),
Double.parseDouble(priceEditText.getText().toString().replace("$",
"")));
itemsArray.add(itemToAdd);
adapter.notifyDataSetChanged();
dialog.dismiss();
Log.e("add item", "works");
}
Log.e("line1", "works");
}
};
num1.setOnClickListener(keyOnClickListener);
num2.setOnClickListener(keyOnClickListener);
num3.setOnClickListener(keyOnClickListener);
num4.setOnClickListener(keyOnClickListener);
num5.setOnClickListener(keyOnClickListener);
num6.setOnClickListener(keyOnClickListener);
num7.setOnClickListener(keyOnClickListener);
num8.setOnClickListener(keyOnClickListener);
num9.setOnClickListener(keyOnClickListener);
num0.setOnClickListener(keyOnClickListener);
numPeriod.setOnClickListener(keyOnClickListener);
numDel.setOnClickListener(keyOnClickListener);
numAdd.setOnClickListener(addOnClickListener);
/*
Request focus for the price input field such that focus is on that field when
the dialog opens
*/
priceEditText.requestFocus();
/*
Hide the appearance of any keyboard when the user presses on the price input field
so the user only uses the provided in app customised keypad
*/
// Hide default keyboard when focus is on this field
priceEditText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
getWindow().setSoftInputMode(WindowManager
.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Log.e("testonclickclose", "works");
}
});
priceEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
});
priceEditText.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return false;
}
});
dialog.show();
// Setting the size of the dialog
Window window = dialog.getWindow();
window.setLayout(WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.WRAP_CONTENT);
}
});
Button addNextDinerActivity = (Button) findViewById(R.id.item_done_button);
addNextDinerActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Assign the list of items to specified Diner (selected previously or
// currently adding)
// Get name of current diner
String nameOfCurrentDiner = Diner.getCurrentName();
// Iteration process to find the index of current Diner
int indexOfCurrentDiner = -1;
for (Diner list : AddDinerActivity.dinerArray) {
if (list.getmDinerName().equals(nameOfCurrentDiner)) {
// Stores in index in a variable
indexOfCurrentDiner = AddDinerActivity.dinerArray.indexOf(list);
}
}
// Instantiate a Diner object to be added later
ArrayList<Item> array = getItemsArray();
Diner dinerToAdd = new Diner(nameOfCurrentDiner, getCurrentBill(getItemsArray()), array);
// Sets a new Diner object to the index position found
AddDinerActivity.dinerArray.remove(indexOfCurrentDiner);
AddDinerActivity.dinerArray.add(indexOfCurrentDiner, dinerToAdd);
// Clears the editItemsArray when leaving activity
// Brings the user back to Diner list page
Intent addDiner = new Intent(AddItemsActivity.this, AddDinerActivity.class);
startActivity(addDiner);
}
});
// Method to calculate the current individual's bill
public double getCurrentBill(ArrayList<Item> list) {
double currentBill = 0;
for (Item item : list) {
currentBill += item.getmItemPrice();
}
return currentBill;
}
// Method to get current item array
public ArrayList<Item> getItemsArray() {
return itemsArray;
}
}
My Diner class is defined as below which consists of an ArrayList object named mDinerItemsList
public class Diner {
public static String currentName;
// To store the currentName
private String mDinerName;
// To store individual's total bill
private double mDinerBill;
// To store the individual's list of items (its description and price)
private ArrayList<Item> mDinerItemsList = new ArrayList<>();
// Class constructor
public Diner(String mDinerName, double mDinerBill, ArrayList<Item> DinerItemsList) {
this.mDinerName = mDinerName;
this.mDinerBill = mDinerBill;
mDinerItemsList = DinerItemsList;
}
// Class constructor with Name ONLY
public Diner(String mDinerName) {
this.mDinerName = mDinerName;
}
// Class constructor with Bill ONLY
public Diner(double mDinerBill) {
this.mDinerBill = mDinerBill;
}
// Class constructor with ItemsList ONLY
public Diner(ArrayList<Item> mDinerItemsList) {
this.mDinerItemsList = mDinerItemsList;
}
// Method to set the current name to identify current diner
public static void setCurrentName(String name) {
currentName = name;
}
// Method to return the current name to identify current diner
public static String getCurrentName() {
return currentName;
}
// Method to return Diner's Name
public String getmDinerName() {
return mDinerName;
}
// Method to return Diner's bill
public double getmDinerBill() {
return mDinerBill;
}
public void setmDinerName(String mDinerName) {
this.mDinerName = mDinerName;
}
// Method to put an item (description and price) into Diner's list of items
public void putmDinerItem(ArrayList<Item> array) {
mDinerItemsList = array;
}
// Method to return Diner's list of items in the form of ArrayList
public ArrayList<Item> getmDinerItemsList() {
return mDinerItemsList;
}
}
在 Activity 中按下按钮时,包含 descEditText 和 PriceEditText 字符串的单个对象将被添加到 itemsArray 中。然后,在我实例化新的 Diner 对象期间,该数组被传递到 mDinerItemsList。这些发生在 AddItemsActivity 结束之前。通过调试过程,我发现当第二次调用AddItemsActivity时,itemsArray.clear()以某种方式删除了我之前实例化的Diner对象的mDinerItemsList。每次调用该 Activity 时都会发生这种情况。因此,我无法在 mDinerItemsList 中为我想要创建的每个 Diner 对象存储任何 ArrayList。我哪里做错了??我几个小时以来一直试图解决这个问题!请帮忙!!!
最佳答案
问题是您只是传递列表而不是创建它的副本。因此实际上只有一个 List 对象,但有许多变量指向该列表。
例如:在 Diner 构造函数中,您只需将 mDinerItemsList 分配给传递的 DinerItemsList 即可。
// Class constructor
public Diner(String mDinerName, double mDinerBill, ArrayList<Item> DinerItemsList) {
this.mDinerName = mDinerName;
this.mDinerBill = mDinerBill;
mDinerItemsList = DinerItemsList;
}
所以当你这样做时
ArrayList<Item> array = getItemsArray();
Diner dinerToAdd = new Diner(nameOfCurrentDiner, getCurrentBill(getItemsArray()), array);
您只需将 getItemArray() 返回的静态列表传递给 Diner,新的 Diner 对象将指向完全相同的列表。
要解决该问题,您可以使用 ArrayList 复制构造函数,它将创建一个浅拷贝(一个单独的列表,指向与原始列表相同的对象):
mDinerItemsList = new ArrayList<>(DinerItemsList);
编辑:澄清一些非常简单的示例代码:
List<String> list1 = new ArrayList<String>();
List<String> list2 = list1;
在上面的示例中,您只有 1 个列表,但有 2 个变量指向它。调用list2.clear();还将清除 list1 (因为两个变量都指向只有 1 个 List)。你的代码做了同样的事情。它只是传递一个对象引用,但不会创建新的引用。
关于java - 自定义类变量被某些未知进程覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44550361/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!