我有一个带有项目列表的recyclerview,每个项目都有一个与用户有距离的文本视图。当用户身体移动时,我想更新项目的距离而不重新绘制列表。例如,假设用户站在三角形的中间,点为item1,2,3:
item1 5英尺
item2 10英尺
item3 15英尺
现在用户向item1移动2英尺 - 因此它变为:
item1 3英尺
item2 12英尺
item3 17英尺
但我不想重绘。换句话说,如果列表有5000个项目并且用户已向下滚动到项目3150然后更改了他的位置,我不想做像notifydatasetchanged这样的事情,然后重新绘制整个列表并向用户显示来自位置0.我想改为仅动态地改变列表中每个项目的距离文本,并且就用户而言,一切都是相同的,只有距离已经改变。
这样做的最佳方式是什么?
答案 0 :(得分:2)
首先,你不能卵形列表重绘,这就是更新UI的工作方式,但请放心,周围有缓存来处理小的变化。
关于项目,如果您致电notifyDataSetChanged
,RecyclerView将仅重新绑定可见视图。这将是您支付的成本,适配器的实际大小(在您的示例中为5000)是无关紧要的。
如果您希望RecyclerView仅更新已更改的视图,则必须致电notifyItemChanged(position)
。在这种情况下,RecyclerView将仅重新绑定已更改的项目,并且仅在它们可见时才重新绑定。
如果您有稳定的ID,即使您致电notifyDataSetChanged
,如果您的适配器具有稳定的ID,RecyclerView将使用当前代表该位置项目的现有视图持有者调用onBindViewHolder
。在ViewHolder中保留对项目的引用。调用onBind
时,请检查它是否是同一项目,并仅更新必要的部分。