对RecyclerView的item添加点击事件

来源:互联网 发布:音响 知乎 编辑:程序博客网 时间:2024/06/05 09:33

对RecyclerView的item添加点击事件

        对于用惯了listview的程序猿来说,recyclerview没有item没有点击事件实在是一件很蛋疼的事情。在某些情况下,recyclerview确实要比listview好用的多,所以,今天闲来无事,就研究研究,给recyclerview的item添加个点击事件,废话不多说,直接上代码。

1.首先定义一个接口,用于点击事件

  1. public static interface OnItemClickListener {    void onItemClick(View view , int position);}​

2.声明一下这个接口的变量

  1. private OnItemClickListener mOnItemClickListener = null;//自定义点击事件的接口

3.在onCreateViewHolder()中为每个item添加点击事件

  1. @Override
  2. public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
  3. View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false); ViewHolder viewHolder = new ViewHolder(view); //将创建的View注册点击事件
  4. view.setOnClickListener(this); return viewHolder;}​

4.将点击事件转移给调用者

  1. @Override
  2. public void onClick(View v) {
  3. if (mOnItemClickListener != null) {
  4. //注意这里使用getTag方法获取position
  5. mOnItemClickListener.onItemClick(v,(int)v.getTag());
  6. }}

5.上面调用接口的onItemClick()中的v.getTag()方法,这需要在onBindViewHolder()方法中设置和item的position

  1. @Override
  2. public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
  3. ViewHolder viewholder = (ViewHolder) holder;
  4. viewholder.mTextView.setText(testdatas[position]); //将position保存在itemView的Tag中,以便点击时进行获取
  5. viewholder.itemView.setTag(position);
  6. }​

6.最后暴露给外面的调用者,定义一个设置Listener的方法()

  1. public void setOnItemClickListener(OnItemClickListener listener) {
  2. this.mOnItemClickListener = listener;
  3. }​

7.好了,到了这里,就算大功告成了,接下来就是通过适配器adapter进行调用了,相信大家都会,这里就不累述了。(下附完整代码)。

  1.   /**
  2.  * Created by xiaoyang-1101 on 2017/8/17.
  3.  */
  4.  
  5. public class MyTestAdapter extends RecyclerView.Adapter implements View.OnClickListener {
  6.  
  7.     private  String[]  testdatas;
  8.  
  9.     public MyTestAdapter(String[] datas) {
  10.         testdatas = datas;
  11.     }
  12.     private OnItemClickListener mOnItemClickListener = null;
  13.  
  14.     //自定义点击事件的接口
  15.     public static interface OnItemClickListener {
  16.         void onItemClick(View view , int position);
  17.     }
  18.  
  19.     @Override
  20.     public ViewHolder onCreateViewHolder(ViewGroup viewGroup,  int viewType) {
  21.  
  22.         View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
  23.         ViewHolder viewHolder = new ViewHolder(view);
  24.         //将创建的View注册点击事件
  25.         view.setOnClickListener(this);
  26.         return viewHolder;
  27.     }
  28.  
  29.     @Override
  30.     public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
  31.  
  32.         ViewHolder viewholder = (ViewHolder) holder;
  33.         viewholder.mTextView.setText(testdatas[position]);
  34.         //将position保存在itemView的Tag中,以便点击时进行获取
  35.         //可以直接放入其他你需要的对象,一般是放位置信息position
  36.         viewholder.itemView.setTag(position);
  37.     }
  38.  
  39.     @Override
  40.     public void onClick(View v) {
  41.         if (mOnItemClickListener != null) {
  42.             //注意这里使用getTag方法获取position
  43.             mOnItemClickListener.onItemClick(v,(int)v.getTag());
  44.         }
  45.     }
  46.  
  47.     public void setOnItemClickListener(OnItemClickListener listener) {
  48.         this.mOnItemClickListener = listener;
  49.     }
  50.     //获取数据的数量
  51.     @Override
  52.     public int getItemCount() {
  53.         return testdatas.length;
  54.     }
  55.     //自定义的ViewHolder,持有每个Item的的所有界面元素
  56.     class ViewHolder extends RecyclerView.ViewHolder {
  57.         public TextView mTextView;
  58.         public ViewHolder(View view){
  59.             super(view);
  60.             mTextView = (TextView) view.findViewById(R.id.my_text);
  61.         }
  62.     }
  63. } 
原创粉丝点击