Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android在recyclerview中更改所有项目的文本视图,而不重新绘制整个列表_Java_Android_Android Recyclerview - Fatal编程技术网

Java Android在recyclerview中更改所有项目的文本视图,而不重新绘制整个列表

Java Android在recyclerview中更改所有项目的文本视图,而不重新绘制整个列表,java,android,android-recyclerview,Java,Android,Android Recyclerview,我有一个带有项目列表的recyclerview,每个项目都有一个与用户保持一定距离的文本视图。当用户实际移动时,我希望在不重新绘制列表的情况下更新项目的距离。例如,假设用户正站在三角形的中间,点为It1,1,3: 项目1 5英尺 项目2 10英尺 项目3 15英尺 现在,用户向item1移动2英尺-因此更改为: 项目1 3英尺 项目2 12英尺 项目3 17英尺 但我不想重画。换句话说,如果列表中有5000个项目,并且用户向下滚动到项目3150,然后更改了位置,那么我不想执行类似notifyda

我有一个带有项目列表的recyclerview,每个项目都有一个与用户保持一定距离的文本视图。当用户实际移动时,我希望在不重新绘制列表的情况下更新项目的距离。例如,假设用户正站在三角形的中间,点为It1,1,3:

项目1 5英尺

项目2 10英尺

项目3 15英尺

现在,用户向item1移动2英尺-因此更改为:

项目1 3英尺

项目2 12英尺

项目3 17英尺

但我不想重画。换句话说,如果列表中有5000个项目,并且用户向下滚动到项目3150,然后更改了位置,那么我不想执行类似notifydatasetchanged的操作,这将重新绘制整个列表,并向用户显示从位置0开始的所有内容。相反,我只想动态更改列表中每个项目的距离文本,就用户而言,一切都是一样的,只有距离发生了更改


这样做的最佳方式是什么

首先,您不能重新绘制ovoid列表,这正是更新UI的工作方式,但请放心,到处都有缓存来处理小的更改

关于项目,如果调用
notifyDataSetChanged
RecyclerView,则只会重新绑定可见视图。因此,这就是您要支付的成本,适配器的实际大小(在您的示例中为5000)无关紧要

如果希望RecyclerView仅更新已更改的视图,则必须调用
notifyItemChanged(position)
。在这种情况下,RecyclerView将仅重新绑定已更改的项目,并且仅当这些项目可见时


如果您有稳定的ID,即使您调用了
notifyDataSetChanged
,如果您的适配器有稳定的ID,RecycleView将使用当前表示该位置项的现有视图保持架调用
onBindViewHolder
。在ViewHolder中保留对项目的引用。调用
onBind
时,检查它是否是同一项,只更新必要的部分。

更改适配器中的数据并调用notifyItemChanged,它就可以工作,不需要任何解决方法,如更新物理数据View@pskink-谢谢你的答复。你的意思是,我应该遍历我的数据集,在更新每个元素后,我应该调用notifyitemchanged,因为数据集中项目的位置与recyclerview中项目的位置相同?如果在同一时间只更改了几个项目,那么cal Now notifyitemchanged,如果他们中的大多数人都换了电话notifyDataSetChanged@pskink-不幸的是,每次位置改变时,它们都会改变。我的问题是,我不想让列表重画,因为列表中的某个地方的用户突然“跳”回第0条,因为这个重画。不会有“整个列表重绘”,也没有“跳跃”。