亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 ArrayAdapter 中的原始數組項也會被刪除?

為什么 ArrayAdapter 中的原始數組項也會被刪除?

侃侃無極 2023-09-13 15:38:50
我通過適配器的 add() 和 clear() 從適配器對象中添加和刪除值,它們正在刪除元素并將其添加到列表中,該列表不會從適配器內的任何位置引用。我有原始列表,它位于適配器外部,并具有從適配器內部到不更改外部引用的引用,而在適配器內部,我僅引用一個新列表,我使用舊的原始列表填充了相同的對象。新名單為何會影響舊名單?class LanguageItemArrayAdapter extends ArrayAdapter<com.anysoftkeyboard.ui.settings.LanguageItem>{    private Context mContext;    private final ArrayList<com.anysoftkeyboard.ui.settings.LanguageItem> origList = new ArrayList<com.anysoftkeyboard.ui.settings.LanguageItem>();    private final ArrayList<com.anysoftkeyboard.ui.settings.LanguageItem> filteredList = new ArrayList<com.anysoftkeyboard.ui.settings.LanguageItem>();    LanguageItemArrayAdapter(@NonNull Context context, @LayoutRes ArrayList<com.anysoftkeyboard.ui.settings.LanguageItem> list, ArrayList<com.anysoftkeyboard.ui.settings.LanguageItem> filteredList){        super(context, 0, filteredList);        mContext = context;        origList.addAll(list); //THIS WORKS WELL.         //THIS BREAKS EVERYTHING ->         //origlist = list;    }    public void fillData(){        filteredList.addAll(origList);        notifyDataSetChanged();    }    @Override    public View getView(int position,  View convertView, @NonNull ViewGroup parent) {        View listItem = convertView;        if (listItem == null)            listItem = LayoutInflater.from(mContext).inflate(R.layout.languages_list_row, parent, false);        com.anysoftkeyboard.ui.settings.LanguageItem currentItem = filteredList.get(position);        TextView title = listItem.findViewById(R.id.title);        title.setText(currentItem.getTitle());        return listItem;    }為什么原始列表會被編輯,而我只更改過濾后的列表?
查看完整描述

1 回答

?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

此代碼將相同的實例傳遞ArrayList給LanguageItemArrayAdapter


new LanguageItemArrayAdapter(getContext(), simpleLanguageItems, simpleLanguageItems)

要理解為什么add(…)和clear()in也修改同一個對象,您需要從源代碼ArrayAdapter中查看它們的實現。


public void clear() {

    synchronized (mLock) {

        if (mOriginalValues != null) {

            mOriginalValues.clear();

        } else {

            mObjects.clear();

        }

        …

    }

    …

}

clear()將修改mObjects和mOriginalValues(您會注意到其他函數也ArrayAdapter做同樣的事情)。您需要閱讀里面的代碼ArrayFilter以了解它們是如何修改的。


private class ArrayFilter extends Filter {

  /* 

  mObjects will contain only items fulfilling the filter conditions. 

  Original items are copied into mOriginalValues 

  */

}

查看構造函數(和構造函數鏈),您會發現您的類構造函數有


super(context, 0, filteredList);

最終會調用


private ArrayAdapter(@NonNull Context context, 

        @LayoutRes int resource,

        @IdRes int textViewResourceId, 

        @NonNull List<T> objects, 

        boolean objsFromResources) {

    …

    mObjects = objects;

    …

}

這允許ArrayAdapter修改您的simpleLanguageItems實例。


查看完整回答
反對 回復 2023-09-13
  • 1 回答
  • 0 關注
  • 86 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號