不像ListView那样有自带的item点击处理事件,RecycleView是没有的,得自己去实现。这里介绍俩个我自己平时用的方式。
第一种
这种就很简单了,直接在RecycleView.Adapter里的onBindViewHolder方法里调用事件就行
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val viewholder = holder as viewHolder
//每个 RecyclerView.ViewHolder 对象都有一个关联的 itemView,它是一个 View 类型的实例,代表列表中的单个列表项布局。
viewholder.itemView.setOnClickListener{
//TODO
}
}
第二种
这种是用了DataBinding的,了解MVVM模式的同学应该都知道DataBinding是什么,它是实现MVVM模式重要的工具。下面的方法我就当大家都了解DataBinding了,不去做多余的解释了。
我们可以先把要实现的方法新建一个类去实现它
class MainMenuClickHandler {
fun onLongClickItem(v: View,program: TvProgram):Boolean {
AlertDialog.Builder(v.context)
.setTitle("Add to Favorites")
.setMessage("Do you want to add this item to your favorites?")
.setPositiveButton("Yes") { dialog, which ->
var favoriteProgram = FavoriteProgram()
favoriteProgram.mTsFileId = program.mTsFileId
favoriteProgram.mIsFavorite = true
favoriteProgram.mTitle = program.mTvProgramNumberAndName
Thread{
MyApplication.getInstance().getDatabase().favoriteProgramDao().insert(favoriteProgram)
}.start()
}
.setNegativeButton("No", null).create().show()
return true
}
}
然后在布局文件引入这个类
<data>
<variable
name="onItemLongClick"
type="com.shun.handler.MainMenuClickHandler" />
</data>
接着你Item的布局文件得绑定这个类
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val binding = DataBindingUtil.inflate<ItemProgramListBinding>(LayoutInflater.from(parent.context),
R.layout.item_program_list, parent, false)
binding.onItemLongClick = MainMenuClickHandler()
return ViewHolder(binding)
}
然后在你item布局里添加这个事件
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@drawable/selector_list_bg"
android:id="@+id/ll_program_item"
android:clickable="true"
android:focusable="true"
android:onLongClick="@{ (v) -> onItemLongClick.onLongClickItem(v) }">
其实这种方式绝大多数的事件处理都能这样用,乍看之下,是不是麻烦了很多,也确实是这样,这样把事件处理抽出来的方式主要是给activity瘦身,方便好维护。