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

RecyclerView的使用方法请参考:RecyclerView的简单使用

第一步:

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

  1. /**
  2. * 定义 RecyclerView 选项单击事件的回调接口
  3. */
  4. public interface OnItemClickListener{
  5. //参数(父组件,当前单击的View,单击的View的位置,数据)
  6. void onItemClick(RecyclerView parent,View view, int position, String data);
  7. }

第二步:

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

  1. private OnItemClickListener onItemClickListener;
  2. public void setOnItemClickListener(OnItemClickListener onItemClickListener){
  3. this.onItemClickListener = onItemClickListener;
  4. }

第三步:

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

  1. public class RvAdapter1 extends RecyclerView.Adapter<RvAdapter1.DataViewHolder> implements View.OnClickListener{
  2. ...
  3. view.setOnClickListener(this);//设置监听器
  4. ...
  5. @Override
  6. public void onClick(View view) {
  7. //根据RecyclerView获得当前View的位置
  8. int position = recyclerView.getChildAdapterPosition(view);
  9. //程序执行到此,会去执行具体实现的onItemClick()方法
  10. if (onItemClickListener!=null){
  11. onItemClickListener.onItemClick(recyclerView,view,position,mList.get(position));
  12. }
  13. }
  14. ...
  15. }

第四步:

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

  1. adapter.setOnItemClickListener(new RvAdapter1.OnItemClickListener() {
  2. @Override
  3. public void onItemClick(RecyclerView parent, View view, int position, String data) {
  4. Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show();
  5. }
  6. });

参考代码

Adapter
  1. /**
  2. * Created by jzman on 2017/5/13 0013.
  3. * RecycleView的Adapter
  4. */
  5. public class RvAdapter1 extends RecyclerView.Adapter<RvAdapter1.DataViewHolder> implements View.OnClickListener{
  6. private Context mContext;
  7. private RecyclerView recyclerView;
  8. private ArrayList<String> mList;
  9. public RvAdapter1() {}
  10. public RvAdapter1(Context mContext, ArrayList<String> mList) {
  11. this.mContext = mContext;
  12. this.mList = mList;
  13. }
  14. /**
  15. * 用于创建ViewHolder
  16. * @param parent
  17. * @param viewType
  18. * @return
  19. */
  20. @Override
  21. public DataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  22. View view = LayoutInflater.from(mContext).inflate(R.layout.item,null);
  23. view.setOnClickListener(this);
  24. //使用代码设置宽高(xml布局设置无效时)
  25. view.setLayoutParams(new ViewGroup.LayoutParams(
  26. ViewGroup.LayoutParams.MATCH_PARENT,
  27. ViewGroup.LayoutParams.WRAP_CONTENT));
  28. DataViewHolder holder = new DataViewHolder(view);
  29. return holder;
  30. }
  31. /**
  32. * 绑定数据
  33. * @param holder
  34. * @param position
  35. */
  36. @Override
  37. public void onBindViewHolder(DataViewHolder holder, int position) {
  38. holder.tv_data.setText(mList.get(position));
  39. }
  40. /**
  41. * 选项总数
  42. * @return
  43. */
  44. @Override
  45. public int getItemCount() {
  46. return mList.size();
  47. }
  48. @Override
  49. public void onClick(View view) {
  50. //根据RecyclerView获得当前View的位置
  51. int position = recyclerView.getChildAdapterPosition(view);
  52. //程序执行到此,会去执行具体实现的onItemClick()方法
  53. if (onItemClickListener!=null){
  54. onItemClickListener.onItemClick(recyclerView,view,position,mList.get(position));
  55. }
  56. }
  57. /**
  58. * 创建ViewHolder
  59. */
  60. public static class DataViewHolder extends RecyclerView.ViewHolder{
  61. TextView tv_data;
  62. public DataViewHolder(View itemView) {
  63. super(itemView);
  64. tv_data = (TextView) itemView.findViewById(R.id.tv_recycle);
  65. }
  66. }
  67. private OnItemClickListener onItemClickListener;
  68. public void setOnItemClickListener(OnItemClickListener onItemClickListener){
  69. this.onItemClickListener = onItemClickListener;
  70. }
  71. /**
  72. * 定义RecyclerView选项单击事件的回调接口
  73. */
  74. public interface OnItemClickListener{
  75. //参数(父组件,当前单击的View,单击的View的位置,数据)
  76. void onItemClick(RecyclerView parent,View view, int position, String data);
  77. }
  78. /**
  79. * 将RecycleView附加到Adapter上
  80. */
  81. @Override
  82. public void onAttachedToRecyclerView(RecyclerView recyclerView) {
  83. super.onAttachedToRecyclerView(recyclerView);
  84. this.recyclerView= recyclerView;
  85. }
  86. /**
  87. * 将RecycleView从Adapter解除
  88. */
  89. @Override
  90. public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
  91. super.onDetachedFromRecyclerView(recyclerView);
  92. this.recyclerView = null;
  93. }
  94. }
MainActivity
  1. /**
  2. * Created by jzman on 2017/5/13 0013.
  3. */
  4. public class MainActivity extends AppCompatActivity {
  5. private RecyclerView rv;
  6. RvAdapter1 adapter;
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11. rv = (RecyclerView) findViewById(R.id.rv);
  12. //设置布局管理器
  13. // rv.setLayoutManager(new LinearLayoutManager(this));//线性
  14. rv.setLayoutManager(new GridLayoutManager(this,4));//线性
  15. // rv.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));//线性
  16. adapter = new RvAdapter1(this,initData());
  17. adapter.setOnItemClickListener(new RvAdapter1.OnItemClickListener() {
  18. @Override
  19. public void onItemClick(RecyclerView parent, View view, int position, String data) {
  20. Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show();
  21. }
  22. });
  23. rv.setAdapter(adapter);
  24. }
  25. public static ArrayList<String> initData(){
  26. ArrayList<String> arrayList = new ArrayList<>();
  27. for (int i=0;i<50;i++){
  28. arrayList.add("第"+i+"条数据");
  29. }
  30. return arrayList;
  31. }
  32. }

显示效果

可以关注微信公众号:jzman-blog 获取最新文章更新,欢迎一起交流学习!

RecyclerView 的 Item 的单击事件的更多相关文章

  1. RecyclerView的Item的单击事件

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

  2. 从源码角度入手实现RecyclerView的Item点击事件

    RecyclerView 作为 ListView 和 GridView 的替代产物,相信在Android界已广为流传. RecyclerView 本是不会有类似 ListView 的那种点击事件,但是 ...

  3. Android 高级UI设计笔记20:RecyclerView 的详解之RecyclerView添加Item点击事件

    1. 引言: RecyclerView侧重的是布局的灵活性,虽说可以替代ListView但是连基本的点击事件都没有,这篇文章就来详细讲解如何为RecyclerView的item添加点击事件,顺便复习一 ...

  4. sencha touch list(列表) item(单行)单击事件触发顺序

    测试代码如下 Ext.define('app.view.new.List', { alternateClassName: 'newList', extend: 'app.view.util.MyLis ...

  5. 为RecyclerView添加item的点击事件

    RecyclerView侧重的是布局的灵活性,虽说可以替代ListView但是连基本的点击事件都没有,这篇文章就来详细讲解如何为RecyclerView的item添加点击事件,顺便复习一下观察者模式. ...

  6. 一个滑动选中RecyclerView中Item的布局SlidingCheckLayout,手指滑过Item时多项选中。

    SlidingCheckLayout是一个滑动选中RecyclerView中Item的布局,手指滑过Item时多项选中. 作者:竹尘居士 github:https://github.com/homgw ...

  7. Android ListView item 点击事件失效问题的解决

    关于ListView点击无效,item无法相应点击事件的问题,网上有很多, 大致可分为俩种情况, 一种是 item中存在 ImageButton 等可以点击的组件,这会抢先获得ListView的焦点. ...

  8. RecyclerView的Item和Item内的控件点击处理

    需求场景:RecyclerView的Item需要点击,或者Item中的某个控件需要点击,或者两者同时需要点击处理. 一.adapter代码如下: package com.ldw.adapter; im ...

  9. Angular JS中双击事件ng-dblclick避免同时触发两次单击事件ng-click的解决方案

    有些需求中,需要一个元素上既有双击事件,也有单击事件,而两者实现的效果不一样. 这时可以使用ng-dblclick与ng-click来实现需求,但是要避免浏览器将双击事件误认为是两次单击事件,从而出现 ...

随机推荐

  1. 网络流媒体协议的联系与区别(RTP RTCP RTSP RTMP HLS)

    目录 网络流媒体协议的联系与区别(RTP RTCP RTSP RTMP HLS) 简结 RTP RTCP RTSP 区别与联系 RTSP.RTMP.HLS 区别与联系 关于直播 流媒体各协议层次图 基 ...

  2. 全面认识HBase架构(建议收藏)

    在网上看过很多HBaes架构相关的文章,内容深浅不一,直到发现了一篇MapR官网的文章https://mapr.com/blog/in-depth-look-hbase-architecture/#. ...

  3. elasticsearch 高级查询

    高级查询 子条件查询 (特定字段查询所指特定值) 复合条件查询 (以一定的逻辑组合子条件查询) 一.子条件查询 子条件查询分为 query context.filter context 1.query ...

  4. Java反射之数组的反射应用

    上一篇我们说了Java反射之成员方法的反射 这一篇我们说一说数组的反射应用,数组的有长度等属性,所以也会有相应的方法获得这些属性,这里我们不一一列举哪些方法.我们来了解反射包中的一个类----Arra ...

  5. C++中的内存分配

    C++提供下面两种方法分配和释放未构造的原始内存 (1)allocator 类,它提供可感知类型的内存分配 (2)标准库中的 operator new 和 operator delete,它们分配和释 ...

  6. isEmpty 判空函数 内部分别判断是 null 空数组 等

    import { oneOf, isEmpty } from '@/libs/tools' export const isEmpty = (value) => { if (value == nu ...

  7. JavaSE知识概述集

    一.HelloWord(文档启动Java) /* 使用命令行的方式执行的时候,cmd的默认编码格式是GBK 因此在输入中文的时候需要设置文件的编码格式位ANSI,不会出现乱码错误 注意: 0.先用ja ...

  8. asp.net里获取或设置textarea/asp:Textbox/dropdownlist/CheckBox 的值

    1.   textarea .asp:label 和 tasp:extbox 的text文本值: <textarea id="txt_remark" runat=" ...

  9. 手把手构建LSTM的向前传播(Building a LSTM step by step)

      本篇是在之前两篇基础上接着写的: 吴恩达deepLearning.ai循环神经网络RNN学习笔记(理论篇) 从头构建循环神经网络RNN的向前传播(rnn in pure python) 也可以不看 ...

  10. java-方法。(新手)

    import java.util.ArrayList; //导入包.import java.util.Iterator;import java.util.LinkedList;import java. ...