RecycleView加载大量图片卡顿优化

在RecycleView实现相册功能遇到滑动卡顿时,可以监听其滑动状态。当滑动时暂停图片加载,显示占位图;停止滑动后,通过notifyItemRangeChanged刷新视图加载图片。这种方式避免了全局网络库的影响,提升了用户体验。

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

RecycleView实现类似相册功能的时候,在加载大量图片的时候,快速滑动的时候能感到明显的卡顿,因此需要我们根据滑动状态去做优化。

一、解决思路

我们可以监听RecycleView滑动状态,当处于滑动状态时,不进行图片的加载,当滑动停止时才进行图片的加载。网上解决方法基本都是这样的,但是很多方法是调用网络框架暂停请求加载来处理的,个人认为这种方法会影响到全局的网络加载库,所以应该采用notifyItemRangeChanged方式,去通知viewholder重新加载图片。

二、代码实现

在ViewHolder里增加一个RecycleView滑动标识,如果处于滑动状态的话,就不要去加载图片,而是给imageview一个占位图

        //此处在viewholder setData方法里处理
        if (isScrolling) {
            //滚动状态时,需要清空tag 并给imageview一个占位图
            imageView.setTag(null);
            imageView.setImageResource(getResources().getDrawable(R.drawable.btn_forbid));
            return;
        } else {
            //之前没有加载过了数据直接 return
            if (imageView.getTag() instanceof String && TextUtils.equals(imageUrl,(String)imageView.getTag())) {
                return;
            }
        }
        imageView.setTag(imageUrl);
        //此处调用你自己的网络库去加载imageUrl

给RecycleView设置滑动监听,将滑动状态设置给adapter,当不在滑动时,需要手动调用notifyItemRangeChanged去通知adapter刷新数据

        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                //停止滑动了
                if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                    mAdapter.setScrolling(false);
                    int firstVisiblePosition = mGridLayoutManager.findFirstVisibleItemPosition();
                    int lastVisibleItemPosition = mGridLayoutManager.findLastVisibleItemPosition();
                    mAdapter.notifyItemRangeChanged(firstVisiblePosition, lastVisibleItemPosition);
                }
                //滑动状态
                if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
                    //滑动
                    mAdapter.setScrolling(true);
                }
            }

            @Override
            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
            }
        });
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值