kotlin-андроид-расширения в ViewHolder

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

как этот код, у Kotlin есть кеш в расширениях android?

когда я декомпилирую kotlin байт-код

 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()); } 

это означает, что когда я назвал binData в Adapter.onBindViewHolder (), он будет каждый раз называть findViewById

Это значительно увеличивает потерю производительности и не достигает цели повторного использования макета

У Kotlin есть логика кэша в андроид-расширениях с помощью ViewHolder?

Просмотр кэширования в ViewHolder или любой пользовательский класс возможен только с Kotlin 1.1.4 и сейчас находится на экспериментальной стадии.

  1. Обновите версию Kotlin в корневом файле build.gradle.

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

  1. Добавьте эти строки в свое приложение build.gradle :

androidExtensions { experimental = true }

  1. ViewHolder класс LayoutContainer от LayoutContainer . 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 показывает, что этот класс использует кеш для Views:

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

Дальнейшие чтения: предложение KEEP , потрясающий учебник .

По моему мнению, расширения kotlin-android – это просто статически импортированное расширение (сгенерированные коды) для замены 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 } } 

Одним из преимуществ такого подхода является обнаружение любого типа во время компиляции!