1. 程式人生 > >Android 滾動RecyclerView加載圖片時的流暢度優化

Android 滾動RecyclerView加載圖片時的流暢度優化

進行 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> {
    ……
    @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);

Android 滾動RecyclerView加載圖片時的流暢度優化