Android 滾動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中的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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM