第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

為什么 ArrayAdapter 中的原始數(shù)組項(xiàng)也會被刪除?

為什么 ArrayAdapter 中的原始數(shù)組項(xiàng)也會被刪除?

侃侃無極 2023-09-13 15:38:50
我通過適配器的 add() 和 clear() 從適配器對象中添加和刪除值,它們正在刪除元素并將其添加到列表中,該列表不會從適配器內(nèi)的任何位置引用。我有原始列表,它位于適配器外部,并具有從適配器內(nèi)部到不更改外部引用的引用,而在適配器內(nèi)部,我僅引用一個(gè)新列表,我使用舊的原始列表填充了相同的對象。新名單為何會影響舊名單?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貢獻(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í)例。


查看完整回答
反對 回復(fù) 2023-09-13
  • 1 回答
  • 0 關(guān)注
  • 93 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號