Android Последний элемент Recyclerview обновляется при обновлении первого элемента. - PullRequest
0 голосов
/ 07 февраля 2020

В моей деятельности есть Recyclerview. в нем всегда 10 предметов. Элемент Recyclerview имеет две кнопки, каждая из которых прослушивает щелчок, определенный в onBindViewHolder методе класса адаптера. после нажатия любой из кнопок элементов вызывает метод обратного вызова, который реализуется в методе действия onCreate. Метод обратного вызова передает adapterPosition в действие, действие возвращает длинное значение, с помощью которого я обновляю текст кнопки.
Проблема в том, что когда я нажимаю кнопку первого элемента в окне повторного просмотра, он обновляет текст первого и последнего элемента. Сначала я использовал position, но затем изменил его на adapterPosition или layoutPosition, но это не сработало. иногда обновляется предыдущий элемент, а иногда последний обновляется с обновлением первого элемента

код onCreate действия

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_videocrop)

    var segmentAdapter = SegmentAdapter(10)
    var layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false)
    videoCropRecyclerView.adapter = segmentAdapter
    videoCropRecyclerView.layoutManager = layoutManager

    segmentAdapter.onSegmentSelectedListener = object : OnSegmentSelectedListener {
        override fun onSelectFrom(index: Int): Int? {
            return 12345
        }

        override fun onSelectTo(index: Int): Int? {
            return 54321
        }
    }
}


Код класса адаптера

class SegmentAdapter(var segments: Int) : RecyclerView.Adapter<SegmentAdapter.SegmentViewHolder>() {

    var onSegmentSelectedListener: OnSegmentSelectedListener? = null

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SegmentViewHolder =
            SegmentViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.videocrop_segment_item, parent, false))

    override fun getItemCount(): Int = segments

    override fun onBindViewHolder(holder: SegmentViewHolder, position: Int) { 
        holder.from!!.setOnClickListener {
            holder.from!!.text = onSegmentSelectedListener!!.onSelectFrom(holder.adapterPosition)
        }
        holder.to!!.setOnClickListener {
            holder.to!!.text = onSegmentSelectedListener!!.onSelectTo(holder.adapterPosition)
        }
    }

    class SegmentViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var from: Button? = null
        var to: Button? = null

        init {
            from = itemView.findViewById(R.id.videoCropSegmentItemFromButton)
            to = itemView.findViewById(R.id.videoCropSegmentItemToButton)
        }
    }
}


Код интерфейса обратного вызова

interface OnSegmentSelectedListener {
    fun onSelectFrom(index:Int):Int?
    fun onSelectTo(index:Int):Int?
}


когда я нажимаю кнопку первого элемента, и его текст становится «0»
enter image description here


, затем я прокручиваю вниз до последнего элемента и вижу последний элемент также обновляется
enter image description here



Я также проверил этот вопрос, но он не помог.


Я был бы очень благодарен, если бы кто-нибудь помог мне

1 Ответ

1 голос
/ 08 февраля 2020

Ваш onBindViewHolder метод не обрабатывает переработанные представления. Вам нужно каждый раз устанавливать текст в onBindViewHolder на основе данных поддержки, а не просто устанавливать его в прослушивателе кликов, потому что вы можете получить itemView повторно из другого элемента (в данном случае первый пункт, где вы изменили текст).

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