在1.1.4中任何类中的view属性都会被缓存包括ViewHolder。还提供了一个新注解@Parcelize,还有一种方法可以自定义生成的缓存。
需要在build.gradle文件中启用这些功能:
androidExtensions {experimental = true}
在ViewHolder中使用(或任意自定义类)
你可以使用简单的方法为任意类构建一个缓存,唯一需要做的就是让你的类实现LayoutContainer接口,比如说上面的示例就可以改成如下这样:
class ViewHolder(override val containerView: View) : RecyclerView.ViewHolder(containerView),
LayoutContainer {
fun bind(title: String) {
itemTitle.text = "Hello Kotlin!"
}
}
containerView是从LayoutContainer接口覆盖的那个。
接下来看一下生成的字节码:
((TextView)this._$_findCachedViewById(id.itemTitle)).setText((CharSequence)"Hello Kotlin!");
可以发现已经出现了cache。
Kotlin Android Extension实现Parcelable
使用@Parcelize注解,可以让任何类以一种简单的方式实现Parcelable。
你只需要在类上添加注解,然后插件就会将你做其余的工作:
@Parcelize
class Model(val title: String, val amount: Int): Parcelable
接着你就可以在任意的Intent中使用如下代码:
val intent = Intent(this, DetailActivity::class.java)
intent.putExtra(DetailActivity.EXTRA, model)
从intent中获取数据:
val model: Model = intent.getParcelableExtra(EXTRA)
定制缓存
@ContainerOptions注解可以允许你自定义缓存的构建方式,甚至可以阻止类创建缓存。
默认情况下会使用Hashmap,就像我们上面看到的那样,可以改为使用Android框架中的SparseArray,在某些情况下可能更有效,如果你不需要为类添加缓存,也可以使用该注解。
@ContainerOptions(CacheImplementation.SPARSE_ARRAY)
class MainActivity : AppCompatActivity() {
...
}
public enum class CacheImplementation {
SPARSE_ARRAY,
HASH_MAP,
NO_CACHE;
...
}
作者:小菜鸟程序媛 链接:https://www.jianshu.com/p/6ee7ef051872 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
