RecyclerView的item点击事件监听器

来源:互联网 发布:吉林十一选五遗漏数据 编辑:程序博客网 时间:2024/06/04 04:46

最终目的

模拟ListView的setOnItemClickListener()方法,调用者只须调用类似于setOnItemClickListener的东西就能获得被点击item的相关数据。(在Activity中使用Adapter.setOnItemClickListener方法,传入自己写的MyRecycleViewAdapter类的对象,然后实现里面的onItemClick(View view, int position)方法,MyRecycleViewAdapter extends RecyclerView.Adapter <MyRecycleViewAdapter.MyViewHolder>

原理

为RecyclerView的每个子item设置setOnClickListener,然后在onClick中再调用一次对外封装的接口,将这个事件传递给外面的调用者。而“为RecyclerView的每个子item设置setOnClickListener”在Adapter中设置。其实直接在onClick中也能完全处理item的点击事件,但是这样会破坏代码的逻辑。

步骤

先说说 RecyclerView.Adapter 中。

第一步:首先要定义一个接口并声明一个变量,此接口需要用户自己实现onItemClick方法。

    /**     * 在Activity中设置item点击事件的方法第一步:     * 第一步,定义接口,在activity里面使用setOnItemClickListener方法并创建此接口的对象、实现其方法     */    public static interface OnItemClickListener {        void onItemClick(View view, int position);    }
声明变量
private OnItemClickListener mOnItemClickListener;

第二步:然后在Adapter类中定义一个方法,供activity访问,使用Adapter.setOnItemClickListener方法设置点击事件

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


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

        /**         * 第三步,得到item的布局,然后为其设置OnClickListener监听器         */        View itemRoot = LayoutInflater.from(context).inflate(R.layout.recycleview_cell, parent, false);        itemRoot.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                /**                 * 第五步,使用getTag方法获取点击的item的position                 */                if (mOnItemClickListener != null) {                    mOnItemClickListener.onItemClick(v, (int) v.getTag());                }            }        });

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

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

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

第五步的代码在第三步中一起给出了,这里就不再给出了。


在Activity中使用:

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


完整代码

MyRecyclerViewAdapter.java

package com.example.passwordprotecttest;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;/** * Created by 高信朋 on 2017/8/5. */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.recycleview_cell, 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_cell.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>

SysSetActivity.java中的部分相关代码:

//        设置适配器        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);                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();            }        });

原创粉丝点击