RecyclerView流暢度優化點

實現:使用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);

轉自:https://www.cnblogs.com/zhujiabin/p/8125578.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章