RecycleView实现类似相册功能的时候,在加载大量图片的时候,快速滑动的时候能感到明显的卡顿,因此需要我们根据滑动状态去做优化。
一、解决思路
我们可以监听RecycleView滑动状态,当处于滑动状态时,不进行图片的加载,当滑动停止时才进行图片的加载。网上解决方法基本都是这样的,但是很多方法是调用网络框架暂停请求加载来处理的,个人认为这种方法会影响到全局的网络加载库,所以应该采用notifyItemRangeChanged方式,去通知viewholder重新加载图片。
二、代码实现
在ViewHolder里增加一个RecycleView滑动标识,如果处于滑动状态的话,就不要去加载图片,而是给imageview一个占位图文章来源:https://www.toymoban.com/news/detail-713218.html
//此处在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刷新数据文章来源地址https://www.toymoban.com/news/detail-713218.html
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);
}
});
到了这里,关于RecycleView加载大量图片卡顿优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!