1 回答

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超7個(gè)贊
此代碼將相同的實(shí)例傳遞ArrayList給LanguageItemArrayAdapter
new LanguageItemArrayAdapter(getContext(), simpleLanguageItems, simpleLanguageItems)
要理解為什么add(…)和clear()in也修改同一個(gè)對象,您需要從源代碼ArrayAdapter中查看它們的實(shí)現(xiàn)。
public void clear() {
synchronized (mLock) {
if (mOriginalValues != null) {
mOriginalValues.clear();
} else {
mObjects.clear();
}
…
}
…
}
clear()將修改mObjects和mOriginalValues(您會注意到其他函數(shù)也ArrayAdapter做同樣的事情)。您需要閱讀里面的代碼ArrayFilter以了解它們是如何修改的。
private class ArrayFilter extends Filter {
/*
mObjects will contain only items fulfilling the filter conditions.
Original items are copied into mOriginalValues
*/
}
查看構(gòu)造函數(shù)(和構(gòu)造函數(shù)鏈),您會發(fā)現(xiàn)您的類構(gòu)造函數(shù)有
super(context, 0, filteredList);
最終會調(diào)用
private ArrayAdapter(@NonNull Context context,
@LayoutRes int resource,
@IdRes int textViewResourceId,
@NonNull List<T> objects,
boolean objsFromResources) {
…
mObjects = objects;
…
}
這允許ArrayAdapter修改您的simpleLanguageItems實(shí)例。
添加回答
舉報(bào)