在线填充多个字段 Kotlin

问题描述 投票:0回答:1

我想知道在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)

这有可能吗?

谢谢你的回答

android kotlin inline kotlin-android-extensions
1个回答
3
投票

这是否有些可能?

不,你不能设置 属性在Kotlin中以这样的方式*。

如果你想以更简洁的方式初始化或改变一些属性的值,你可以使用其中的一个 范围功能:

Kotlin标准库包含几个函数,其唯一目的是在对象的上下文中执行代码块。当你在一个提供了lambda表达式的对象上调用这样的函数时,它会形成一个临时的作用域。在这个作用域中,你可以在没有对象名称的情况下访问该对象。这样的函数被称为作用域函数。有五个函数。let, run, with, applyalso.

在这种特殊情况下,它似乎是 apply 是最合适的。

val evh = ExampleViewHolder(binding.root).apply {
    mImageView = binding.myImageView
    mTextView1 = binding.text1
    mTextView2 = binding.text2
}

*请注意,类似的内联语法在Kotlin中也是有效的,而且它被用于 重构声明:

val (first, second) = listOf("firstValue", "secondValue")

2
投票

您也可以将视图作为参数传递给 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)
}

1
投票

我发现 此职位 其中说,如果你把所有的视图都放在一个数据类中就可以了。

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
    }
}

1
投票

如果一个对象已经被创建了,要改变几个字段,你可以使用范围函数 "运行",比如:

evh.run { 
    mImageView = binding.myImageView 
    mTextView1 = binding.text1
    mTextView2 = binding.text2 
}
© www.soinside.com 2019 - 2024. All rights reserved.