sourcetip

크기가 고정된 RecyclerView 집합 이해

fileupload 2023. 8. 11. 22:31
반응형

크기가 고정된 RecyclerView 집합 이해

제가 이해하는데 어려움을 겪고 있습니다.setHasFixedSize()의 크 일 때 최 적 사 에 있 알 습 니 고 다 것 로 으 는 되 기 용 화 ▁the ▁of ▁size ▁when ▁optim ▁i 니 습 있 다 ▁for 의 ▁used ▁is ▁that 크 기 알 ▁it ▁knowRecyclerView문서에서 변경되지 않습니다.

그런데 그게 무슨 뜻입니까? a 부분의일인경우적aListView거의 항상 고정된 크기를 가지고 있습니다.어떤 경우에 그것은 고정된 크기가 아닐 것입니까?화면상에서 차지하는 실제 부동산이 콘텐츠와 함께 성장한다는 뜻입니까?

매우 단순화된 RecyclerView 버전의 특징은 다음과 같습니다.

void onItemsInsertedOrRemoved() {
   if (hasFixedSize) layoutChildren();
   else requestLayout();
}

링크는 전화를 거는 이유를 설명합니다.requestLayout비쌀 수도 있습니다.기본적으로 항목을 삽입, 이동 또는 제거할 때마다 RecyclerView의 크기(가로 및 높이)가 변경되고 보기 계층 구조의 다른 보기의 크기도 변경될 수 있습니다.항목을 자주 추가하거나 제거하는 경우 특히 문제가 됩니다.

위해 설을통불레방패스지이웃아를 합니다.setHasFixedSize어댑터의 내용을 변경해도 어댑터의 높이나 너비가 변경되지 않을 때 true입니다.


업데이트: 이 방법이 실제로 수행하는 작업을 더 잘 설명하도록 JavaDoc이 업데이트되었습니다.

RecyclerView는 RecyclerView의 크기가 어댑터 내용의 영향을 받지 않는다는 것을 미리 알 수 있는 경우 몇 가지 최적화를 수행할 수 있습니다.RecyclerView는 다른 요인(예: 상위 항목의 크기)을 기준으로 크기를 변경할 수 있지만 이 크기 계산은 하위 항목의 크기나 어댑터의 내용(어댑터의 항목 수 제외)에 따라 달라질 수 없습니다.

RecyclerView 사용이 이 범주에 해당하는 경우 이 범주를 {@codetrue}(으)로 설정합니다.그러면 RecyclerView에서 어댑터 내용이 변경될 때 전체 레이아웃이 무효화되는 것을 방지할 수 있습니다.

@param은 어댑터 변경 사항이 RecyclerView 크기에 영향을 줄 수 없는 경우 FixedSize true를 갖습니다.

간단한 설명

에 저희가 저희에가가 있으면.RecyclerView와 함께match_parent높이/폭으로 추가해야 합니다.setHasFixedSize(true)의 부터.RecyclerView항목 자체는 항목 삽입 또는 삭제를 변경하지 않습니다.

setHasFixedSize는 다음과 같은 RecyclerView가 있는 경우 false여야 합니다.wrap_content어댑터에 의해 삽입된 각 요소가 크기를 변경할 수 있기 때문에 높이/폭으로RecyclerView항목에 때문에/제된항따크달기다니라집가라deleted목삽에▁depending▁of▁size▁the.RecyclerView항목을 추가/삭제할 때마다 다릅니다.

좀 더 명확하게 말하자면, 우리가 고정된 너비/높이를 사용할 경우

<android.support.v7.widget.RecyclerView
    android:id="@+id/my_recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

우리는 사용할 수 있습니다.my_recycler_view.setHasFixedSize(true)

그러면 우리가 고정된 너비/높이를 사용하지 않는다면.

<android.support.v7.widget.RecyclerView
        android:id="@+id/my_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

우리는 사용해야 합니다.my_recycler_view.setHasFixedSize(false) 이래wrap_content이나 높이는 우리의 크기를 바꿀 수 있습니다.RecyclerView.

에 대해 이야기할 때RecyclerView setHasFixedSize는 그 그 안에 있는 원소의 것입니다.View그 자체로또한 이 크기는 내부의 항목이 서로 다른 경우에도 결정되므로, 한 항목이 재활용 보기 내의 다른 항목보다 큰 경우에는 재활용 보기에 대한 크기가 고정되지 않습니다.

을 할 수 있습니다.setHasFixedSize각 항목의 크기가 아니라 RecyclerView 자체와 관련이 있습니다.

이제 사용할 수 있습니다.android:layout_height="wrap_content"RecyclerView에서, 특히 RecyclerView가 비어 있을 때 축소 도구 모음 레이아웃이 축소되지 않아야 함을 알 수 있습니다.이것은 사용자가 사용할 때만 작동합니다.setHasFixedSize(false)재생기 보기에서.

사용하는 경우setHasFixedSize(true)Recycler View에서는 Recycler View가 비어 있더라도 축소 도구 모음 레이아웃이 축소되는 것을 방지하기 위한 이 동작은 작동하지 않습니다.

한다면setHasFixedSize항목의 크기와 관련이 있습니다. RecyclerView에 항목이 없을 때는 영향을 미치지 않습니다.

ListView에는 개별 목록 항목 높이의 크기에 대한 정보가 반영된 것으로 보이는 유사한 명명된 기능이 있습니다.RecyclerView에 대한 설명서에는 항목의 크기가 아니라 RecyclerView 자체의 크기를 참조하고 있다고 명시되어 있습니다.

setHasFixedSize() 메서드 위의 RecyclerView 소스 주석:

 * RecyclerView can perform several optimizations if it can know in advance that changes in
 * adapter content cannot change the size of the RecyclerView itself.
 * If your use of RecyclerView falls into this category, set this to true.

가 설할때정을 설정할 때.setHasFixedSize(true)RecyclerView즉, 재활용업체의 크기가 고정되어 있으며 어댑터 내용물에 영향을 받지 않습니다. 이 에는 그고이경는에우리▁and는에.onLayout적응기의 데이터를 업데이트할 때는 재활용자에게 호출되지 않습니다(단, 예외가 있습니다).

예제로 이동하겠습니다.

RecyclerView을 가지고 있습니다.RecyclerViewDataObserver( 파일에서 기본 구현 찾기) 몇 가지 방법을 사용할 때 주요 중요 사항은 다음과 같습니다.

void triggerUpdateProcessor() {
    if (POST_UPDATES_ON_ANIMATION && mHasFixedSize && mIsAttached) {
        ViewCompat.postOnAnimation(RecyclerView.this, mUpdateChildViewsRunnable);
    } else {
        mAdapterUpdateDuringMeasure = true;
        requestLayout();
    }
}

이 메서드는 다음을 설정할 경우 호출됩니다.setHasFixedSize(true)다음을 통해 어댑터의 데이터를 업데이트합니다.notifyItemRangeChanged, notifyItemRangeInserted, notifyItemRangeRemoved or notifyItemRangeMoved이경재용업 ▁to▁theer다▁calls▁in없니▁no▁is.onLayout하지만 전화가 걸려옵니다.requestLayout업데이트할 하위 항목입니다.

하지만 만약 우리가 설정한다면.setHasFixedSize(true)다음을 통해 어댑터의 데이터를 업데이트합니다.notifyItemChanged할 필요가 있습니다.onChange 중 입니다.RecyclerViewDataObserver 전도이없로의 .triggerUpdateProcessor 이경재활업체는용우는▁iner업체▁recycl.onLayout설정할 때마다 호출됩니다.setHasFixedSize true또는false.

// no calls to triggerUpdateProcessor
@Override
public void onChanged() {
    assertNotInLayoutOrScroll(null);
     mState.mStructureChanged = true;

     processDataSetCompletelyChanged(true);
     if (!mAdapterHelper.hasPendingUpdates()) {
         requestLayout();
     }
}

// calls to triggerUpdateProcessor
@Override
public void onItemRangeChanged(int positionStart, int itemCount, Object payload) {
    assertNotInLayoutOrScroll(null);
    if (mAdapterHelper.onItemRangeChanged(positionStart, itemCount, payload)) {
        triggerUpdateProcessor();
    }
}

직접 확인하는 방법:

정의 생성RecyclerView 재정의 예:

override fun requestLayout() {
    Log.d("CustomRecycler", "requestLayout is called")
    super.requestLayout()
}

override fun invalidate() {
    Log.d("CustomRecycler", "invalidate is called")
    super.invalidate()
}

override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
    Log.d("CustomRecycler", "onLayout is called")
    super.onLayout(changed, l, t, r, b)
}

재활용기 크기를 다음으로 설정합니다.match_parent(xml 단위).다음을 사용하여 어댑터의 데이터 업데이트 시도replaceData그리고.replaceOne식으로정을 setHasFixedSize(true)그리고 나서.false.

// onLayout is called every time
fun replaceAll(data: List<String>) {
    dataSet.clear()
    dataSet.addAll(data)
    this.notifyDataSetChanged()
}

// onLayout is called only for setHasFixedSize(false)
fun replaceOne(data: List<String>) {
    dataSet.removeAt(0)
    dataSet.addAll(0, data[0])
    this.notifyItemChanged(0)
}

그리고 로그를 확인합니다.

내 로그:

// for replaceAll
D/CustomRecycler: requestLayout is called
D/CustomRecycler: onMeasure is called
D/CustomRecycler: onMeasure is called
D/CustomRecycler: onLayout
D/CustomRecycler: requestLayout is called
D/CustomRecycler: requestLayout is called
D/CustomRecycler: onDraw is called

// for replaceOne
D/CustomRecycler: requestLayout is called
D/CustomRecycler: onDraw is called
D/CustomRecycler: requestLayout is called
D/CustomRecycler: onDraw is called

요약:

우리가 설정하면,setHasFixedSize(true)어댑터의 외방법로관으찰를터의터 알 게 다 업 데 트 합 이 데 니 이 어 써 로 댑 으 림 에 자 의 ▁and ▁adapter 합 ▁update ' 트 니 ▁with ▁in 이 ▁an ▁calling ▁observer ▁notifyDataSetChanged그러면 당신은 어느 정도 성과를 낼 수 있습니다, 왜냐하면 재활용자에게 전화가 없기 때문입니다.onLayout방법.

false 및 되지 않습니다. 삽입및제애션이표않시다습지니되이메니거▁sure▁its▁the다않습'니▁wonations▁so지표되▁make삽시▁remove▁insert▁anim. 그러니 확인하십시오.true재활용품 보기에 애니메이션을 추가한 경우.

Recycler View의 크기(Recycler View 자체)

어댑터 내용에 의존하지 않습니다.

mRecyclerView.setHasFixedSize(true);

...어댑터 내용에 따라 다릅니다.

mRecyclerView.setHasFixedSize(false);

RecyclerView 크기는 추가할 때마다 변경됩니다.

setHasFixedSize는 사용자 입력에 따라 RecyclerView의 크기 변경이 일정하게 유지되도록 합니다.항목의 높이(또는 너비)는 변경되지 않습니다.추가되거나 제거된 모든 항목은 동일합니다.

이것을 설정하지 않으면 아이템의 사이즈가 변경되었는지, 그렇게 비싼지 확인됩니다. (댓글에서)

setHasFixedSize()는 항목의 크기를 참조합니다. 항목 보기 또는 보기 크기를 말할 수 있으므로 목록이나 배열 목록을 처리할 대상이 없습니다. 어댑터의 다른 위치에 대한 보기 높이와 너비를 변경하려면 false로 설정하십시오.

HasFixedSize()를 true로 설정하면 재활용 보기의 높이와 너비가 변경되지 않음을 시스템에 알립니다.

setHasFixedSize(true)는 RecyclerView에 너비와 높이가 고정된 하위 항목이 있음을 의미합니다.이렇게 하면 어댑터를 기반으로 전체 목록의 정확한 높이와 너비를 파악하여 RecyclerView를 보다 효율적으로 최적화할 수 있습니다.

언급URL : https://stackoverflow.com/questions/28709220/understanding-recyclerview-sethasfixedsize

반응형