Android RecyclerView适配器更改通知,DiffUtil和添加项目

时间:2016-11-01 16:16:35

标签: android android-recyclerview

我看到了一些奇怪的问题,并希望得到一些帮助来深究这一点。

该问题似乎与通知适配器有关数据更改以及如何设置基础数据直接相关。例如:

    mItems.clear();
    mItems.addAll(items);
    notifyDataSetChanged();
    // takes about 0.6 seconds to start onBind() for a list with 350ish items

onBindViewHolder()之后到达notifyDataSetChanged()需要花费更长的时间,而不是以下内容:

    mItems = items;
    notifyDataSetChanged();
    // takes negligible amout of time 

所以它可能与适配器认为数据变化的方式有关?在取消引用列表对象并为其分配时,对新对象的引用会更快地处理?但为什么呢?

DiffUtil也很明显。我有以下更新方法:

    if (getItems() != null && getItems().size() > 0) {
        DiffUtil.DiffResult diffResult = DiffUtil
                .calculateDiff(new MyClipsDiffUtil(getItems(), items));
        mItems.clear();
        Collections.addAll(items);
        diffResult.dispatchUpdatesTo(this);
    }

上述代码的运行速度比使用mItems = items;而不是clearaddAll慢。我也使用相同的列表,因此两个列表之间没有差异。

1 个答案:

答案 0 :(得分:0)

更改通知对数据集本身一无所知。

区别在于以前的部分。分配引用根本没有任何影响。调用clear()addAll()的复杂性更高,因此运行时间更长。但这很大程度上取决于您实际使用的List的类型。