Почему можно изменить свойство val в Котлине? - PullRequest
0 голосов
/ 25 апреля 2018

Код B - это настраиваемый апатер RecyclerView с переключателем.

mCustomAdapter изменяется и в методе fun A (), и в методе fun B () в коде A, поэтому также изменяется ссылка на 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
}

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

На мой взгляд, свойство val не может быть изменено, почему приложение не вызывает ошибку?

Вы должны настроить свою интуицию.

ВKotlin, val означает «свойство только для чтения», а не «неизменяемое свойство».Только значения без специального геттера могут считаться неизменными.

0 голосов
/ 25 апреля 2018

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

0 голосов
/ 25 апреля 2018

Свойство val может возвращать различное значение каждый раз, когда вы вызываете его следующим образом:

private var aImpl = 0
val a: Int get() = aImpl++

Поскольку возвращаемое значение mCustomAdapter.getSelectedIndex() меняется, mySelectedIndex явно меняется.

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