kotlin - 设置器不修改二维数组
问题描述
科特林。我想要一个按钮来显示二维的值ArrayList
,以及第二个按钮来修改其中一个。但是设置者不会修改二维ArrayList
. 我们可以使用第一个按钮查看值,在使用第二个按钮修改索引 2(第三个)处的值后,这些值不会改变:
model.get(2).setDateStrs("03/03/20")
model.get(2).setHourStrs("10:27")
怎么了?
ReModel.kt 文件:
package com.example.updatearraylist
class ReModel {
var dateStr:String = "12/31/2029"
var hourStr: String = "00:00"
fun getDateStrs(): String {
return dateStr
}
fun setDateStrs(dateStr: String) {
this.dateStr = dateStr
}
fun getHourStrs(): String {
return hourStr
}
fun setHourStrs(hourStr: String) {
this.hourStr = hourStr
}
}
MainActivity.kt 文件:
package com.example.updatearraylist
import android.R.attr
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
import java.lang.reflect.Array.get
import java.util.*
import kotlin.collections.ArrayList
class MainActivity : AppCompatActivity() {
private var displayValueBtn: Button? = null
private var changeValueBtn: Button? = null
val model: ArrayList<ReModel>
get() {
val list = ArrayList<ReModel>()
for (i in 0..7) {
val model = ReModel()
model.setDateStrs("01/16/2020")
model.setHourStrs("01:08")
list.add(model)
}
return list
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
displayValueBtn =findViewById<Button>(R.id.displayValueBtn)
changeValueBtn=findViewById<Button>(R.id.changeValueBtn)
displayValueBtn!!.setOnClickListener {
for(i in 0..7){
Toast.makeText(this, "Value position "+i+" "+model.get(i).getDateStrs()+" "+
model.get(i).getHourStrs()
,Toast.LENGTH_SHORT).show()
}
}
changeValueBtn!!.setOnClickListener {
model.get(2).setDateStrs("03/03/20")
model.get(2).setHourStrs("10:27")
Toast.makeText(this,"List Modified",Toast.LENGTH_LONG).show()
}
}
}
解决方案
model
每次访问时都会执行自定义 getter,model
因此对数组的任何更改都会被覆盖。如果您想验证在自定义 getter 中使用单个println
,并且您打印的任何内容都会显示多次。
“自定义吸气剂”是指get()
onmodel
和相关的代码块。
一种解决方案是使用惰性初始化而不是自定义 getter,以便model
仅初始化一次。看起来是这样的:
val model: ArrayList<ReModel> by lazy {
val list = ArrayList<ReModel>()
for (i in 0..7) {
val model = ReModel()
model.setDateStrs("01/16/2020")
model.setHourStrs("01:08")
list.add(model)
}
list
}
请注意,最后一行只是list
返回列表的值。 return
那里是不允许的。
推荐阅读
- html - 如何为网站搜索结果添加图像元标记关键字?
- python - 如何将子查询 SQL 转换为 sqlachemy?
- java - 如何识别 HashMap 中的哪个值给出了一个真值,然后用它做些什么?
- gcc - 为什么`mov %eax, %eax; nop` 比`nop` 快?
- mysql - mysql:从2个不同的表中选择所有行
- python - 风险指数超出范围
- php - AWS EC2 PHP:无法设置会话值,但正在生成会话 ID
- matplotlib - Matplotlib 热图失败
- firebase - 在没有 App Server 的情况下发送 FCM 通知
- python - Spark - 将 DataFrame 转换为 RowMatrix 以有效地计算所有对相似度