成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何正確使用RecyclerView的setHasFixedSize方法提高布局計算性能

移動開發 Android
在確定 RecyclerView? 的大小在整個生命周期中都不會改變時,才將 hasFixedSize()? 設置為 true。如果不確定,或者 RecyclerView? 的大小可能會改變,應該將其設置為 false,確保 RecyclerView 能夠正確地重新計算其布局。

setHasFixedSize

setHasFixedSize(boolean hasFixedSize) 是 Android 中 RecyclerView 類的一個方法,用于設置 RecyclerView 是否具有固定大小。

RecyclerView源碼中setHasFixedSize方法的解釋:

/**
  * RecyclerView can perform several optimizations if it can know in advance that RecyclerView's
  * size is not affected by the adapter contents. RecyclerView can still change its size based
  * on other factors (e.g. its parent's size) but this size calculation cannot depend on the
  * size of its children or contents of its adapter (except the number of items in the adapter).
  * <p>
  * If your use of RecyclerView falls into this category, set this to {@code true}. It will allow
  * RecyclerView to avoid invalidating the whole layout when its adapter contents change.
  *
  * @param hasFixedSize true if adapter changes cannot affect the size of the RecyclerView.
*/
public void setHasFixedSize(boolean hasFixedSize) {
    mHasFixedSize = hasFixedSize;
}

翻譯一下注釋如下:

如果RecyclerView能夠提前知道RecyclerView的大小不受適配器內容的影響,可以執行幾個優化。RecyclerView仍然可以根據其他因素(例如其父項的大?。└钠浯笮?,但此大小計算不能取決于其子項的大小或適配器的內容(適配器中的項目數除外) 如果您對RecyclerView的使用屬于此類別,請將其設置為{@code true}。它將允許RecyclerView避免在適配器內容更改時使整個布局無效。

@Override
protected void onMeasure(int widthSpec, int heightSpec) {
    if (mLayout == null) {
        defaultOnMeasure(widthSpec, heightSpec);
        return;
    }
    if (mLayout.isAutoMeasureEnabled()) {
        //....... 省略部分代碼
    } else {
        if (mHasFixedSize) {
            mLayout.onMeasure(mRecycler, mState, widthSpec, heightSpec);
            return;
        }
        // custom onMeasure
        //......  省略部分代碼
        if (mAdapter != null) {
            mState.mItemCount = mAdapter.getItemCount();
        } else {
            mState.mItemCount = 0;
        }
        startInterceptRequestLayout();
        mLayout.onMeasure(mRecycler, mState, widthSpec, heightSpec);
        stopInterceptRequestLayout(false);
        mState.mInPreLayout = false; // clear
    }
}

由上面內容可知:調用 setHasFixedSize(true) 時,RecyclerView 的子項(items)的大小不會改變,即使添加或移除了 RecyclerView 中的項,RecyclerView 也不會重新測量和布局它的所有子項。好處是可以提高性能(測量和布局是一個相對耗時的操作)。

重要的是要確保RecyclerView 實際上具有固定大小。如果 RecyclerView 的子項大小可能會改變(例如,由于文本長度的變化或圖像加載),應該調用 setHasFixedSize(false)。當子項大小改變時,RecyclerView 會重新測量和布局它們確保能正確顯示。

如果你設置 hasFixedSize(true),但在運行時 RecyclerView 的大小實際上發生了變化(例如,因為其內容或布局參數的變化),那么 RecyclerView 的布局可能不會正確地更新,可能會導致顯示問題。

總結

在確定 RecyclerView 的大小在整個生命周期中都不會改變時,才將 hasFixedSize() 設置為 true。如果不確定,或者 RecyclerView 的大小可能會改變,應該將其設置為 false,確保 RecyclerView 能夠正確地重新計算其布局。

  1. 使用固定的寬度/高度(可以用setHasFixedSize(true)):
<androidx.recyclerview.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:overScrollMode="never"
    app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
    app:spanCount="2" />
  1. 不使用固定的寬度/高度:應該使用setHasFixedSize(false),因為寬度或高度可以改變RecyclerView的大小。
<androidx.recyclerview.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:overScrollMode="never"
    app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
    app:spanCount="2" />

即使將 hasFixedSize() 設置為 true,RecyclerView 仍然會監聽滾動事件,滾動性能不會受到影響,主要影響的是布局計算的性能。

責任編輯:武曉燕 來源: 沐雨花飛蝶
相關推薦

2016-09-22 09:24:33

AndroidViewStub

2013-01-08 16:05:23

Android開發布局ViewStub

2011-05-24 15:15:12

mysql性能

2017-07-10 13:09:45

前端Flexbox

2019-03-05 10:20:49

WebWebpack分離數據

2009-12-31 15:21:48

Silverlight

2011-04-27 16:38:31

投影機

2011-04-11 14:56:09

Oracle性能

2021-07-14 14:06:06

CSS前端瀏覽器

2009-11-02 14:08:05

2009-08-06 11:12:17

提高GDI編程性能

2010-01-05 18:49:57

.NET Framew

2015-10-10 11:00:05

RubyRails性能

2015-11-16 10:21:28

Java中鎖性能

2021-11-05 11:03:33

云計算開發技術

2015-03-18 09:59:14

CSSCSS提高渲染性

2010-07-29 10:19:18

提高DB2 IMPOR

2015-10-14 17:27:18

性能

2023-08-18 14:10:00

CDN數據中心

2019-05-22 14:55:57

云計算企業微服務
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲男人天堂av | 黄a免费网络 | 日韩一区不卡 | 国产成人精品一区 | а_天堂中文最新版地址 | 精品在线一区二区 | 亚洲欧美一区二区三区情侣bbw | 久久噜噜噜精品国产亚洲综合 | 青青草网站在线观看 | 亚洲视频在线播放 | 久久精品国产免费 | 免费的av网站 | 久久久www成人免费精品 | 日本不卡一区二区三区在线观看 | 国产乱码高清区二区三区在线 | 欧美xxxx网站 | 中文字幕在线视频网站 | 国产乱码精品一区二区三区五月婷 | 国产精品揄拍一区二区久久国内亚洲精 | 一本大道久久a久久精二百 国产成人免费在线 | 亚洲喷水 | 国产精品99久久久久久久久久久久 | 丁香婷婷久久久综合精品国产 | 久久久久国产一区二区三区 | 久久69精品久久久久久国产越南 | 久草.com| aaaa网站 | 岛国av一区二区三区 | 精品国产乱码一区二区三区 | 日韩在线免费 | 日韩欧美一区二区三区 | 亚洲综合色视频在线观看 | 神马久久久久久久久久 | 99婷婷| 成人精品一区二区 | 久久久国产一区二区三区四区小说 | 精品国产乱码久久久久久88av | 欧美精品一区二区三区在线播放 | 亚洲aⅴ| 少妇黄色 | 久久99精品久久 |