RecyclerView 캐시 원리

RecyclerView 캐시 원리

네 일반적으로 고려 RecyclerView 캐시, 캐시 RecyclerView 클래스는 방법 입구 휴지통에 의해이 달성된다 :

public View getViewForPosition(int position) {
    return getViewForPosition(position, false);
}

컨텐츠 캐싱은 ViewHolder, 로컬 캐시, 몇 목록 리사이클의이다 :

final ArrayList<ViewHolder> mAttachedScrap = new ArrayList<ViewHolder>();
private ArrayList<ViewHolder> mChangedScrap = null;

final ArrayList<ViewHolder> mCachedViews = new ArrayList<ViewHolder>();

private final List<ViewHolder>
        mUnmodifiableAttachedScrap = Collections.unmodifiableList(mAttachedScrap);

private int mViewCacheMax = DEFAULT_CACHE_SIZE;

private RecycledViewPool mRecyclerPool;

private ViewCacheExtension mViewCacheExtension;

private static final int DEFAULT_CACHE_SIZE = 2;
첫 번째 레벨 캐시

mAttachedScrap는 다음의 화면에 표시 ViewHolder 항목에 대한 캐시
화면에서 홀더 또는 ViewHolder는 시간을 변경 로컬 캐시 할 수있는 일의 의미를 이해하지 않았다 mChangedScrap를

두 번째 레벨 캐시

mCachedViews은 : 항목이 오프 화면, 목록의 기본 크기는 2 그릴

세 번째 레벨 캐시

mViewCacheExtension : 사용자 지정 캐시, RecyclerView의 기본은 자신을 구현하는 개발자를 떠나 달성되지 않는다

네 번째 레벨 캐시

mRecyclerPool : mCachedViews 수가 상한에 도달 한 후, mRecyclerPool에 의지 ViewHolder. mRecyclerPool이 수준 ViewHolder를 입력 SparseArray 캐시에 사용 :

static class ScrapData {
	final ArrayList<ViewHolder> mScrapHeap = new ArrayList<>();
	int mMaxScrap = DEFAULT_MAX_SCRAP;
	long mCreateRunningAverageNs = 0;
	long mBindRunningAverageNs = 0;
}
SparseArray<ScrapData> mScrap = new SparseArray<>();

당신이 ViewHolder에이 계층을하게하지 않도록 노력 때문에, 데이터 바인딩 onBindViewHolder 호출 할 필요가 있도록하지만,뿐만 아니라 ViewHolder 데이터의 mRecyclerPool가 ViewHolder에 해당 오프 재설정하는 새로운 히트가된다

캐시 최적화

ViewHolder의 RecyclerPool이 재설정됩니다 입력, 그것은 성능을 비용, 그래서 효율성의 관점에서, bindViewHolder를 다시 실행합니다.

그래서이 계층 캐시를 입력하지 않도록하기 위해, 세 번째 층은 사용자 정의 mViewCacheExtension이다에서 사용자 지정 캐시 구현 될 수있다. 해당보기의 viewType SparseArray 자신의 유지 보수 여기. 이 때문에 많은 종류 납 홀더 재건을 방지 할 수 있습니다.

public abstract static class ViewCacheExtension {
    @Nullable
    public abstract View getViewForPositionAndType(@NonNull Recycler recycler, int position,
                int type);
    }

의 LayoutParams이의보고가 아니라 ViewHolder보다는보기의 getViewForPositionAndType 반환을 참고, 다음 ViewHolder을 얻을 것이다.

###### 두 번째 당신이 필요로하는 금액을 변경, 캐시 mCachedViews의 수를 늘릴 수 있습니다

게시 17 개 원래 기사 · 원 찬양 12 ·은 10000 +를 볼

추천

출처blog.csdn.net/qq_24295537/article/details/105026804