为什么重置我的适配器不采用新的ArrayList?

时间:2017-09-14 19:32:54

标签: java android arraylist adapter

我正在尝试实现一个选项来隐藏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?

2 个答案:

答案 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;
}