在1.1.4中任何类中的view属性都会被缓存包括ViewHolder。还提供了一个新注解@Parcelize,还有一种方法可以自定义生成的缓存。
需要在build.gradle文件中启用这些功能:

  1. androidExtensions {
  2. experimental = true
  3. }

在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 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。