问题分析:
传统recycleview滚到到底部方式scrollToPosition(lastpositon),只能定位到最后一条数据的顶部。由于数据过长,无法滚动到最底部。
问了下deepseek,给了个方案:
private void recyclerViewScrollToBottom() {
final int itemCount = chatListAdapter.getItemCount();
if (itemCount == 0) return; // 处理空数据情况
final LinearLayoutManager layoutManager = (LinearLayoutManager) viewBinding.recyclerView.getLayoutManager();
if (layoutManager == null) return;
final int lastPosition = itemCount - 1;
// 使用标志位确保一次性滚动到底部
layoutManager.scrollToPositionWithOffset(lastPosition, 0);
viewBinding.recyclerView.post(() -> {
// 添加高度有效性检查
final int recyclerHeight = viewBinding.recyclerView.getHeight();
if (recyclerHeight == 0) return;
final View lastItem = layoutManager.findViewByPosition(lastPosition);
if (lastItem == null) {
// 如果视图未加载,改用保证性滚动方案
viewBinding.recyclerView.smoothScrollToPosition(lastPosition);
return;
}
final int bottomOffset = lastItem.getBottom() - recyclerHeight;
if (bottomOffset > 0) {
// 取消可能存在的未完成滚动
viewBinding.recyclerView.stopScroll();
viewBinding.recyclerView.smoothScrollBy(0, bottomOffset);
}
});
}
此方法滚动后会出现抖动问题,因为先定位到最后一条顶部,在滚动到底部,会有一个滚动效果。如果数据刷新太频繁、就会出现抖动现象。
解决方案:
private void recyclerViewScrollToBottom() {
int itemCount = chatListAdapter.getItemCount();
if (itemCount == 0)
return;
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setStackFromEnd(true);
// linearLayoutManager.scrollToPositionWithOffset(chatListAdapter.getItemCount() - 1, Integer.MIN_VALUE);
viewBinding.recyclerView.setLayoutManager(linearLayoutManager);
}
核心代码:
linearLayoutManager.setStackFromEnd(true);