RecycleView加载大量图片卡顿优化

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);
            }
        });

你可能感兴趣的:(android,性能优化,RecycleView)