Android 滾動RecyclerView加載圖片時的流暢度優化
阿新 • • 發佈:2017-12-27
進行 stat pty clas adapter boolean idl chang set
實現:使用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中的onBind裏進行控制 public class SubRecyclerViewAdapter extends BaseRecyclerViewAdapter<DataGuardRanking> { …… @Overridepublic 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);
Android 滾動RecyclerView加載圖片時的流暢度優化