實現:使用onScrollStateChanged回調檢測滾動狀態,並在RecyclerViewAdapter內部設置類似isScrolling的狀態值來控制網絡圖片的加載。
上代碼:
// BaseAdapter中添加如下代碼
public abstract class BaseRecyclerViewAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
……
protected boolean isScrolling = false;
……
public void setScrolling(boolean scrolling) {
isScrolling = scrolling;
}
}
具體的子Adapter實現:
//在子Adapter中的onBindViewHolder()裏進行控制
public class SubRecyclerViewAdapter extends BaseRecyclerViewAdapter<DataGuardRanking> {
……
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
RecyclerViewHolder holder = (RecyclerViewHolder) viewHolder;
……
if (!TextUtils.isEmpty(data.getAvatarUrl()) && !isScrolling) {
// 這裏可以用Glide等網絡圖片加載庫
} else {
holder.avatarImg.setImageResource(佔位圖本地資源);
}
super.onBindViewHolder(holder, position);
}
}
在UI層進行監聽:
// 外部對RecyclerView設置監聽
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
// 查看源碼可知State有三種狀態:SCROLL_STATE_IDLE(靜止)、SCROLL_STATE_DRAGGING(上升)、SCROLL_STATE_SETTLING(下落)
if (newState == SCROLL_STATE_IDLE) { // 滾動靜止時才加載圖片資源,極大提升流暢度
mRecyclerViewAdapter.setScrolling(false);
mRecyclerViewAdapter.notifyDataSetChanged(); // notify調用後onBindViewHolder會響應調用
} else
mRecyclerViewAdapter.setScrolling(true);
super.onScrollStateChanged(recyclerView, newState);
}
});
mRecyclerView.setAdapter(mRecyclerViewAdapter);