我正在尝试实现一个选项来隐藏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?
答案 0 :(得分:3)
您必须像这样复制ArrayList
,例如:
ArrayList newList = new ArrayList(oldList);
然后才将其传递给DeadlinesAdapter
。它应该可以解决你的问题。
答案 1 :(得分:2)
谢尔盖指出了这个问题:您正在将任务列表传递给适配器,您可以在其中过滤列表。现在您可能想要做的是过滤列表的副本。您实际执行的操作是从原始列表中删除项目。这就是为什么当你将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;
}