我想知道在Kotlin中是否可以在一行中填充多个字段(仅仅是为了让代码更干净)。
我的代码。
val evh = ExampleViewHolder(binding.root)
evh.mImageView = binding.myImageView
evh.mTextView1 = binding.text1
evh.mTextView2 = binding.text2
我想实现这样的目标
(evh.mImageView, evh.mTextView1, evh.mTextView2) = (binding.myImageView, binding.text1, binding.text2)
这有可能吗?
谢谢你的回答
这是否有些可能?
不,你不能设置 属性在Kotlin中以这样的方式*。
如果你想以更简洁的方式初始化或改变一些属性的值,你可以使用其中的一个 范围功能:
Kotlin标准库包含几个函数,其唯一目的是在对象的上下文中执行代码块。当你在一个提供了lambda表达式的对象上调用这样的函数时,它会形成一个临时的作用域。在这个作用域中,你可以在没有对象名称的情况下访问该对象。这样的函数被称为作用域函数。有五个函数。
let
,run
,with
,apply
和also
.
在这种特殊情况下,它似乎是 apply
是最合适的。
val evh = ExampleViewHolder(binding.root).apply {
mImageView = binding.myImageView
mTextView1 = binding.text1
mTextView2 = binding.text2
}
*请注意,类似的内联语法在Kotlin中也是有效的,而且它被用于 重构声明:
val (first, second) = listOf("firstValue", "secondValue")
您也可以将视图作为参数传递给 ExampleViewHolder
,像这样。
class ExampleViewHolder(
val rootView: View, val imageView: ImageView,
val textView1: TextView, val textView2: TextView
) : RecyclerView.ViewHolder(rootView) {...}
然后使用ViewHolder中的 apply
范围函数。
val viewHolder = binding.run {
ExampleViewHolder(root, myImageView, text1, text2)
}
我发现 此职位 其中说,如果你把所有的视图都放在一个数据类中就可以了。
data class ExampleViewHolder(val mImageView: ImageView, val mTextView: TextView, val mTextView2: TextView, val binding: Binding) : RecyclerView.ViewHolder(binding.root)
然后做一些像这样的事情。
val (mImageView, mTextView1, mTextView2, binding) = ExampleViewHolder(binding.myImageView, binding.text1, binding.text2, binding)
或者你也可以把半列的数据放在数据类之间来单行排列,但这样做并不能提高可读性。
evh.mImageView = binding.myImageView; evh.mTextView1 = binding.text1; evh.mTextView2 = binding.text2
我会在你的数据类中分配字段 ExampleViewHolder
:
class ExampleViewHolder(binding: Binding) : RecyclerView.ViewHolder(binding.root) {
val mImageView = binding.myImageView
val mTextView = binding.text1
val mTextView2 = binding.text2
}
或者甚至让 ExampleViewHolder
来进行绑定。
class ExampleViewHolder(val binding: Binding) : RecyclerView.ViewHolder(binding.root) {
fun bindTo(item: Any) {
binding.myImageView.visibility = View.GONE
}
}
如果一个对象已经被创建了,要改变几个字段,你可以使用范围函数 "运行",比如:
evh.run {
mImageView = binding.myImageView
mTextView1 = binding.text1
mTextView2 = binding.text2
}