RecyclerView实现Item点击事件
概述
RecyclerView本身没有实现点击事件,需要自定义接口进行实现
接口定义
onRecyclerViewItemClickListener
接口名称随自己喜欢起,放置的位置也随你喜欢,因为是 public 放哪都能调用到
方法参数上这里考虑可能会对布局进行调整,传入了父控件和当前item以及索引位置
public interface onRecyclerViewItemClickListener{void onItemClick(RecyclerView parent, View view, int position);void onItemLongClick(RecyclerView parent, View view, int position);
}
如果想要一个接口管理一个监听事件回调,也可以单独弄一个定义接口文件,更规范些
事件参数也可以根据需要进行调整,如果没有特别需要,只要拿到item索引位置即可
public interface IAdapter {/** Item 单击事件后续处理*/interface OnRVItemClickListener {void onClick(int position);}/** Item 长按事件后续处理*/interface OnRVItemLongClickListener {boolean onLongClick(int position);}/** Item 移除事件后续处理*/interface OnRVItemRemoveListener{void onRemove(int position);}
}
以上如果看不明白,那接口这个概念就需要再翻看一下了
Adapter
接下来就要改造这个Adapter了
初始化接口事件
//初使化自定义的接口,接口定义在哪个包下就会把哪个包名也引入进来,只是名字长点,不影响使用private pub.onRecyclerViewItemClickListener onRecyclerViewItemClickListener;//为了方便接口函数传值,这里把RecyclerView控件拉出来,如果接口方法参数列表里没有,可以不用写private RecyclerView rvParent;
绑定接口回调事件
//定义一个公用方法,可以在Activity中来绑定接口事件public void setOnItemClickListener(pub.onRecyclerViewItemClickListener onRecyclerViewItemClickListener) {this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener;}
绑定控件监听
这里有两种实现方式
直接给控件绑定监听事件
代码中的写法可以不作参考,具体看你想要给某个控件进行绑定监听还是给整个item绑定监听,和正常控件绑定没啥判别
只是具体的事件内容改为调用监听接口事件的方法即可
别忘了把参数传进去给外部调用时使用
@Overridepublic void onBindViewHolder(@NonNull viewHolder holder, int position) {holder.bind(lstCharges.get(position));holder.mView.getRoot().setOnClickListener(view -> itemClickListener.onClick(position));holder.mView.getRoot().setOnLongClickListener(view -> itemLongClickListener.onLongClick(position)); }
比较推荐这种写法,至于为什么:简单!
继承 View.OnClickListener
另一个就是在你的类名之后 implements 一个 View.OnClickListener 然后重写 onClick 方法
public class FileAdapter extends RecyclerView.Adapter<FileAdapter.myViewHolder> implements View.OnClickListener {
此时会报错提示要重载 onClick事件
使用这种方法,在此获取不到当前的索引位置,
可以定义一个 int 公用变量来存储更新,
也可以如上面把 RecyclerView 拉出来,通过当前view来查找索引位置
具体看自己喜好,这里只作一个演示
//重载点击事件,指定点击事件时执行自定义的onItemClick@Overridepublic void onClick(View view) {//此时就用到上面拉出来的那个 rvParent 了int position = rvParent.getChildAdapterPosition(view);if (onRecyclerViewItemClickListener != null)onRecyclerViewItemClickListener.onItemClick(rvParent, view, position);}
只是设定监听事件了,但没有指定监听事件给谁,那点击之后是不会有反应的,还需要在 onCreateViewHolder 中绑定监听事件
@NonNull@Overridepublic myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {//指定一个父控件,把 RecyclerView 拉出来供 onClick 事件使用rvParent = (RecyclerView) parent;View view = LayoutInflater.from(mContext).inflate(R.layout.file_manager_item, parent, false);//绑定监听点击事件,因为类本身 implement 了 View.OnClickListener 此时只要监听绑定到 this 就可以了view.setOnClickListener(this);return new myViewHolder(view, mContext);}
完整代码
下面给出了完整的代码,中间无关的信息省略了
public class FileAdapter extends RecyclerView.Adapter<FileAdapter.myViewHolder> implements View.OnClickListener {...private pub.onRecyclerViewItemClickListener onRecyclerViewItemClickListener;private RecyclerView rvParent;...@NonNull@Overridepublic myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {//指定一个父控件rvParent = (RecyclerView) parent;View view = LayoutInflater.from(mContext).inflate(R.layout.file_manager_item, parent, false);//绑定监听点击事件view.setOnClickListener(this);return new myViewHolder(view, mContext);}...//重载点击事件,指定点击事件时执行自定义的onItemClick@Overridepublic void onClick(View view) {int position = rvParent.getChildAdapterPosition(view);if (onRecyclerViewItemClickListener != null)onRecyclerViewItemClickListener.onItemClick(rvParent, view, position);}...//实例化自定义接口public void setOnItemClickListener(pub.onRecyclerViewItemClickListener onRecyclerViewItemClickListener) {this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener;}
}
Activity
接下来和正常ListView绑定监听事件的操作差不多
fileAdapter.setOnItemClickListener(new pub.onRecyclerViewItemClickListener() {@Overridepublic void onItemClick(RecyclerView parent, View view, int position) {//自定义点击后的功能事件 .../* 此处代码仅供参考,演示怎样调用当前item的信息mView.tvFmPath.setText(lstFiles.get(position).getFilePath());getPath(lstFiles.get(position).getFilePath());fileAdapter.notifyDataSetChanged();*/}@Overridepublic void onItemLongClick(RecyclerView parent, View view, int position) {//自定义长按后的功能事件 ...}});
RecyclerView实现Item点击事件相关推荐
- 从源码角度入手实现RecyclerView的Item点击事件
转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6758373.html RecyclerView 作为 ListView 和 GridView 的替代产物, ...
- Android 高级UI设计笔记20:RecyclerView 的详解之RecyclerView添加Item点击事件
1. 引言: RecyclerView侧重的是布局的灵活性,虽说可以替代ListView但是连基本的点击事件都没有,这篇文章就来详细讲解如何为RecyclerView的item添加点击事件,顺便复习一 ...
- RecyclerView条目item点击事件---放大
Adapter–创建接口 //创建接口public interface RecyInterface{void vh(Viewholder viewholder);}//声明接口名private Rec ...
- android recyclerview item点击事件,RecyclerView的Item的单击事件
RecyclerView 的每个Item的点击事件并没有像ListView一样封装在组件中,需要Item的单击事件时就需要自己去实现,在Adapter中为RecyclerView添加单击事件参考如下: ...
- android 点击item跳转页面,Android RecyclerView Item 点击事件,简单
在适配器中设置项的点击事件即可,如需跳转Activity,则需要intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_ ...
- RecyclerView 的 Item 的单击事件
RecyclerView 的每个Item的点击事件并没有像 ListView 一样封装在组件中,需要 Item 的单击事件时就需要自己去实现,在 Adapter 中为RecyclerView 添加单击 ...
- android 项目学习随笔十三(ListView实现ITEM点击事件,将已读状态持久化到本地)...
1.因为给LISTVIEW增加了两个头布局,所以在点击事件ITEM索引会增加2,比如原来第一条数据的索引应该为0,增加两个头布局后,它的索引变为 2,为了使LISTVIEW的ITEM在点 ...
- ListView的Item点击事件(消息传递)
转载请保留原文出处"http://my.oschina.net/gluoyer/blog",谢谢! 您可以到博客的"友情链接"中,"程序猿媛(最新下载 ...
- android listview里item添加一个按钮点击事件,ListView Item点击事件跳转详情界面
有好久都没有碰安卓了,考试加五一双组合也真是让人蛋疼.好在都平安的度过了,所以又有时间gun回来弄弄我的小博客(虽然没多少人看= =).看了之前做的几个小demo,模式都差不多,但是每次写的时候都要在 ...
最新文章
- python定义一个空数组_python – 在numpy数组中设置空值
- Google 全球员工围攻 Google!
- bootstrap fileinput上传返回400,404,500 等错误替换
- OpenCV访问Mat图像中每个像素的值
- 剑指offer九:变态跳台阶
- hdu1166敌兵布阵 树状数组裸题
- C语言 | 基于STM32的MPU6050模块程序(主程序)
- kali linux 截图位置,Kali Linux中使用截图工具
- 搞定常见垃圾收集器【Java】
- vue :key的说明 看到这文章,解决你的疑问
- uni一t 说明书_不输特斯拉,站在UNI-T背后的长安「超级工厂」
- ajax 同步和异步的区别
- 二维树状数组 探索进行中
- Swift实现LRU缓存淘汰算法
- 使用云开发实现微信支付的具体方法
- 局域网内和局域网间的通信(交换机与路由器)
- 中艺人脸识别考勤机使用方法_中控人脸识别考勤机说明书 人脸识别考勤机的使用方法...
- php studay,studay是什么意思
- 网络编程之(转载自:https://www.cnblogs.com/clschao/articles/9593164.html)
- Docker架设服务器系列
热门文章
- [UTCTF2020]basic-crypto
- 贪心算法经典问题:硬币找零
- leetcode 658. 找到 K 个最接近的元素
- 大疆无人机直播延迟的解决对策
- ios系统更新提示没有连接到服务器上,ios 更新时不再连接到无线网
- 二叉树前序、中序、后序遍历-1
- 桔梗网导航怎么取消?? so-easy
- Python之基础详解(十一):PTL各模块讲解:Image、ImageFilter、ImageChops、ImageColor、ImageEnhance、ImageOps、ImageDraw
- Linux查看端口监听状态
- invalid bound statement (not found)最全面的解决办法