为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 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 关注
  • 66 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信