3
class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { 

     fun bindata(text: SingleText){ 
      itemView.title.text = text.title 
      itemView.desc.text = text.desc 
     } 
} 

像这样的代码,Kotlin在android-extensions中有任何缓存?在ViewHolder中的kotlin-android-extensions

当我反编译字节码科特林

public final void bindata(@NotNull SingleText text) { 

    Intrinsics.checkParameterIsNotNull(text, "text"); 
    ((AppCompatTextView)this.itemView.findViewById(id.title)).setText((CharSequence)text.getTitle()); 
    ((AppCompatTextView)this.itemView.findViewById(id.desc)).setText((CharSequence)text.getDesc()); 

} 

它意味着当我在Adapter.onBindViewHolder(),它将被称为findViewById每次

这显著增加的性能的损失称为binData,并且它确实未达到布局重用的目的

Kotlin在ViewHolder的android-extensions中有任何缓存逻辑?

+0

'findViewById'找到已经创建的视图。这意味着你正在重复使用它。没有性能问题,你正在谈论。 – chandil03

回答

10

查看缓存在ViewHolder或任何自定义类只能从Kotlin 1.1.4,它目前正处于试验阶段。

  1. 更新您的科特林版本在根级别的build.gradle文件

classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.4-3"

  • 在应用程式build.gradle添加这些行:
  • androidExtensions { experimental = true }

    1. LayoutContainer继承ViewHolder类。 LayoutContainer是一个可在kotlinx.android.extensions包中使用的接口。

    2. 添加以下导入,其中view_item是布局名称。

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

    整个ViewHolder类的样子:

    class ViewHolder(override val containerView: View) : RecyclerView.ViewHolder(containerView), 
         LayoutContainer { 
    
        fun bind(title: String) { 
         itemTitle.text = "Hello Kotlin!" // itemTitle is the id of the TextView in the layout 
        } 
    } 
    

    反编译Java代码表明,这种类使用缓存的浏览次数:

    public final void bind(@NotNull String title) { 
          Intrinsics.checkParameterIsNotNull(title, "title"); 
          ((TextView)this._$_findCachedViewById(id.itemTitle)).setText((CharSequence)"Hello Kotlin!"); 
        } 
    

    进一步阅读: KEEP proposalan awesome tutorial

    4

    从我的理解,kotlin-android-extensions只是一个静态导入的扩展(生成的代码)来替换View.findViewById。

    我会建议您将参考文献存储在您的视图持有者中。

    class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { 
        val title: TextView = itemView.title 
        val desc: TextView = itemView.desc 
    
        fun bindata(text: SingleText){ 
         title.text = text.title 
         desc.text = text.desc 
        } 
    } 
    

    这种方法的好处之一是在编译时会发现任何类型的不匹配!