Android 在不重新绘制整个列表的情况下更改所有项目中 recyclerview 中的文本视图
Android change textview in recyclerview in all items without redrawing the entire list
我有一个带有项目列表的回收视图,除其他外,每个项目都有一个与用户有一定距离的文本视图。当用户四处移动时,我想在不重新绘制列表的情况下更新项目的距离。例如,假设用户站在三角形的中间,点为 item1,2,3:
item1 5英尺
item2 10英尺
item3 15英尺
现在用户向项目 1 移动了 2 英尺 - 因此它变为:
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
时,检查是否是同一项,只更新必要的部分。
我有一个带有项目列表的回收视图,除其他外,每个项目都有一个与用户有一定距离的文本视图。当用户四处移动时,我想在不重新绘制列表的情况下更新项目的距离。例如,假设用户站在三角形的中间,点为 item1,2,3:
item1 5英尺
item2 10英尺
item3 15英尺
现在用户向项目 1 移动了 2 英尺 - 因此它变为:
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
时,检查是否是同一项,只更新必要的部分。