RecycleView底部刷新闪屏问题解决

本文介绍如何使用NestedScrollView监听滚动事件实现加载更多功能,并探讨RecyclerView适配器的高效刷新策略,避免全量刷新导致的界面闪烁问题,提供局部刷新的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用NestedScrollView,当拉到底部的时候去请求服务器加载更多

mNestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
            @Override
            public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
                //滑到底加载更多
                if(scrollY == (v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight())){
                    presenter.nextPageData();
                }
            }
        });

如果请求成功,会异步返回一组数据值,然后把这组数据添加到之前集合的后面

if(mDailyEntity.getIssueList()!=null && mDailyEntity.getIssueList().size()>=1){
                mItemEntityList.addAll(mDailyEntity.getIssueList().get(0).getItemList());
            }

当刷新数据界面的时候,简单粗暴地调用适配器的notifyDataSetChanged()方法,会出现闪屏的问题,这是由于notifyDataSetChanged()会导致整个recycleView重新布局和绘制。
这时候我们调用notifyItemInserted(int posistion)这个会很好地解决这个问题。notifyItemInserted(int posistion)只会局部刷新后面添加的子项。

final int lastsize = mItemEntityList.size();  //在向集合添加数据之前记录数据源集合最后的位置
if(mDailyEntity.getIssueList()!=null && mDailyEntity.getIssueList().size()>=1){
                mItemEntityList.addAll(mDailyEntity.getIssueList().get(0).getItemList());
            }
mDailyAdapter.notifyItemInserted(lastsize);

需要注意一点,如果添加的子项不是在最后,而是插入在数据的中间位置,那么插入之后,原来后面位置的数据position位置是不会变化的,需要手动再刷新一下数据的position位置,如下示例

public void addData(int pos){

    mDatas.add(pos,'Insert One');

    notifyItemInserted(pos);

    // 加入如下代码保证position的位置正确性

    if (pos != mDatas.size() - 1) {

        notifyItemRangeChanged(pos, mDatas.size() - pos);

    }

}



public void deleteData(int pos){

    mDatas.remove(pos);

    notifyItemRemoved(pos);

    // 加入如下代码保证position的位置正确性

    if (pos != mDatas.size() - 1) {

        notifyItemRangeChanged(pos, mDatas.size() - pos);

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值