我的活动中有一个Recyclerview。它总是有10个项目。 Recyclerview的项有两个按钮,每个按钮的单击侦听器在适配器类的onBindViewHolder
方法中定义。单击任何项目的按钮后,它将调用活动方法的onCreate
方法中实现的回调方法。回调方法将adapterPosition
传递给活动,活动会返回一个长值,而我会以此来更新按钮的文本。问题是,当我单击recyclerview的第一项按钮时,它将更新第一项和最后一项的文本。首先,我使用了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?
}
我也检查了this问题,但没有帮助。
如果有人帮助我,我将非常感激]
您的onBindViewHolder
方法未处理回收的视图。您需要每次都基于后备数据在onBindViewHolder
中设置文本,而不仅仅是在点击监听器中进行设置,因为您可能会从其他项目中重用itemView
(在这种情况下,第一个您更改了文字的项目)。