千家信息网

Adapter 中如何为RecyclerView添加单击事件

发表于:2025-02-07 作者:千家信息网编辑
千家信息网最后更新 2025年02月07日,Adapter 中如何为RecyclerView添加单击事件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。RecyclerView 的每
千家信息网最后更新 2025年02月07日Adapter 中如何为RecyclerView添加单击事件

Adapter 中如何为RecyclerView添加单击事件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

RecyclerView 的每个Item的点击事件并没有像 ListView 一样封装在组件中,需要 Item 的单击事件时就需要自己去实现,在 Adapter 中为RecyclerView 添加单击事件参考如下:

第一步:

在 RecyclerView 的 Adapyer 中定义单击事件的回调接口:

/** * 定义 RecyclerView 选项单击事件的回调接口 */public interface OnItemClickListener{    //参数(父组件,当前单击的View,单击的View的位置,数据)    void onItemClick(RecyclerView parent,View view, int position, String data);}
第二步:

在RecyclerView的Adapyer中声明该接口,并提供setter方法:

private OnItemClickListener onItemClickListener;public void setOnItemClickListener(OnItemClickListener onItemClickListener){    this.onItemClickListener = onItemClickListener;}
第三步:

在RecyclerView的Adapyer类实现View.OnClickListener接口,并重写onClick(View view)方法,然后设置给接口的事件监听:

public class RvAdapter1 extends RecyclerView.Adapter implements View.OnClickListener{    ...    view.setOnClickListener(this);//设置监听器    ...    @Override    public void onClick(View view) {        //根据RecyclerView获得当前View的位置        int position = recyclerView.getChildAdapterPosition(view);        //程序执行到此,会去执行具体实现的onItemClick()方法        if (onItemClickListener!=null){            onItemClickListener.onItemClick(recyclerView,view,position,mList.get(position));        }    }    ...}
第四步:

在MainActivity中通过Adapter设置每个Item的单击事件:

adapter.setOnItemClickListener(new RvAdapter1.OnItemClickListener() {    @Override    public void onItemClick(RecyclerView parent, View view, int position, String data) {        Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show();    }});
参考代码
Adapter
/** * Created by jzman on 2017/5/13 0013. * RecycleView的Adapter */public class RvAdapter1 extends RecyclerView.Adapter implements View.OnClickListener{    private Context mContext;    private RecyclerView recyclerView;    private ArrayList mList;    public RvAdapter1() {}    public RvAdapter1(Context mContext, ArrayList mList) {        this.mContext = mContext;        this.mList = mList;    }    /**     * 用于创建ViewHolder     * @param parent     * @param viewType     * @return     */    @Override    public DataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View view = LayoutInflater.from(mContext).inflate(R.layout.item,null);        view.setOnClickListener(this);        //使用代码设置宽高(xml布局设置无效时)        view.setLayoutParams(new ViewGroup.LayoutParams(                ViewGroup.LayoutParams.MATCH_PARENT,                ViewGroup.LayoutParams.WRAP_CONTENT));        DataViewHolder holder = new DataViewHolder(view);        return holder;    }    /**     * 绑定数据     * @param holder     * @param position     */    @Override    public void onBindViewHolder(DataViewHolder holder, int position) {        holder.tv_data.setText(mList.get(position));    }    /**     * 选项总数     * @return     */    @Override    public int getItemCount() {        return mList.size();    }    @Override    public void onClick(View view) {        //根据RecyclerView获得当前View的位置        int position = recyclerView.getChildAdapterPosition(view);        //程序执行到此,会去执行具体实现的onItemClick()方法        if (onItemClickListener!=null){            onItemClickListener.onItemClick(recyclerView,view,position,mList.get(position));        }    }    /**     * 创建ViewHolder     */    public static class DataViewHolder extends RecyclerView.ViewHolder{        TextView tv_data;        public DataViewHolder(View itemView) {            super(itemView);            tv_data = (TextView) itemView.findViewById(R.id.tv_recycle);        }    }    private OnItemClickListener onItemClickListener;    public void setOnItemClickListener(OnItemClickListener onItemClickListener){        this.onItemClickListener = onItemClickListener;    }    /**     * 定义RecyclerView选项单击事件的回调接口     */    public interface OnItemClickListener{        //参数(父组件,当前单击的View,单击的View的位置,数据)        void onItemClick(RecyclerView parent,View view, int position, String data);    }    /**     *   将RecycleView附加到Adapter上     */    @Override    public void onAttachedToRecyclerView(RecyclerView recyclerView) {        super.onAttachedToRecyclerView(recyclerView);        this.recyclerView= recyclerView;    }    /**     *   将RecycleView从Adapter解除     */    @Override    public void onDetachedFromRecyclerView(RecyclerView recyclerView) {        super.onDetachedFromRecyclerView(recyclerView);        this.recyclerView = null;    }}
MainActivity
/** * Created by jzman on 2017/5/13 0013. */public class MainActivity extends AppCompatActivity {    private RecyclerView rv;    RvAdapter1 adapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        rv = (RecyclerView) findViewById(R.id.rv);        //设置布局管理器//        rv.setLayoutManager(new LinearLayoutManager(this));//线性        rv.setLayoutManager(new GridLayoutManager(this,4));//线性//        rv.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));//线性        adapter = new RvAdapter1(this,initData());        adapter.setOnItemClickListener(new RvAdapter1.OnItemClickListener() {            @Override            public void onItemClick(RecyclerView parent, View view, int position, String data) {                Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show();            }        });        rv.setAdapter(adapter);    }    public static ArrayList initData(){        ArrayList arrayList = new ArrayList<>();        for (int i=0;i<50;i++){            arrayList.add("第"+i+"条数据");        }        return arrayList;    }}
显示效果

看完上述内容,你们掌握Adapter 中如何为RecyclerView添加单击事件的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

0