代码B是一个定制的回收视图apater,带有单选按钮。
mCustomAdapter 在 Code A 中的 fun methodA() 和 fun methodB() 中都发生了变化,因此 get () = mCustomAdapter.getSelectedIndex()
的引用也发生了变化,这意味着 val 属性 mySelectedIndex 从不同的地址获取值。
在我看来,val属性不能更改,为什么应用程序不会导致错误?
代码A
private lateinit var mCustomAdapter: CustomAdapter
private val mySelectedIndex get () = mCustomAdapter.getSelectedIndex()
private fun methodA(){
mCustomAdapter= CustomAdapter(allListA)
mRecyclerView.adapter= mCustomAdapter
backup(mySelectedIndex)
}
private fun methodB(){
mCustomAdapter= CustomAdapter(allListB)
mRecyclerView.adapter= mCustomAdapter
restore(mySelectedIndex)
}
代码B
class CustomAdapter (val backupItemList: List<MSetting>) : RecyclerView.Adapter<CustomAdapter.ViewHolder>() {
val noRecord=-1
private var mSelectedIndex = noRecord
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomAdapter.ViewHolder {
val v = LayoutInflater.from(parent.context).inflate(R.layout.item_recyclerview, parent, false)
return ViewHolder(v)
}
fun getSelectedIndex():Int{
return mSelectedIndex
}
fun setSelectedIndex(index:Int){
if (index in 0..(backupItemList.size-1) ){
mSelectedIndex=index
}
notifyDataSetChanged();
}
override fun onBindViewHolder(holder: CustomAdapter.ViewHolder, position: Int) {
holder.bindItems(backupItemList[position])
}
override fun getItemCount(): Int {
return backupItemList.size
}
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bindItems(aMSetting: MSetting) {
itemView.radioButton.setOnClickListener {
mSelectedIndex=adapterPosition
notifyDataSetChanged();
}
if(adapterPosition == 0 && mSelectedIndex == noRecord) {
itemView.radioButton.isChecked = true
mSelectedIndex=adapterPosition
}
else {
itemView.radioButton.isChecked =(adapterPosition == mSelectedIndex)
}
}
}
}
被改进的
我觉得代码DD和代码EE可以达到同样的效果吧?
代码DD
var aImpl = 0
val a: Int get() = aImpl
fun seta(){
aImpl=5
}
代码 EE
var b:Int=0
fun setb(){
b=5
}
关于属性,关键字<code>val</code>意味着该属性没有setter,这意味着您不能对其使用赋值运算符<code>=。这并不意味着返回值必须随时间保持不变。
val
属性每次调用时都可以返回不同的值,如下所示:
private var aImpl = 0
val a: Int get() = aImpl++
由于< code > mcustomadapter . getselectedindex()的返回值在变化,因此< code>mySelectedIndex显然也在变化。
在我看来,val属性不能更改,为什么应用程序不会导致错误?
你必须调整你的直觉。
在Kotlin中,val
表示“只读属性”,而不是“不可变属性”。只有没有自定义getter的VAL才能被认为是不可变的。
问题内容: 例如: Java: 科特林: 我以为它将转换为Java字节码。 问题答案: 这似乎是一个已知的问题在这里。显然,这是一件复杂的事情,不太可能很快解决。 来自安德烈·布雷斯拉夫的原始答复: 不幸的是,这是一个相当深的问题。我们不太可能以您想要的方式使其工作 在问题页面的更下方,您可以看到它在多平台项目方面变得更加复杂。
我看到一些教程建议在Kotlin中使用val而不是var。我相信val在Java中就像常量,对吗?那么,如果建议使用它而不是var,我们如何更改它的值? 更新:例如:为什么我要使用val而不是var声明类成员(变量或字段)?而在Java中,它就像:
在“Kotlin in Action”中,它说“如果一个成员属性引用了Person类的年龄属性,memberProperty.get(person)是一种动态获取person.age值的方法”,代码为(10.2.1 Kotlin Reflection API): 我不明白为什么这个例子提到“动态”获取属性的值。当我运行以下代码时,它才起作用: 是否有其他成员属性反射的案例或示例?
在Kotlin文档中,我们只有以下几个字。 只读局部变量使用val关键字声明。可变局部变量使用var关键字声明。 这个问题不仅是让我们理解单词的意思,也是提醒单词制造者告诉我们他们为什么给这个单词命名,这不是一件小事,这会让我们更舒服地学习新知识,我们想学习和理解一切。
我不明白为什么在Kotlin的类外写函数是可能的?这是个好做法吗?