RecyclerView新体验(2)
来源:互联网 发布:java weka 神经网络 编辑:程序博客网 时间:2024/05/22 12:31
在上一篇RecyclerView新体验(1)介绍了RecyclerView的简单使用方法和分割线的设置,但是我们仔细一看,RecyclerView并没有给我们提供点击事件,尼~玛,这绝对是个坑啊,没办法,既然进了坑就想办法跳出去呗。
下面我们像ListView一样,写出点击和长按两个方法。Adapter代码如下:
public class CommonClickRecyclerViewAdapter extends RecyclerView.Adapter<CommonClickRecyclerViewAdapter.MyViewHolder> { private Context context; private List<String> list; //定义接口 public interface OnItemClickListener { void onItemClick(View view, int position); } //定义接口 public interface OnItemLongClickListener { void onItemLongClick(View view, int position); } //声明接口变量 private OnItemClickListener listener; //声明接口变量 private OnItemLongClickListener lListener; //暴露给使用者调用 public void setOnItemClickListener(OnItemClickListener listener) { this.listener = listener; } public void setOnItemLongClickListener(OnItemLongClickListener lListener) { this.lListener = lListener; } private ListView lv; public CommonClickRecyclerViewAdapter(Context context, List<String> list) { this.context = context; this.list = list; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.item_rcv, null)); } @Override public void onBindViewHolder(MyViewHolder holder, final int position) { holder.tv.setText(list.get(position)); if (listener != null) { holder.layout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { listener.onItemClick(view, position); } }); } if (lListener != null) { holder.layout.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { lListener.onItemLongClick(view, position); return false; } }); } } @Override public int getItemCount() { return list.size(); } public class MyViewHolder extends RecyclerView.ViewHolder { TextView tv; RelativeLayout layout; public MyViewHolder(View itemView) { super(itemView); tv = (TextView) itemView.findViewById(R.id.tv); layout = (RelativeLayout) itemView.findViewById(R.id.rl_item); } }}
这时候只需要我们在对RecyclerView的adapter进行监听就好,值得注意的是回调的参数是view和当前item的position(位置),要得到相应的值可通过position进行获取。监听代码如下:
adapter2.setOnItemClickListener(new CommonClickRecyclerViewAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int position) { Log.e("一样一样","点击了"+position+"元素"); } }); adapter2.setOnItemLongClickListener(new CommonClickRecyclerViewAdapter.OnItemLongClickListener() { @Override public void onItemLongClick(View view, int position) { Log.e("一样一样","点击了"+position+"元素"); } });
得到的效果如下图:
到此,简单的点击和长按事件完成了,但是感觉有点不爽,每个Adapter都要自己写点击事件,那不是很麻烦?
我们想着点击事件回调的是position,那也就是与实体没有关系,于是我想到了在getview中把点击外的抽出来一个方法,做成一个基类。注:这次写的是一个接口回调两个方法。
public abstract class RAdapter<T extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<RecyclerView.ViewHolder> { //定义接口 public interface OnItemClickListener { void onItemClick(View view, int position); void onItemLongClick(View view, int position); } //声明接口变量 private OnItemClickListener listener; //暴露给使用者调用 public void setOnItemClickListener(OnItemClickListener listener) { this.listener = listener; } @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) { onBindView(viewHolder, position); if(listener != null) { viewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { listener.onItemClick(view,position); } }); viewHolder.itemView.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View view) { listener.onItemLongClick(view,position); //如果是长按事件,那么久不用再触发点击事件了,所以返回true //将事件直接消费掉?? return true; } }); } } public abstract void onBindView(RecyclerView.ViewHolder holder, int position);}
这时候我们写的Adapter只要继承了RAdapter就可以在Activity中对adapter进行监听了,没有必要每次都在adapte中重写点击事件。
自己写的Adapter如下:
public class BaseOnClickAdapter extends RAdapter<BaseOnClickAdapter.MyViewHolder> { private Context context; private List<String> list; public BaseOnClickAdapter(Context context, List<String> list) { this.context = context; this.list = list; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.item_rcv,null)); } @Override public int getItemCount() { return list.size(); } @Override public void onBindView(RecyclerView.ViewHolder holder, int position) { if(holder instanceof MyViewHolder) { ((MyViewHolder) holder).tv.setText(list.get(position)); } }class MyViewHolder extends RecyclerView.ViewHolder { TextView tv; public MyViewHolder(View itemView) { super(itemView); tv = (TextView) itemView.findViewById(R.id.tv); }}}
这时候不是重写onBindViewHolder,而是重写onBindView()方法就好。监听方法:
adapter2.setOnItemClickListener(new RAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int position) { Log.e("一样一样","点击了"+position+"元素"); } @Override public void onItemLongClick(View view, int position) { Log.e("一样一样","长按了"+position+"元素"); } });
点击和长按的结果如下
这样是不是方便很多了呢?有更好的方法望大神不吝赐教!很晚了,就到这里吧。
0 0
- RecyclerView新体验(2)
- RecyclerView新体验(1)
- RecyclerView使用完全指南,是时候体验新控件了(一)
- RecyclerView使用完全指南,是时候体验新控件了(二)
- Recyclerview使用体验(一)
- 新视图RecyclerView(一)
- RecyclerView初体验(一)
- RecyclerView初体验
- Fresco+RecyclerView初体验
- RecyclerView初体验
- Android RecyclerView初体验
- RecyclerView使用初体验
- RecyclerView 使用全体验
- 新体验
- 新体验
- 新接触新探索RecyclerView
- C#3.0新体验(一)
- 5.0新特性RecyclerView
- OpenGL&&GLSL学习心得(1)
- QQ或者微信客户端加载本地图片是如何实现的?
- 简述Orcale的物化视图
- 装饰模式--一个套餐组合的原型
- 最小生成树-Prim算法(模板)
- RecyclerView新体验(2)
- Mac下eclipse安装svn插件
- FPGA Verilog语言中阻塞赋值与非阻塞赋值个人看法
- 安装使用ghost 0.75中文版
- flash builder对代码进行调试 下载flash player debug软件
- 学习大神的沉浸式布局
- Notification——通知应用
- Java 利用枚举实现单例模式
- selenium之 玩转鼠标键盘操作(ActionChains)