我们知道ListView 有提供像setOnItemClickListener()和setOnItemLongClickListener()这样的点击事件,可以直接使用,但是RecyclerView没有提供,所以很明显,我们得自己写接口回调。确切的说,是在adapter里面写接口回调。 其实思路就是直接用在itemview里面设置setOnClickListener()即可。
首先是定义回调接口
interface OnItemClickListener {
fun onItemClick(view: View?, holder: RecyclerView.ViewHolder?, position: Int)
fun onItemLongClick(view: View?, holder: RecyclerView.ViewHolder?, position: Int): Boolean
}
然后在adpter里面设置方法
var mOnItemClickListener: OnItemClickListener? = null
fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) {
mOnItemClickListener = onItemClickListener
}
这里要注意一下,回调的操作一般建议在onCreateViewHolder方法里面执行,如下
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HomeViewHolder {
val itemView: View = LayoutInflater.from(this@RecyclerviewActivity)
.inflate(R.layout.item_rv_txt, parent, false)
val holder = HomeViewHolder(itemView)
itemView.setOnClickListener { v ->
mOnItemClickListener?.onItemClick(v, holder, holder.adapterPosition)
}
itemView.setOnLongClickListener(View.OnLongClickListener { v ->
if (mOnItemClickListener != null) {
return@OnLongClickListener mOnItemClickListener!!.onItemLongClick(v, holder, holder.adapterPosition)
}
false
})
return holder
}
之后在Actviity里面设置回调监听,那么点击事件的设置就ok搞定了。
recyclerview.layoutManager = LinearLayoutManager(this)
recyclerview.addItemDecoration(MyItemDecoration(this, RecyclerView.VERTICAL))
recyclerview.itemAnimator = DefaultItemAnimator()
homeAdapter = HomeAdapter()
recyclerview.adapter = homeAdapter
homeAdapter!!.setOnItemClickListener(object : OnItemClickListener {
override fun onItemClick(view: View?, holder: RecyclerView.ViewHolder?, position: Int) {
Toast.makeText(this@RecyclerviewActivity, "点击第" + position + "个", Toast.LENGTH_SHORT).show()
}
override fun onItemLongClick(view: View?, holder: RecyclerView.ViewHolder?, position: Int): Boolean {
Toast.makeText(this@RecyclerviewActivity, "长按第" + position + "个", Toast.LENGTH_SHORT).show()
return true
}
})
git地址:https://gitee.com/stonezry/AndroidDemo
欢迎关注本人公众号和小程序,谢谢