我有一个recyclelerview,在加载数据之前显示“无内容”布局。 我收到数据后,我做了:
mItems.addAll(newItems);
notifyDataSetChanged();
之后一切都很好,除了最后一个元素仍然是“无内容”布局。我检查了行为,我知道RecyclerView使用旧的布局。问题是我需要使用不同的布局。而且,为什么最后位置的旧布局而不是最初的布局? 如何强制RecyclerView重新创建ViewHolder?
答案 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)