[英]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.