Android Recyclerview的最后一项通过更新第一项进行更新

问题描述 投票:0回答:1

我的活动中有一个Recyclerview。它总是有10个项目。 Recyclerview的项有两个按钮,每个按钮的单击侦听器在适配器类的onBindViewHolder方法中定义。单击任何项​​目的按钮后,它将调用活动方法的onCreate方法中实现的回调方法。回调方法将adapterPosition传递给活动,活动会返回一个长值,而我会以此来更新按钮的文本。问题是,当我单击recyclerview的第一项按钮时,它将更新第一项和最后一项的文本。首先,我使用了position,但后来将其更改为adapterPositionlayoutPosition,但是没有用。有时,最后一个项目之前的项目会更新,有时最后一个项目会随着第一项目的更新而更新]

活动的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

我也检查了this问题,但没有帮助。

如果有人帮助我,我将非常感激]

android android-recyclerview position
1个回答
0
投票

您的onBindViewHolder方法未处理回收的视图。您需要每次都基于后备数据在onBindViewHolder中设置文本,而不仅仅是在点击监听器中进行设置,因为您可能会从其他项目中重用itemView(在这种情况下,第一个您更改了文字的项目)。

© www.soinside.com 2019 - 2024. All rights reserved.