提问人:Tan Telephone 提问时间:11/13/2023 更新时间:11/15/2023 访问量:16
android RecyclerView 在滚动时不跟随手指,如果项目在 notifyItemChanged() 调用时动态扩展
android RecyclerView not following finger when scrolling if items dynamically expand on notifyItemChanged() calls
问:
我使用 notifyItemChanged() 来部分更新项目,当图像准备就绪时,它们将显示在项目中。
请在这里查看我的屏幕录像如您所见,向下滚动时,上面的项目会动态扩展,并将下面的项目推出屏幕的下边框。
我该如何解决这个问题?
答:
我不知道你的架构或要求,但让我提出一个建议, 根据我的理解,可以有两种类型的帖子。 一个有图像,一个没有图像,所以在你的适配器数据类中保留一个键,如果图像不存在,则通过imageCount键,如果它只是一个普通的帖子,则将其设为0,如果有图像渲染一个默认的加载图像,下载图像后只需更新默认图像。 您甚至可以在图像下载失败时提供重试功能。
评论
在深入研究了 RecyclerView 的源码很久之后,我发现有一个概念叫做“锚点”,当 RecyclerView 在制作动画时,它会尽量将“锚点”保持在动画前后的位置。
“锚点”由某种算法确定,通常是第一个可见的子项。这就解释了为什么上部子项的扩展会将下部子项推离屏幕的下限,因为 RecyclerView 的上部可见部分已被定位点“固定”起来。
所以这里有一个相反的解决方案:将锚点设置在最后一个可见的子项上,然后子项的展开方向就会上升。
设置定位点的最简单方法是设置焦点,当 RecyclerView 尝试查找“定位点”子项时,焦点子项优先。
一种直观的解决方案可能是在 RV 向上滚动时将焦点设置为第一个可见子项,并在 RV 向下滚动时将焦点设置为最后一个可见子项。这可以通过使用与 和 组合在一起的滚动侦听器来完成。findFirstVisibleItemPosition()
findLastVisibleItemPosition()
requestFocus()
评论