Android-RecyclerView系列 RecyclerView控件Item点击事件全解

愿所有人都摆脱冷气,只是向上走,不必听自暴自弃者流的话

(一)原理讲解:

为RecyclerView的每个子item设置setOnClickListener,然后在onClick中再调用一次对外封装的接口,将这个事件传递给外面的调用者。

传递给外面的调用者:Activity / Fragment
而非Adapter内部直接设置Item点击事件

(二)逻辑代码实战

代码构建位置:RecyclerView的Adapter中

第一步:首先要定义一个对外(Activity/Fragment)的接口,并声明一个变量,该接口需要实现onItemClick方法。

    /**
     * 在Activity中设置item点击事件的方法第一步:
     * 第一步,定义接口,在activity里面使用setOnItemClickListener方法并创建此接口的对象、实现其方法
     */
    public static interface OnItemClickListener {
    	//接口方法里面的参数,可以传递任意你想回调的数据,不止View 和 Item 的位置position
        void onItemClick(View view, int position);
    }
  • 声明变量
//接口名称:上面定义的接口名
private OnItemClickListener mOnItemClickListener;

第二步:在Adapter类中定义一个方法,供Activity/Fragment访问,使用 Adapter.setOnItemClickListener方法设置点击事件【相当于get/set方法中的set方法,Activity/Fragment设置接口】

    /**
     * 第二步,为Activity提供设置OnItemClickListener的接口
     */
    public void setOnItemClickListener(OnItemClickListener listener) {
        mOnItemClickListener = listener;
    }

第三步:在onCreateViewHolder方法中为View设置点击事件

        /**
         * 第三步,得到item的布局,然后为其设置OnClickListener监听器
         */
        View itemRoot = LayoutInflater.from(context).inflate(R.layout.recyclerview_csdn, parent, false);
        itemRoot.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /**
                 * 第五步,使用getTag方法获取点击的item的position
                 */
                if (mOnItemClickListener != null) {
					//参数v即创建的View视图,依次生成的item,这里是获取Tag,设置Tag需要在绑定的ViewHolder方法中处理Tag
                    mOnItemClickListener.onItemClick(v, (int) v.getTag());
                }
            }
        });

第四步:在绑定ViewHolder的时候要通过setTag的方法保存用户点击的item的position

        /**
         * 第四步,将position保存在itemView的Tag中,以便点击时进行获取
         */
        holder.itemView.setTag(position);

第五步:最后在第三步中的onClick方法中调用OnItemClickListener的onItemClick方法,因为在Activity中是要实现此方法,所以调用的其实是开发者自己定义的内容。

//这里是展示代码,实际已经布置在了第三步onCreateViewHolder的方法中,可忽略这一步
if (mOnItemClickListener != null) {
 mOnItemClickListener.onItemClick(v, (int) v.getTag());
}

第六步:在Activity中使用

创建一个MyRecyclerViewAdapter类的对象mAdapter,然后调用mAdapter.setOnItemClickListener方法并实现其onItemClick方法即可。

(三)完整代码

/**
 * Created by 彭老希 on 2021/3/24.
 */
 
public class MyRecycleViewAdapter extends RecyclerView.Adapter<MyRecycleViewAdapter.MyViewHolder> {
    private Context context;
    private String[] itemText;
    private int[] itemImg;
 
    private OnItemClickListener mOnItemClickListener;
 
    /**
     * 构造方法
     *
     * @param context
     * @param itemImg
     * @param itemText
     */
    public MyRecycleViewAdapter(Context context, int[] itemImg, String[] itemText) {
        this.context = context;
        this.itemImg = itemImg;
        this.itemText = itemText;
    }
 
    /**
     * @param parent
     * @param viewType
     * @return
     */
    @Override
    public MyViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
        /**
         * 第三步,得到item的布局,然后为其设置OnClickListener监听器
         */
        View itemRoot = LayoutInflater.from(context).inflate(R.layout.recyclerview_csdn, parent, false);
        MyViewHolder mViewHolder = new MyViewHolder(itemRoot);
        itemRoot.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /**
                 * 第五步,使用getTag方法获取点击的item的position
                 */
                if (mOnItemClickListener != null) {
                    mOnItemClickListener.onItemClick(v, (int) v.getTag());
                }
            }
        });
        return mViewHolder;
    }
 
    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
 
        holder.img.setImageDrawable(context.getResources().getDrawable(itemImg[position]));
        holder.text.setText(itemText[position]);
        /**
         * 第四步,将position保存在itemView的Tag中,以便点击时进行获取
         */
        holder.itemView.setTag(position);
    }
 
 
    @Override
    public int getItemCount() {
        return itemImg.length;
    }
 
    /**
     * 在Activity中设置item点击事件的方法第一步:
     * 第一步,定义接口,在activity里面使用setOnItemClickListener方法并创建此接口的对象、实现其方法
     */
    public static interface OnItemClickListener {
        void onItemClick(View view, int position);
    }
 
    /**
     * 第二步,为Activity提供设置OnItemClickListener的接口
     *
     * @param listener
     */
    public void setOnItemClickListener(OnItemClickListener listener) {
        mOnItemClickListener = listener;
    }
 
 
    class MyViewHolder extends RecyclerView.ViewHolder {
        ImageView img;
        TextView text;
 
        public MyViewHolder(View itemView) {
            super(itemView);
            img = (ImageView) itemView.findViewById(R.id.img_recycleView);
            text = (TextView) itemView.findViewById(R.id.tv_recycleView);
 
        }
    }
}
  • 布局代码 recyclerview_csdn.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
 
    <ImageView
        android:id="@+id/img_recycleView"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center"/>
 
    <TextView
        android:id="@+id/tv_recycleView"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:textSize="25sp"
        android:paddingLeft="10dp"
        android:gravity="center_vertical" />
</LinearLayout>
  • Activity/Fragment中使用
		//设置适配器 context:可换成getContext itemImg :图片资源【可同步删除Adapter的构造方法参数即可】 itemText : 文字数据 【可同步删除Adapter的构造方法参数即可】 
		//通过Adapter的构造函数,Activity / Fragment 活动传入参数
        mAdapter = new MyRecycleViewAdapter(context, itemImg, itemText);
        recyclerView.setAdapter(mAdapter);
 
        mAdapter.setOnItemClickListener(new MyRecycleViewAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
				//自定义Toast
                Toast toast = new Toast(context);
                //R.layout.toast 自己定义的Toast吐司布局
                View v = LayoutInflater.from(context).inflate(R.layout.toast,null,false);
                toast.setView(v);
                TextView toast_tv = (TextView) v.findViewById(R.id.toast_tv);
                toast_tv.setText("item"+position);
                toast.show();
            }
        });
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

其子昱舟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值