RecycleView的点击事件处理

不像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瘦身,方便好维护。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现RecycleView嵌套RecycleView点击事件,需要在Adapter中设置点击事件监听器,并将其传递给子RecycleView的Adapter。 首先,在父RecycleView的Adapter中,实现一个接口来处理子RecycleView点击事件。例如: ``` public interface OnChildClickListener { void onChildClick(View view, int parentPosition, int childPosition); } ``` 然后,在父RecycleView的Adapter中,设置一个OnChildClickListener对象,并在点击事件中调用它: ``` public class ParentAdapter extends RecyclerView.Adapter<ParentAdapter.ViewHolder> { private ArrayList<ArrayList<String>> mData; private OnChildClickListener mChildClickListener; public ParentAdapter(ArrayList<ArrayList<String>> data) { mData = data; } public void setOnChildClickListener(OnChildClickListener listener) { mChildClickListener = listener; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // create a new view View v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.parent_item, parent, false); ViewHolder vh = new ViewHolder(v); return vh; } @Override public void onBindViewHolder(ViewHolder holder, final int position) { // set the data for each item in the view holder ArrayList<String> childData = mData.get(position); ChildAdapter childAdapter = new ChildAdapter(childData); childAdapter.setOnChildClickListener(new ChildAdapter.OnChildClickListener() { @Override public void onChildClick(View view, int childPosition) { // pass the click event to the parent adapter if (mChildClickListener != null) { mChildClickListener.onChildClick(view, position, childPosition); } } }); holder.childRecyclerView.setAdapter(childAdapter); } public static class ViewHolder extends RecyclerView.ViewHolder { RecyclerView childRecyclerView; public ViewHolder(View v) { super(v); childRecyclerView = (RecyclerView) v.findViewById(R.id.child_recycler_view); } } } ``` 在上面的代码中,我们在onBindViewHolder()方法中创建一个ChildAdapter,并将其设置为子RecycleView的Adapter。同时,我们还设置了一个OnChildClickListener对象,并在ChildAdapter中调用它来处理子RecycleView点击事件。 接下来,我们需要在ChildAdapter中设置一个OnChildClickListener对象,并在点击事件中调用它: ``` public class ChildAdapter extends RecyclerView.Adapter<ChildAdapter.ViewHolder> { private ArrayList<String> mData; private OnChildClickListener mChildClickListener; public ChildAdapter(ArrayList<String> data) { mData = data; } public void setOnChildClickListener(OnChildClickListener listener) { mChildClickListener = listener; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // create a new view View v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.child_item, parent, false); ViewHolder vh = new ViewHolder(v); return vh; } @Override public void onBindViewHolder(ViewHolder holder, final int position) { // set the data for each item in the view holder String item = mData.get(position); holder.textView.setText(item); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // pass the click event to the parent adapter if (mChildClickListener != null) { mChildClickListener.onChildClick(view, position); } } }); } public static class ViewHolder extends RecyclerView.ViewHolder { TextView textView; public ViewHolder(View v) { super(v); textView = (TextView) v.findViewById(R.id.text_view); } } public interface OnChildClickListener { void onChildClick(View view, int childPosition); } } ``` 在上面的代码中,我们在onBindViewHolder()方法中设置了一个点击事件监听器,并在点击事件中调用了OnChildClickListener对象来处理点击事件。 最后,在Activity或Fragment中,我们需要设置ParentAdapter的OnChildClickListener对象,并在回调方法中处理点击事件: ``` parentAdapter.setOnChildClickListener(new ParentAdapter.OnChildClickListener() { @Override public void onChildClick(View view, int parentPosition, int childPosition) { // handle the child item click event here } }); ``` 在上面的代码中,我们设置了一个ParentAdapter的OnChildClickListener对象,并在回调方法中处理子RecycleView点击事件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值