android - 正确实现 RecyclerView 适配器的点击监听器
问题描述
RecyclerView
为适配器中的项目创建点击侦听器的正确方法是什么?本教程说应该完成,onBindViewHolder
但其他人已经说过,onCreateViewHolder
我没有看到后者的任何教程,因此我很困惑。
class MyRVAdapter(private val myList: ArrayList<Item>) : RecyclerView.Adapter<MyRVAdapter.ViewHolder>() {
override fun getItemCount(): Int {
return myList.size
}
class ViewHolder (itemView : View):RecyclerView.ViewHolder(itemView) {
// val myButton = itemView.findViewById<Button>(R.id.btn_A)!!
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.myButton.text = (myList[position].btnTitle)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val v = LayoutInflater.from(parent.context).inflate(R.layout.my_cv, parent, false)
return ViewHolder(v)
val myButton = v.findViewById<Button>(R.id.btn_A)!!
myButton.setOnClickListener {
customView = View.inflate(holder.itemView.context, R.layout.fragment_dialog, null)
val builder = AlertDialog.Builder(holder.itemView.context)
builder.setIconAttribute(R.attr.imgInfo)
builder.setTitle(R.string.dialog_title)
builder.setView(customView)
builder.setPositiveButton(android.R.string.ok){ dialog, _ -> dialog.dismiss() }
builder.show()
}
}
}
解决方案
onBindViewHolder()
当您的视图出现在屏幕上时,将一直调用它,因此它被调用的次数超过您的项目计数。滚动时,您将创建许多重复的侦听器。在 ViewHolder 中设置监听器将为每个持有者创建一个监听器。这是代码:
class MyRVAdapter() : RecyclerView.Adapter<MyRVAdapter.ViewHolder>() {
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.myButton.text = "set here all except listener"
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val v = LayoutInflater.from(parent.context).inflate(R.layout.my_cv, parent, false)
return ViewHolder(v)
}
override fun getItemCount(): Int {
return myList.size
}
class ViewHolder (itemView: View) : RecyclerView.ViewHolder(itemView) {
var myButton: Button = itemView.findViewById(R.id.btn_A)
init {
myButton.setOnClickListener {
val customView = View.inflate(itemView.context, R.layout.fragment_dialog, null)
val builder = AlertDialog.Builder(itemView.context)
builder.setIconAttribute(R.attr.imgNight)
builder.setTitle(R.string.dialog_title)
builder.setView(customView)
builder.setPositiveButton(android.R.string.ok){ dialog, _ -> dialog.dismiss() }
builder.show()
val tabLayout = customView.findViewById(R.id.mTabLayout)
val viewPager = customView.findViewById(R.id.mViewPager)
val adapter = TabbedDialogAdapter(childFragmentManager)//i dont understand how you get this but it is another question
adapter.addFragment("Tab A", TabbedDialogFragment.createInstance("Description A"))
adapter.addFragment("Tab B", TabbedDialogFragment.createInstance("Description B"))
adapter.addFragment("Tab C", TabbedDialogFragment.createInstance("Description C"))
viewPager.adapter = adapter
tabLayout.setupWithViewPager(viewPager)
}
}
}
}
推荐阅读
- mysql - 从具有条件的mysql表中获取特定行
- java - JBOSS EAP 7.1 连接到 oracle 12c 数据库
- jena - 在 Pellet (Openllet) 和 Jena 中,如何更改 SWRL 规则?
- javascript - 通过 url 访问滑块中的幻灯片
- winforms - Windows 窗体中的资源
- angular - 如何使用 VS Code 和 tfs 连接到团队项目以进行 Angular 项目
- amazon-athena - Amazon Athena 无法从分区读取数据
- php - 仅在 chrome 上加载时间很慢
- laravel-5 - 使用 laravel 在 hasMany 关系中用外键覆盖主键
- r - 如何从多个每日 TRMM netcdf 文件中排序和创建栅格堆栈