当在视图中滚动时,recyclerView不会调用onBindViewHolder。

3
这是我注意到的问题: 当开始时,数据项索引0、1、...、5在视图中显示。并且看到它们的onCreateViewHolder()和onBindViewHolder()被调用。 然后滚动出顶部项,并看到onCreateViewHolder()和onBindViewHolder()为索引6调用。 然后向下滚动,将项目索引0带回视图中。由于它没有被回收,所以不会调用onBindViewHolder()。
这是设计上的考虑,但有一种情况希望调用onBindViewHolder()。
当项索引0超出视图范围,并点击视图中的任何项时,希望更改项索引0的数据。当它滚动回视图时,希望显示数据的更改。但由于它的onBindView没有被调用,因此此行的数据更改未在UI中更新。
可以调用
notifyDataSetChanged() 

在数据更改后强制重新绘制列表。但结果并不好,因为视图项上有图像并且会闪烁。

尝试使用LayoutManager来获取视图以强制更新。问题是最佳时间知道索引0何时显示在LayoutManager的子视图中?

有什么建议吗? 谢谢!


2
尝试在适配器上使用notifyItemChanged(int position)。至于闪烁的问题,可能是使用notifyDataSetChanged()刷新整个数据集时的副作用。 - cziemba
谢谢!cziemba!它可能有效,但需要找出适配器中数据位置的位置,这在我的情况下并不直观,因为源数据在后台发生了变化。我发现使用public void onViewAttachedToWindow(ViewHolder viewHolder)有所帮助。因此,当项目滚动时,根据当前数据进行UI更新。 - lannyf
1个回答

8
我发现了

onViewAttachedToWindow(ViewHolder viewHolder)

这种情况下可以使用viewHolder。每当一个viewHolder在视口中显示时,就会被调用,因此可以根据当前数据的状态来更新视图。


谢谢!请看这里的例子:https://stackoverflow.com/questions/51911039/android-onbindviewholder-doesnt-call-when-i-scroll。 - CoolMind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接