我有一个带有项目列表的recyclerview,每个项目除其他外还有一个与用户保持一定距离的textview。当用户身体四处走动时,我想在不重新绘制列表的情况下更新项目的距离。例如,假设用户站在三角形的中间,点为item1,2,3:
item1 5英尺
item2 10英尺
item3 15英尺
现在用户将2英尺移向了item1-因此更改为:
item1 3英尺
item2 12英尺
item3 17英尺
但我不想重画。换句话说,如果列表中有5000个项目,并且用户向下滚动到项目3150,然后更改了他的位置,则我不想执行诸如notifydatasetchanged之类的操作,该操作将重绘整个列表并向用户显示位置0的所有内容我想改为动态地仅更改列表中每个项目的距离文本,并且就用户而言,一切都相同,并且只有距离发生了变化。
最好的方法是什么?
首先,您不能避免列表重绘,这就是更新UI的工作方式,但是请放心,到处都有缓存来处理小的更改。
关于项目,如果您调用notifyDataSetChanged
RecyclerView,将仅重新绑定可见视图。因此,这就是您要支付的费用,适配器的实际大小(示例中为5000)无关紧要。
如果您希望RecyclerView仅更新已更改的视图,则必须调用notifyItemChanged(position)
。在这种情况下,RecyclerView将仅在更改的项目可见的情况下重新绑定它们。
如果您具有稳定的ID,即使调用notifyDataSetChanged
,如果适配器具有稳定的ID,RecyclerView也会onBindViewHolder
使用当前表示该位置项目的现有视图持有器进行调用。在ViewHolder中保留对您的项目的引用。当onBind
被调用时,检查它是否是同一个项目,仅更新必要的部分。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句