AsyncListDiffer 实现。 mReadOnlyList 如何工作?

问题描述 投票:0回答:1

我正在查看

AsyncListDiffer
在 Android 中的实现,但我陷入了困境。
mReadOnlyList
有什么用?

public class AsyncListDiffer<T> {
    private List<T> mList;        

    @NonNull
    private List<T> mReadOnlyList = Collections.emptyList();

    @NonNull
    public List<T> getCurrentList() {
        return mReadOnlyList;
    }

    public void submitList(final List<T> newList) {
        ...
        if (newList == null) {

            mList = null;
            mReadOnlyList = Collections.emptyList();
            return;
        }

        if (mList == null) {
            mList = newList;
            mReadOnlyList = Collections.unmodifiableList(newList);
            return;
        }
    }

    private void latchList(@NonNull List<T> newList, @NonNull DiffUtil.DiffResult diffResult) {
        mList = newList;
        mReadOnlyList = Collections.unmodifiableList(newList);
        diffResult.dispatchUpdatesTo(mUpdateCallback);
    }
}

并且

getCurrentList()
只能访问

public abstract class ListAdapter<T, VH extends RecyclerView.ViewHolder>
        extends RecyclerView.Adapter<VH> {
    ...
    private final AsyncListDiffer<T> mHelper;

    protected T getItem(int position) {
        return mHelper.getCurrentList().get(position);
    }

    public int getItemCount() {
        return mHelper.getCurrentList().size();
    }
}

为什么他们不简单地在

getItem(int position)
中创建 2 个方法,如
getItemCount()
AsyncListDiffer
而不创建
mReadOnlyList

因为我看到当
newList
改变时,
mReadOnlyList
也会改变 Collections.unmodifyingList 和防御性副本

android listadapter
1个回答
0
投票

我认为答案很简单,您可以直接使用

AsyncListDiffer
,而不仅仅是通过
ListAdapter
。 (事实上,当您由于某种原因无法从
ListAdapter
基类继承时,文档建议这样做。)

直接使用

AsyncListDiffer
时,您可以使用
getCurrentList
(毕竟是公共方法)获取当前列表,并将其用于多种用途,而不仅仅是
ListAdapter
中列出的用途。因此
AsyncListDiffer
始终维护此列表以通过
getCurrentList
进行检索,而不允许其他类修改底层列表。

© www.soinside.com 2019 - 2024. All rights reserved.