适配器或ViewHolder中的Kotlin合成

bus*_*lee 68 kotlin kotlin-android-extensions

我是kotlin的新人.我发现并尝试findViewById在我的Activity类中使用合成方法而不是烦人的方法,但我发现"如果我们想在View上调用合成属性(在适配器类中有用),我们还应该导入kotlinx.android.synthetic.main .视图.*." 但我无法弄清楚它究竟是如何起作用的?有什么例子吗?

Pet*_*hao 79

来自https://github.com/antoniolg/Kotlin-for-Android-Developers的简单示例

import kotlinx.android.synthetic.item_forecast.view.*

class ForecastListAdapter() : RecyclerView.Adapter<ForecastListAdapter.ViewHolder>() {

    class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {

        fun bindForecast(forecast: Forecast) {
            itemView.date.text = forecast.date.toDateString()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不需要写

val view = itemView.findViewById(R.id.date) as TextView
view.text = forecast.date.toDateString()
Run Code Online (Sandbox Code Playgroud)

只是

itemView.date.text = forecast.date.toDateString()
Run Code Online (Sandbox Code Playgroud)

简单有效!

  • 不幸的是,在每次bind()调用时调用findViewById:https://medium.com/proandroiddev/the-costs-of-kotlin-android-extensions-6809e2b32b13 (16认同)
  • 好吧,这可能是一个愚蠢的问题,但'itemView'参考来自哪里? (4认同)
  • 视图扩展没有缓存,因此应该缓存对视图的引用,就像在普通的viewHolder中一样. (3认同)
  • @Mike 从 Kotlin 1.1.4 开始,所有视图都将被缓存。即使在 ViewHolders 中。您发布的文章也提到了这一点。 (3认同)
  • @StefanMedack我是本文的作者:)尽管我必须指出,它只是实验功能的一部分,需要手动启用。我还没有尝试过。 (2认同)

Dha*_*ani 27

科特林1.1.4出局

更多信息:https://antonioleiva.com/kotlin-android-extensions/

所以你需要启用它们添加到build.gradle:

apply plugin: 'org.jetbrains.kotlin.android.extensions'
androidExtensions {
    experimental = true
}
Run Code Online (Sandbox Code Playgroud)

自从这个新版本的Kotlin以来,Android Extensions已经集成了一些新的有趣功能:任何类中的缓存(有趣的是包含ViewHolder)

在ViewHolder(或任何自定义类)上使用它

class ViewHolder(override val containerView: View) : RecyclerView.ViewHolder(containerView), 
        LayoutContainer {

    fun bind(title: String) {
        itemTitle.text = "Hello Kotlin!"
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 添加此信息:根据Kotlin 1.1.4,该功能是实验性的,需要在build.gradle文件上启用 (3认同)
  • 这个实验不再了吗?我想在生产代码中使用它 (2认同)

Zso*_*ari 8

你需要

import kotlinx.android.synthetic.row_wall.view.*
Run Code Online (Sandbox Code Playgroud)

后来有些东西:

convertView.titleText.text = item.title
Run Code Online (Sandbox Code Playgroud)

关键是视图.*引入了View类的扩展.


hye*_*ena 7

尝试

class CustomViewModel(val baseView: View) { val firstName = baseView.firstName val lastName = baseView.lastName }

View对象公开了视图参考:https://discuss.kotlinlang.org/t/unable-to-use-kotlin-android-extension-in-adapter-class/2890