[英]Why does resetting my Adapter not take a new ArrayList?
我试图实现一个选项,以从ArrayList“ mTaskList”隐藏某些项目。
为此,我在适配器的构造函数中提供了一个布尔值“ hideDues”。 如果是真的,我将这些项目从列表中过滤掉。
public DeadlinesAdapter(Context context, ArrayList<TaskItem> taskList, DeadlinesAdapterListener listener, boolean hideDues) {
if (hideDues) {
for (int i = 0; i < taskList.size(); i++) {
if (taskList.get(i).getTimeLeftInMinutes() < 1) taskList.remove(i);
}
}
mTaskList = taskList;
mContext = context;
mListener = listener;
}
它可以工作,但是当我将该布尔值设置为false并重置适配器时,即使我在构造函数中提供的原始ArrayList不变,它仍然使用过滤后的列表。
if (mHideDues) {
mHideDues = false;
item.setIcon(R.drawable.ic_invisible_white);
} else {
mHideDues = true;
item.setIcon(R.drawable.ic_visible_white);
}
mDeadlinesAdapter = new DeadlinesAdapter(this, mTaskList, this, mHideDues);
mDeadlinesRecyclerView.setAdapter(mDeadlinesAdapter);
我更改了布尔值并重置了适配器。 mTaskList不应有任何更改。 那么,为什么不采用新的ArrayList?
例如,您必须像这样复制ArrayList
:
ArrayList newList = new ArrayList(oldList);
然后将其传递给DeadlinesAdapter
。 它应该可以解决您的问题。
Sergei指出了问题:您正在将任务列表传递给适配器,在此您可以对列表进行过滤。 现在,您可能想要做的是过滤列表的副本。 您实际要做的是从原始列表中删除项目。 这就是为什么将mHideDues设置为false时,什么都不会发生的原因。
您可以做的只是:
ArrayList<TaskItem> mTaskList = new ArrayList<TaskItem>();
public DeadlinesAdapter(Context context, ArrayList<TaskItem> taskList, DeadlinesAdapterListener listener, boolean hideDues) {
mTaskList.addAll(taskList);
if (hideDues) {
for (int i = 0; i < this.list.size(); i++) {
if (mTaskList.get(i).getTimeLeftInMinutes() < 1) mTaskList.remove(i);
}
}
mContext = context;
mListener = listener;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.