kotlin - setter 不修改二维数组

标签 kotlin arraylist

Kotlin 。我想要一个按钮来显示二维 ArrayList 中的值,以及用于修改其中一个的第二个按钮。但是 setter 不会修改二维 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 上的自定义 setter/getter 每次都会执行model被访问,因此对数组的任何更改都将被覆盖。如果要验证使用单个 println在自定义 setter/getter 中,您打印的任何内容都会显示多次。

“自定义 setter/getter ”是指 get()model和相关的代码块。

一种解决方案是使用延迟初始化而不是自定义 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那里是不允许的。

关于kotlin - setter 不修改二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60552321/

相关文章:

java - 如何使用 Contains 方法在 arraylist 中查找对象

arrays - Kotlin 数组 <初始化

android - 从后台获取特定的 Activity

java - 从命令行运行 Java 到 Kotlin 转换器?

android - Kotlin协程:使一个线程执行代码,而另一个等待第一个完成

kotlin - 如何在 Parcelable 中创建可为 null 的 bool 值

Java ArrayList 搜索

java - 如何用Java封装ArrayList

java - ArrayList 中的 Android Studio html View

java - 从填充的 HashMap 中检索到的 Arraylist 不断返回一个空的 arraylist