Android ArrayList "B" 当我在 ArrayList "A" 上调用 clear 时清除
Android ArrayList "B" clears when I call clear on ArrayList "A"
我正在使用这个问题的第二个答案。我只更改了 ArrayLists 的名称,所以代码是一样的。问题是当我清除主 ArrayList 时,出于某种原因,辅助列表也被清除。除非我遗漏了一些明显的东西,否则这不应该发生。代码附在下面;
这是我的构造函数;
public CustomFoodAdapter(Context context, ArrayList<Foods> foodsArray) {
this.context = context;
this.foods = foodsArray;
this.foodsCopy = foodsArray;
}
这是我调用的方法;
public void filter(String text) {
System.out.println("Foods copy: "+foodsCopy.size()); // Size is 54
foods.clear();
System.out.println("2 Foods copy: "+foodsCopy.size()); // Size is 0 (???)
if(text.isEmpty()){
foods.addAll(foodsCopy);
} else{
text = text.toLowerCase();
System.out.println("Length is: "+foodsCopy.size());
for(Foods item: foodsCopy){
System.out.println("Food name: "+item.foodName);
if(item.getFoodName().toLowerCase().contains(text)){
foods.add(item);
}
}
}
notifyDataSetChanged();
}
这是因为您复制的是内存引用中的列表,而不是内容本身。
因此,在 CustomFoodAdapter
构造函数中,您需要创建一个包含 foodsArray
内容的新数组列表。
会是这样的:
public CustomFoodAdapter(Context context, ArrayList<Foods> foodsArray) {
this.context = context;
this.foods = new ArrayList<>(foodsArray);
this.foodsCopy = new ArrayList<>(foodsArray);
}
我正在使用这个问题的第二个答案
这是我的构造函数;
public CustomFoodAdapter(Context context, ArrayList<Foods> foodsArray) {
this.context = context;
this.foods = foodsArray;
this.foodsCopy = foodsArray;
}
这是我调用的方法;
public void filter(String text) {
System.out.println("Foods copy: "+foodsCopy.size()); // Size is 54
foods.clear();
System.out.println("2 Foods copy: "+foodsCopy.size()); // Size is 0 (???)
if(text.isEmpty()){
foods.addAll(foodsCopy);
} else{
text = text.toLowerCase();
System.out.println("Length is: "+foodsCopy.size());
for(Foods item: foodsCopy){
System.out.println("Food name: "+item.foodName);
if(item.getFoodName().toLowerCase().contains(text)){
foods.add(item);
}
}
}
notifyDataSetChanged();
}
这是因为您复制的是内存引用中的列表,而不是内容本身。
因此,在 CustomFoodAdapter
构造函数中,您需要创建一个包含 foodsArray
内容的新数组列表。
会是这样的:
public CustomFoodAdapter(Context context, ArrayList<Foods> foodsArray) {
this.context = context;
this.foods = new ArrayList<>(foodsArray);
this.foodsCopy = new ArrayList<>(foodsArray);
}