Сеттеры не изменяют двумерный массив - PullRequest
1 голос
/ 05 марта 2020

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

1 Ответ

0 голосов
/ 05 марта 2020

Пользовательский метод получения на model будет выполняться каждый раз при обращении к model, поэтому любые изменения в массиве будут перезаписаны. Если вы хотите убедиться, что используете один println в пользовательском геттере, и все, что вы печатаете, будет отображаться несколько раз. кода.

Одним из решений является использование отложенной инициализации вместо пользовательского метода получения, чтобы 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 там не разрешено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...