企业门户网站建设方案文档外包公司的优势和劣势
问题分析:
传统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);