Kotlin Android Studio-手柄按钮在recyclerView适配器内单击 [英] Kotlin Android Studio - handle button click inside recyclerView adapter
问题描述
我有一个名为ArticleAdapter
import kotlinx.android.synthetic.main.articlerecycler_item.view.*
class ArticleAdapter(private val controller: IController) : RecyclerView.Adapter<ArticleViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ArticleViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.articlerecycler_item, parent, false)
return ArticleViewHolder(view)
}
// How implement a button click for `btnSave`
/** Called when the user taps the Save button */
btnSave.setOnClickListener(){
(R.layout.articlerecycler_item)
AlertDialog.Builder(this)
.setMessage("Article Saved.")
.create()
.show()
// Do something in response to button click
}
override fun getItemCount(): Int {
return controller.articles.size
}
override fun onBindViewHolder(holder: ArticleViewHolder, position: Int) {
val article: Article = controller.articles[position]
if(article.title.length > 100) {
holder.itemView.titleTv.text = "${article.title.substring(0, 99)}..."
} else {
holder.itemView.titleTv.text = article.title
}
holder.itemView.authorTv.text = article.author
}
}
class ArticleViewHolder(view: View?) : RecyclerView.ViewHolder(view)
然后在我的recyclerView布局中,有一个按钮
Then in my recyclerView layout I have a button
<Button
android:id="@+id/btnSave"
android:layout_width="70dp"
android:layout_height="40dp"
android:onClick="btnSave"
android:text="@string/save"
android:textAlignment="center" />
我可以在onBindViewHolder
内部处理事件吗?我不确定如何在我的recyclerView适配器中实现侦听器
Do I handle the event inside onBindViewHolder
? I'm not sure how to implement the listener within my recyclerView adapter
推荐答案
处理适配器单击的一个好方法是将它们传递给创建它们的活动或片段.
A good solution to handle the items click of an adapter is to pass them to the activity or fragment which has created them.
通过kotlin,您可以使用函数定义而不是接口来进行此简单的工作,因此在适配器类内部添加函数类型的var
:
With kotlin you can use function definition instead of an interface for this simple work, so inside your adapter class add a var
of a function type:
private var listener: ((item: DataClass) -> Unit)? = null
fun setOnItemClickListener(listener: (item: DataClass) -> Unit) {
this.listener = listener
}
在ViewHolder
类中设置侦听器,如下所示:
And inside the ViewHolder
class set the listener, something like below:
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
init {
itemView.btn_save.setOnClickListener { listener?.invoke(data[adapterPosition]) }
}
// ...
}
最后,在您的活动或片段中,您可以通过添加新的侦听器轻松访问项目:
Finally inside your activity or fragment you can easily access the items by adding a new listener:
adapter.setOnItemClickListener { it -> TODO() }
请注意,在ViewHolder
构造函数(init
)中设置侦听器效率更高,因为不必为每个数据绑定都设置侦听器.
Notice that setting listeners inside ViewHolder
constructor(init
) is more efficient as it is not necessary to set a listener for every data binding.
这篇关于Kotlin Android Studio-手柄按钮在recyclerView适配器内单击的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!