在 ViewHolder 中实现点击监听器并访问关联项
Implement On Click Listener in ViewHolder With Access To Associated Item
我听说在 ViewHolder
中实现 onClickListener
是一种很好的做法。但是,我不确定如何访问与 onClickListener
内部的 ViewHolder
关联的项目。
例如:
import android.content.Context
import androidx.recyclerview.widget.RecyclerView
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import kotlinx.android.synthetic.main.post.view.*
import rstudio.vedantroy.swarm.MainActivity.Companion.TAG
class PostAdapter(private val items : List<Post>, private val contex: Context) : RecyclerView.Adapter<MyViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
return MyViewHolder(LayoutInflater.from(contex).inflate(R.layout.post, parent, false))
}
override fun getItemCount(): Int {
return items.size
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.bodyContent.text = items[position].content
}
}
class MyViewHolder(view: View): RecyclerView.ViewHolder(view), View.OnClickListener {
override fun onClick(v: View?) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
val bodyContent : TextView = view.bodyContent
}
如何访问 items
,以及如何找到 ViewHolder
的当前索引?
我看了这个例子:,但是没有解释 mDataSource
来自哪里。
我通过移动 PostViewHolder
的位置设法实现了此行为。但是,我不确定 inner class
是否会破坏某些东西。
package rstudio.vedantroy.swarm
import android.content.Context
import androidx.recyclerview.widget.RecyclerView
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.cardview.widget.CardView
import kotlinx.android.synthetic.main.post.view.*
import rstudio.vedantroy.swarm.MainActivity.Companion.TAG
class PostAdapter(private val items : List<Post>, private val contex: Context) : RecyclerView.Adapter<PostAdapter.PostViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PostViewHolder {
return PostViewHolder(LayoutInflater.from(contex).inflate(R.layout.post, parent, false))
}
override fun getItemCount() = items.size
override fun onBindViewHolder(holder: PostViewHolder, position: Int) {
holder.bodyContent.text = items[position].content
}
inner class PostViewHolder(view: View): RecyclerView.ViewHolder(view) {
val bodyContent : TextView = view.bodyContent
init {
view.apply {
setOnClickListener {
isClickable = false
Log.d(TAG, "Clicked!")
}
}
}
}
}
我个人认为一个好的解决方案是在 onBindViewHolder
.
中设置 OnClickListener
例如,
// ... adapter class ...
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.view.apply {
bodyContent.text = items[position].content
setOnClickListener {
// TODO Handle onClick
}
}
}
class ViewHolder(val view: View) : RecyclerView.ViewHolder(view)
此外,我发现只需将 view
存储在 ViewHolder
中就可以非常轻松地访问布局中的任何元素。
我听说在 ViewHolder
中实现 onClickListener
是一种很好的做法。但是,我不确定如何访问与 onClickListener
内部的 ViewHolder
关联的项目。
例如:
import android.content.Context
import androidx.recyclerview.widget.RecyclerView
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import kotlinx.android.synthetic.main.post.view.*
import rstudio.vedantroy.swarm.MainActivity.Companion.TAG
class PostAdapter(private val items : List<Post>, private val contex: Context) : RecyclerView.Adapter<MyViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
return MyViewHolder(LayoutInflater.from(contex).inflate(R.layout.post, parent, false))
}
override fun getItemCount(): Int {
return items.size
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.bodyContent.text = items[position].content
}
}
class MyViewHolder(view: View): RecyclerView.ViewHolder(view), View.OnClickListener {
override fun onClick(v: View?) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
val bodyContent : TextView = view.bodyContent
}
如何访问 items
,以及如何找到 ViewHolder
的当前索引?
我看了这个例子:mDataSource
来自哪里。
我通过移动 PostViewHolder
的位置设法实现了此行为。但是,我不确定 inner class
是否会破坏某些东西。
package rstudio.vedantroy.swarm
import android.content.Context
import androidx.recyclerview.widget.RecyclerView
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.cardview.widget.CardView
import kotlinx.android.synthetic.main.post.view.*
import rstudio.vedantroy.swarm.MainActivity.Companion.TAG
class PostAdapter(private val items : List<Post>, private val contex: Context) : RecyclerView.Adapter<PostAdapter.PostViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PostViewHolder {
return PostViewHolder(LayoutInflater.from(contex).inflate(R.layout.post, parent, false))
}
override fun getItemCount() = items.size
override fun onBindViewHolder(holder: PostViewHolder, position: Int) {
holder.bodyContent.text = items[position].content
}
inner class PostViewHolder(view: View): RecyclerView.ViewHolder(view) {
val bodyContent : TextView = view.bodyContent
init {
view.apply {
setOnClickListener {
isClickable = false
Log.d(TAG, "Clicked!")
}
}
}
}
}
我个人认为一个好的解决方案是在 onBindViewHolder
.
OnClickListener
例如,
// ... adapter class ...
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.view.apply {
bodyContent.text = items[position].content
setOnClickListener {
// TODO Handle onClick
}
}
}
class ViewHolder(val view: View) : RecyclerView.ViewHolder(view)
此外,我发现只需将 view
存储在 ViewHolder
中就可以非常轻松地访问布局中的任何元素。