当数据完全更改时,RecyclerView使用旧的ViewHolder

时间:2017-03-29 16:02:58

标签: android android-recyclerview recycler-adapter

我有一个recyclelerview,在加载数据之前显示“无内容”布局。 我收到数据后,我做了:

    mItems.addAll(newItems);
    notifyDataSetChanged();

之后一切都很好,除了最后一个元素仍然是“无内容”布局。我检查了行为,我知道RecyclerView使用旧的布局。问题是我需要使用不同的布局。而且,为什么最后位置的旧布局而不是最初的布局? 如何强制RecyclerView重新创建ViewHolder?

3 个答案:

答案 0 :(得分:0)

你拨打notifyItemRangeRemoved(0, end),现在适配器的大小为0 然后你调用notifyItemRangeChanged(0, end),但适配器是空的,那么有什么可以改变?这会导致状态不一致,并可能导致不良行为。

最佳解决方案是更新项目,然后致电notifyDataSetChanged(),因为整个数据集已经更改。
其他选项是先使用旧尺寸调用notifyItemRangeRemoved,然后使用新尺寸调用notifyItemRangeInserted。因为此时,您不是更改已删除的项目,而是添加新项目。

答案 1 :(得分:0)

所以,在今天进行了一些阅读后,我发现修复此问题的方法是在getViewType中为视图“无内容视图”创建另一种类型。所以它的工作方式如下:第一次onCreateViewHolder为空内容创建viewHolder。下次加载数据时getViewType会返回不同的视图类型,onCreateViewHolder会创建不同的视图持有者。

答案 2 :(得分:0)

我为我解决了这个问题! 覆盖getItemViewType(position: Int): Int = viewType。 覆盖RecyclerView.Adapter.getItemId(position: Int) = items[position].uniqueId。 现在,当您更改数据项时,它们具有不同的ID,但是RecyclerView不知道,旧项目会消失并为它们保留持有者,同时,持有者需要新的项目,RecyclerView会创建新的项目,并且由于默认情况下,池的最大大小为5。将其更改为recyclerView.recycledViewPool.setMaxRecycledViews(viewType, x),其中x是最佳限制,例如我的情况是12。 要对此进行检查,您可以设置最大大小100,一次次更改数据项并选中recyclerView.recycledViewPool.getRecycledViewCount(viewType)