如果我有一个简单的自定义视图:
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
时的结果?由于性能原因,答案非常重要。
答案 0 :(得分:8)
在当前版本(1.1.3)中,将为“活动”和“片段”布局缓存视图。对于像RecyclerView ViewHolders这样的其他类型的容器,没有缓存。
此外,缓存是HashMap
,其中包含用于键的整数装箱。 SparseArray
本来会更好。
编辑:从版本1.1.4开始,如果你让它们实现ViewHolder
接口,那么也可以为其他类缓存视图,包括LayoutContainer
。您还可以使用@ContainerOptions
注释指定另一个缓存实现,包括SparseArray
。这两个功能仍处于试验阶段,需要在build.gradle
文件中手动启用:
androidExtensions {
experimental = true
}
Read more关于它。
答案 1 :(得分:4)
由于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
}