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; }
/** * 第三步,得到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方法即可。
完整代码
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(); } });
- RecyclerView的item点击事件监听器
- 实现RecyclerView的item点击事件的内部监听器
- RecyclerView的添加点击item的监听器
- RecyclerView Item 的点击事件
- RecyclerView的item点击事件
- RecyclerView的item点击事件
- RecyclerView的item点击事件
- RecyclerView的Item点击事件
- RecyclerView的item点击事件
- RecyclerView的item的点击事件
- 设置RecyclerView的item的点击事件
- 自定义RecyclerView的item的点击事件
- 为RecyclerView添加item的点击事件
- 为RecyclerView添加item的点击事件
- 为RecyclerView添加item的点击事件
- 为RecyclerView添加item的点击事件
- 为RecyclerView添加item的点击事件
- 为RecyclerView的item创建点击事件
- MySQL创建和删除索引的语法
- Win10下安装Ubuntu16.04双系统
- 递归实现十进制数转十六进制数
- pandas 第2课
- I/O流
- RecyclerView的item点击事件监听器
- codevs 2439 降雨量 (RMQ+离散化+令人窒息的分类讨论)
- 中国基准、基本气象站列表2012版
- jstack 监控工具
- 菜鸟心历之路(9)
- 在大学老师布置的一些题目,欢迎各位大佬指正(3)
- 1233 还是畅通工程 prim算法
- 关于springIOC控制反转,依赖注入
- Spring MVC中ajax的处理