RecyclerView调用smoothScrollToPosition定位最后一项异常如何解决?
RecyclerView调用smoothScrollToPosition滚动到末尾不生效的解决方案
- 数据更新后立刻调用滚动导致未完成布局计算
大部分失效场景都是刚调用notifyDataSetChanged/notifyItemInserted等数据更新方法后,立刻执行滚动逻辑,此时RecyclerView还未完成新数据的布局计算,无法识别到最新的最后一项位置。
修复方法:将滚动逻辑post到RecyclerView的消息队列,等待布局完成后执行:// Java写法 recyclerView.post(() -> { recyclerView.smoothScrollToPosition(adapter.getItemCount() - 1); });// Kotlin写法 recyclerView.post { recyclerView.smoothScrollToPosition(adapter.itemCount - 1) } - 开启了reverseLayout配置
如果你为了实现聊天类倒序布局效果,给LayoutManager设置了reverseLayout = true,此时列表的首位对应逻辑上的最后一条数据,直接滚动到0位置即可:recyclerView.smoothScrollToPosition(0) - RecyclerView高度配置为wrap_content导致测量异常
当RecyclerView高度设为wrap_content时,数据更新后的重测量过程会干扰滚动位置计算,建议优先将RecyclerView高度设为match_parent,如果必须使用wrap_content,可在布局完成监听中执行滚动逻辑。 - 优先使用精准的数据更新通知
避免全局调用notifyDataSetChanged,如果是新增了最后一条数据,调用notifyItemInserted(adapter.itemCount - 1)后再执行滚动,布局计算的准确性更高。 - 嵌套滚动场景下父布局拦截事件
如果RecyclerView嵌套在NestedScrollView等可滚动容器内,RecyclerView自身的滚动方法会失效,需要调用父容器的滚动方法:nestedScrollView.post { nestedScrollView.smoothScrollTo(0, nestedScrollView.getChildAt(0).height) }
内容的提问来源于stack exchange,提问作者Nedir Sapargylyjov
相关产品推荐
相关产品推荐

