Android RecyclerView上拉加载新增条目后自动滚动到顶部如何解决
RecyclerView上拉加载后自动回滚到顶部的解决方法
核心原因
该问题几乎都是由适配器全局刷新导致:你在addAll方法中如果调用了notifyDataSetChanged(),会触发RecyclerView全量重绘,直接丢失当前滚动位置。其次也可能是动画适配器的配置问题导致滚动偏移。
1. 优先修改适配器的局部刷新逻辑
将MyAdapter2中的addAll方法改为局部刷新,仅通知新增的条目插入,原有条目不会重绘,滚动位置自然保持不变:
// MyAdapter2类中的addAll方法修改如下 public void addAll(List<Product> newProductList) { int startInsertPosition = items_products.size(); items_products.addAll(newProductList); // 仅刷新新增的条目范围,不要调用notifyDataSetChanged() notifyItemRangeInserted(startInsertPosition, newProductList.size()); }
2. 修正动画适配器配置
你使用的ScaleInAnimationAdapter默认会在每次数据刷新时重新执行所有可见条目的动画,容易触发滚动位置偏移,添加配置仅让首次加载时展示动画即可:
ScaleInAnimationAdapter scaldeAdapter = new ScaleInAnimationAdapter(productAdaper); scaldeAdapter.setDuration(300); // 新增这行,仅首次渲染时执行动画 scaldeAdapter.setFirstOnly(true); rc_products.setAdapter(scaldeAdapter);
3. 兜底位置恢复方案
如果上述方案仍未解决问题,可以在新增数据前后手动锁定滚动位置:
// 新增数据前记录当前滚动位置 int firstVisiblePos = mLayoutManager.findFirstVisibleItemPosition(); View firstVisibleChild = rc_products.getChildAt(0); int offset = firstVisibleChild == null ? 0 : firstVisibleChild.getTop(); // 执行新增数据逻辑 productAdaper.addAll(items_products); // 恢复原来的滚动位置 mLayoutManager.scrollToPositionWithOffset(firstVisiblePos, offset);
内容的提问来源于stack exchange,提问作者Navid Abutorab
相关产品推荐
相关产品推荐

