2017-07-21 18 views
7

如果我有一個簡單的自定義視圖:Kotlin Android Extensions是否會緩存綜合屬性或每次調用findViewById()?

myitem.xml

<FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     > 

     <TextView 
     android:id="@+id/textview" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     /> 
<FrameLayout/> 

訪問一個kotlinx syntentic屬性:

import kotlinx.android.synthetic.main.myitem.view.* 

view.toolbar.text = "Some text" 

內部,它產生於findByViewID()通話。所以我的問題是:

結果爲自定義視圖緩存像活動或每次每個時間被調用findByViewID由於性能原因,答案非常重要。

回答

3

由於1.1.4視圖可以緩存在任何類中。 默認啓用自定義視圖中的緩存。對於ViewHolders您需要實現LayoutContainer接口是這樣的: class MyViewHolder(override val containerView: View): LayoutContainer

請參閱本文檔的詳細信息 https://github.com/Kotlin/KEEP/blob/master/proposals/android-extensions-entity-caching.md

更新: 爲了能夠使用LayoutContainer,你應該將其添加到gradle這個腳本: androidExtensions { experimental = true }

+0

該提案是否完全在1.1.4中實現? – WindRider

+1

是的。閱讀1.1.4發行說明 – deviant

+0

我做了,但我並不完全確定。 – WindRider

7

在當前版本(1.1.3)中,對活動和片段佈局緩存視圖。對於RecyclerView ViewHolders等其他類型的容器,不存在緩存。

此外,緩存是一個HashMap與Integer拳擊鍵。 A SparseArray本來會更好。

編輯:從版本1.1.4開始,其他類也可以緩存視圖,包括ViewHolder,如果你讓它們實現LayoutContainer接口。您還可以使用@ContainerOptions批註指定另一個高速緩存實施,包括SparseArray。這兩項功能都仍處於試驗階段,需要在您的build.gradle文件中手動啓用:

androidExtensions { 
    experimental = true 
} 

Read more了。

相關問題