Android-RecycleView的item点击事件
来源:互联网 发布:jquery 数据可视化 编辑:程序博客网 时间:2024/05/01 11:43
RecyclerView不再负责Item视图的布局及显示,所以RecyclerView也没有为Item开放OnItemClick等点击事件,这就需要开发者自己实现。博客最下面有Demo程序运行动画。
因为ViewHolder我们可以拿到每个Item的根布局,所以如果我们为根布局设置单独的OnClick监听并将其开放给Adapter,那不就可以在组装RecyclerView时就能够设置ItemClickListener,只不过这个Listener不是设置到RecyclerView上而是设置到Adapter。
给一个测试接口:
String path="http://japi.juhe.cn/joke/content/list.from?key= 874ed931559ba07aade103eee279bb37 &page=2&pagesize=10&sort=asc&time=1418745237";
最终目的
模拟ListView的setOnItemClickListener()方法,调用者只须调用类似于setOnItemClickListener的东西就能获得被点击item的相关数据。
原理
为RecyclerView的每个子item设置setOnClickListener,然后在onClick中再调用一次对外封装的接口,将这个事件传递给外面的调用者。而“为RecyclerView的每个子item设置setOnClickListener”在Adapter中设置。其实直接在onClick中也能完全处理item的点击事件,但是这样会破坏代码的逻辑。
步骤
adapter中1.在MyAdapter中定义如下接口,模拟ListView的OnItemClickListener:
//定义一个接口 public interface OnRecyclerViewItemClickListener { void onItemClick(View view , String data); }
声明一个这个接口的变量
private OnRecyclerViewItemClickListener mOnItemClickListener = null;
在onCreateViewHolder()中为每个item添加点击事件
@Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = View.inflate(context, R.layout.recyclerviewitem, null); MyViewHolder myViewHolder = new MyViewHolder(view); //将创建的View注册点击事件 view.setOnClickListener(this); return myViewHolder; }
将点击事件转移给外面的调用者:
@Override public void onClick(View view) { if (mOnItemClickListener != null) { //注意这里使用getTag方法获取数据 mOnItemClickListener.onItemClick(view,view.getTag().toString()); } }
注意上面调用接口的onItemClick()中的v.getTag()方法,这需要在onBindViewHolder()方法中设置和item相关的数据
@Override public void onBindViewHolder(ViewHolder viewHolder, int position) { viewHolder.mTextView.setText(datas[position]); //将数据保存在itemView的Tag中,以便点击时进行获取 viewHolder.itemView.setTag(datas[position]); }
最后暴露给外面的调用者,定义一个设置Listener的方法():
public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { this.mOnItemClickListener = listener; }
以上所有步骤都发生在自定义的adapter中,典型的观察者模式,有点绕的地方在于,这里涉及到两个观察者模式的使用,view的setOnClickListener本来就是观察者模式,我们将这个观察者模式的事件监听传递给了我们自己的观察者模式。
在Activity中使用
MyRecyclerAdapter adapter=new MyRecyclerAdapter(RecycleActivity.this,data); recycleview.setAdapter(adapter); adapter.setOnItemClickListener(new MyRecyclerAdapter.OnRecyclerViewItemClickListener() { @Override public void onItemClick(View view, String data) { //DO your fucking bussiness here!】 Toast.makeText(RecycleActivity.this,data,Toast.LENGTH_SHORT).show(); } });
- Android-RecycleView的item点击事件
- RecycleView的Item点击事件
- RecycleView的不同类型Item点击事件
- RecycleView如何实现item的点击事件
- RecycleView 列表的item点击事件
- RecycleView 添加item点击事件
- Recycleview添加item点击事件
- Android databinding RecycleView item 子控件点击事件
- RecycleView的使用,并添加子item的点击事件
- Recycleview的点击事件
- RecycleView的点击事件
- Recycleview的点击事件
- android listview ,recycleView item没有点击效果
- Android屏蔽ListView的Item点击事件
- android屏蔽listview 的item点击事件
- android 捕获ListView 的item点击事件》
- Android屏蔽ListView的Item点击事件
- Android屏蔽ListView的Item点击事件
- Implement Trie (Prefix Tree)
- JS操作数字
- mybatis中的#和$的区别
- mysql如何让一个存储过程定时执行
- 页面加载完成之后执行js函数
- Android-RecycleView的item点击事件
- 判断字符串编码类型
- Oracle常用语句
- 数据库创建用户及权限
- Spring注解
- iOS 指纹识别
- 动态代理 AOP
- JS控制一组多选框(name相同)只能选择一个
- iOS 动画之翻页动画实现