我正在查看
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 和防御性副本
我认为答案很简单,您可以直接使用
AsyncListDiffer
,而不仅仅是通过ListAdapter
。 (事实上,当您由于某种原因无法从 ListAdapter
基类继承时,文档建议这样做。)
直接使用
AsyncListDiffer
时,您可以使用getCurrentList
(毕竟是公共方法)获取当前列表,并将其用于多种用途,而不仅仅是ListAdapter
中列出的用途。因此 AsyncListDiffer
始终维护此列表以通过 getCurrentList
进行检索,而不允许其他类修改底层列表。