RecycleView實現類似相冊功能的時候,在加載大量圖片的時候,快速滑動的時候能感到明顯的卡頓,因此需要我們根據滑動狀態(tài)去做優(yōu)化。
一、解決思路
我們可以監(jiān)聽RecycleView滑動狀態(tài),當處于滑動狀態(tài)時,不進行圖片的加載,當滑動停止時才進行圖片的加載。網上解決方法基本都是這樣的,但是很多方法是調用網絡框架暫停請求加載來處理的,個人認為這種方法會影響到全局的網絡加載庫,所以應該采用notifyItemRangeChanged方式,去通知viewholder重新加載圖片。
二、代碼實現
在ViewHolder里增加一個RecycleView滑動標識,如果處于滑動狀態(tài)的話,就不要去加載圖片,而是給imageview一個占位圖文章來源:http://www.zghlxwxcb.cn/news/detail-713218.html
//此處在viewholder setData方法里處理
if (isScrolling) {
//滾動狀態(tài)時,需要清空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設置滑動監(jiān)聽,將滑動狀態(tài)設置給adapter,當不在滑動時,需要手動調用notifyItemRangeChanged去通知adapter刷新數據文章來源地址http://www.zghlxwxcb.cn/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);
}
//滑動狀態(tài)
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加載大量圖片卡頓優(yōu)化的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!