You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 15:24:03