Сохранение содержимого EditText в RecyclerView на Kotlin - PullRequest
1 голос
/ 07 июля 2019

Аналогично Сохранение содержимого EditText в RecyclerView , у меня есть реализация пары EditTexts для заполнения внутри каждой строки RecyclerView. Но моя переменная позиции внутри моего TextWatcher всегда возвращает 0, даже после вызова функции updatePosition.

Lod.d в afterTextChanged () на обоих наблюдателях всегда показывает, что позиция равна 0, даже после заполнения editText на 3-й позиции.

Я вижу, что updatePosition переходит от 0 к areaimportadas.size во время функции onBindViewHolder, но это не происходит для onTextChanged.

class importItemsAdapter (val областейImportadas: MutableList, val inclinaLida: MutableList, val desvLido: MutableList): RecyclerView.Adapter () {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomViewHolder {
   val layoutInflater = LayoutInflater.from(parent.context)
   val cellForRow = layoutInflater.inflate(R.layout.import_items,parent,false)
    return CustomViewHolder(cellForRow)
}

override fun getItemCount(): Int {
   return areasImportadas.size
}

override fun onBindViewHolder(holder: CustomViewHolder, position: Int) {
    holder.itemView.importNum.text = (position+1).toString()
    holder.itemView.importArea.text = areasImportadas[position]
    Watcher1().updatePosition(holder.adapterPosition)
    Watcher2().updatePosition(holder.adapterPosition)
    holder.itemView.importInclina.addTextChangedListener(Watcher1())
    holder.itemView.importDesv.addTextChangedListener(Watcher2())
}

class CustomViewHolder(view: View): RecyclerView.ViewHolder(view)

private inner class Watcher1 : TextWatcher {
    var position = 0

    fun updatePosition(positionExt: Int) {
        this.position = positionExt
        Log.d("Registro", this.position.toString())
    }

    override fun afterTextChanged(arg0: Editable) {
        inclinaLida[position]= arg0.toString()
        Log.d("Registro", "Inclinação $position: ${inclinaLida[position]}")
    }

    override fun beforeTextChanged(arg0: CharSequence, arg1: Int, arg2: Int, arg3: Int) {}

    override fun onTextChanged(s: CharSequence, a: Int, b: Int, c: Int) {

    }
}

private inner class Watcher2 : TextWatcher {
    var position = 0

    fun updatePosition(positionExt: Int) {
        position = positionExt
        Log.d("Registro", position.toString())
    }
    override fun afterTextChanged(arg0: Editable) {
        Log.d("Registro", "Desvio ${position}: ${desvLido[position]}")
    }

    override fun beforeTextChanged(arg0: CharSequence, arg1: Int, arg2: Int, arg3: Int) {
    }

    override fun onTextChanged(s: CharSequence, a: Int, b: Int, c: Int) {
        desvLido[position]=s.toString()
    }

}

}

Мне нужно было иметь возможность хранить каждый контент EditText в нужном месте в обоих списках (desvLido и inclinaLida)

1 Ответ

0 голосов
/ 07 июля 2019

Чего не хватало, так это вызова экземпляра:

override fun onBindViewHolder(holder: CustomViewHolder, position: Int) {

    holder.itemView.importNum.text = (position+1).toString()
    holder.itemView.importArea.text = areasImportadas[position]
    val watcher1 = Watcher1()
    watcher1.updatePosition(holder.adapterPosition)
    holder.itemView.importInclina.addTextChangedListener(watcher1)
}

Теперь позиция возвращает правильное значение.

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