自己封装的 recyclerView的 BaseAdapter,带item点击和长按事件。
第一种是把创建viewholder的步骤给子类来做。
第二种是参照陈宇明的博客,试着只暴露给子类设置holder属性的方法。(还未测试条目中控件的点击事件能否成功)
代码如下:
/**
* Created by star on 2016/7/28 0028.
*
*/
public abstract class MyBaseRecAdapter<T extends RecyclerView.ViewHolder,E> extends RecyclerView.Adapter<T> {
private static OnItemClickListener onItemClickListener; public static interface OnItemClickListener<E> {
void onItemClick(View view, E bean);
void onItemLongClick(View view, E bean);
} public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
} protected Context context;
protected ArrayList<E> datas;
protected int layoutID; public MyBaseRecAdapter(Context context, ArrayList<E> datas, int layoutID) {
this.context = context;
this.datas = datas;
this.layoutID=layoutID;
} @Override
public T onCreateViewHolder(ViewGroup parent, int viewType){
View itemView=View.inflate(context,layoutID,null);
return getViewHolder(itemView);
} @Override
public int getItemCount() {
return datas.size();
} @Override
public void onBindViewHolder(final T holder, final int position){
final E bean = datas.get(position);
setValues(holder,bean);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onItemClickListener != null) {
onItemClickListener.onItemClick(holder.itemView, bean);
}
}
}); holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (onItemClickListener != null) {
onItemClickListener.onItemLongClick(holder.itemView, bean);
}
return true;
}
});
} /**
* 返回viewholder
* @param itemView
* @return
*/
protected abstract T getViewHolder(View itemView);
/**
* 设置控件数据
* @param holder
* @param bean
*/
protected abstract void setValues(T holder, E bean); }
第二种,待完善:
/**
* Created by star on 2016/7/28 0028.
*
*/
public abstract class MyBaseAdapter_2<E> extends RecyclerView.Adapter<MyBaseAdapter_2.BaseViewHolder> {
private static OnItemClickListener onItemClickListener; public static interface OnItemClickListener<E> {
void onItemClick(View view, E bean); void onItemLongClick(View view, E bean);
} public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
} protected Context context;
protected ArrayList<E> datas;
protected int layoutID; public MyBaseAdapter_2(Context context, ArrayList<E> datas, int layoutID) {
this.context = context;
this.datas = datas;
this.layoutID = layoutID;
} @Override
public MyBaseAdapter_2.BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = View.inflate(context, layoutID, null);
return new BaseViewHolder(context, itemView);
} @Override
public int getItemCount() {
return datas.size();
} @Override
public void onBindViewHolder(final MyBaseAdapter_2.BaseViewHolder holder, final int position) {
final E bean = datas.get(position);
setValues(holder, bean);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onItemClickListener != null) {
onItemClickListener.onItemClick(holder.itemView, bean);
}
}
}); holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (onItemClickListener != null) {
onItemClickListener.onItemLongClick(holder.itemView, bean);
}
return true;
}
});
} /**
* 设置控件数据
*
* @param holder
* @param bean
*/
protected abstract void setValues(MyBaseAdapter_2.BaseViewHolder holder, E bean); static class BaseViewHolder extends RecyclerView.ViewHolder {
private SparseArray<View> views;
private Context context; public BaseViewHolder(Context context, View itemView) {
super(itemView);
this.context = context;
views = new SparseArray<>();
} protected <T extends View> T inflateView(int viewId) {
View view = views.get(viewId);
if (view == null) {
view = itemView.findViewById(viewId);
views.put(viewId,view);
}
return (T) view;
} public BaseViewHolder setText(int viewId, CharSequence value) {
TextView tv = inflateView(viewId);
tv.setText(value);
return this;
} /**
* 通过图片地址加载图片
* @param viewId
* @param imgUrl
* @return
*/
public BaseViewHolder setImgUrl(int viewId, String imgUrl) {
ImageView img = inflateView(viewId);
Glide.with(context).load(imgUrl).into(img);
return this;
}
/**
* 通过项目drawable中加载图片
* @param viewId
* @param imgResourceId
* @return
*/
public BaseViewHolder setImgUrl(int viewId, int imgResourceId) {
ImageView img = inflateView(viewId);
Glide.with(context).load(imgResourceId).into(img);
return this;
}
public BaseViewHolder setOther(int viewId){
inflateView(viewId);
return this;
}
public View getView(int viewId){
return views.get(viewId);
}
} }
自己封装的 recyclerView的 BaseAdapter,带item点击和长按事件。的更多相关文章
- Android RecyclerView单击、长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类
Android RecyclerView单击.长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类 我写的附录文章2,介绍了 ...
- recyclerview item点击事件
recyclerview早就不陌生了,比起过去传统的listView,样式更多,也较为高效一点,这里整理一下recylerview中item的点击事件. recyclerview和listView不同 ...
- Android RecyclerView单击、长按事件标准实现:基于OnItemTouchListener + GestureDetector
Android RecyclerView单击.长按事件:基于OnItemTouchListener + GestureDetector标准实现 Android RecyclerView虽然拥有L ...
- Android 高级UI设计笔记20:RecyclerView 的详解之RecyclerView添加Item点击事件
1. 引言: RecyclerView侧重的是布局的灵活性,虽说可以替代ListView但是连基本的点击事件都没有,这篇文章就来详细讲解如何为RecyclerView的item添加点击事件,顺便复习一 ...
- 从源码角度入手实现RecyclerView的Item点击事件
RecyclerView 作为 ListView 和 GridView 的替代产物,相信在Android界已广为流传. RecyclerView 本是不会有类似 ListView 的那种点击事件,但是 ...
- Android -- 实现RecyclerView可拖拽Item
1,今天和大家一起实现RecyclerView可拖拽Item,主要是使用RecyclerView结合ItemTouchHelper来实现的,来看一下效果 2,看一下怎么实现的呢,很简单,只需要给rec ...
- android 项目学习随笔十三(ListView实现ITEM点击事件,将已读状态持久化到本地)
1.因为给LISTVIEW增加了两个头布局,所以在点击事件ITEM索引会增加2,比如原来第一条数据的索引应该为0,增加两个头布局后,它的索引变为 2,为了使LISTVIEW的ITEM在点 ...
- ListView item 中TextView 如何获取长按事件
昨天晚上小伙伴突然来信, ListView item中嵌套的TextView 无法获取长按事件 从前从来没有仔细留意过, coding后发现...果然没什么动静 而且没有合适的API让我调用获取Tex ...
- Android ListView中Item点击事件失效解决方案
欢迎关注公众号,每天推送Android技术文章,二维码如下:(可扫描) 在平常的开发过程中,我们的ListView可能不只是简单的显示下文本或者按钮,更多的是显示复杂的布局,这样的话,我们就得自己写布 ...
随机推荐
- Struts的文件下载功能实现代码
Action: package com.tengfeiyang.action; import java.io.File; import java.io.FileInputStream; import ...
- MySQL数据库基本指令
对MySQL的指令不太熟悉,在此特别整理了一下一些常用的指令: 约定:大写字母写SQL关键字和函数名,小写字母写数据库.数据表和数据列的名字.(下述代码更新不同步,部分代码未依据此约定) 1 数据库的 ...
- zk编程语言: 如何改变datebox框值的大小及高度
<?page title="" contentType="text/html;charset=UTF-8"?> <zk > <st ...
- 屏蔽Enter触发的事件
无论是 <button type="button" onclick="console.log('123');">123</button> ...
- Android课程---课下练习(表格、线性和相对布局)
1.表格布局 练习代码: <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns: ...
- Android课程---Activity 的生命周期
activity类处于android.app包中,继承体系如下: 1.java.lang.Object 2.android.content.Context 3.android.app.Applicat ...
- IOS第二天多线程-03对列组合并图片
********* // 2D绘图 Quartz2D // 合并图片 -- 水印 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *) ...
- Thinking in Java——笔记(3)
Operator Using Java operators Some operators change the value of an operand. This is called a side e ...
- Flink - state
public class StreamTaskState implements Serializable, Closeable { private static final long serial ...
- phpcms 导航栏点击栏目颜色定位方法和phpcms list页实现分页
另:一个栏目下面如果没有子栏目,那么它调用的模板就是列表页模板(及list_为前缀的模板):如果一个栏目下面有子栏目,那么它调用的就是栏目首页模板(category_为前缀的模板). 当你这个栏目添加 ...