第一种是把创建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点击和长按事件。的更多相关文章

  1. Android RecyclerView单击、长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类

     Android RecyclerView单击.长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类 我写的附录文章2,介绍了 ...

  2. recyclerview item点击事件

    recyclerview早就不陌生了,比起过去传统的listView,样式更多,也较为高效一点,这里整理一下recylerview中item的点击事件. recyclerview和listView不同 ...

  3. Android RecyclerView单击、长按事件标准实现:基于OnItemTouchListener + GestureDetector

     Android RecyclerView单击.长按事件:基于OnItemTouchListener + GestureDetector标准实现 Android RecyclerView虽然拥有L ...

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

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

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

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

  6. Android -- 实现RecyclerView可拖拽Item

    1,今天和大家一起实现RecyclerView可拖拽Item,主要是使用RecyclerView结合ItemTouchHelper来实现的,来看一下效果 2,看一下怎么实现的呢,很简单,只需要给rec ...

  7. android 项目学习随笔十三(ListView实现ITEM点击事件,将已读状态持久化到本地)

    1.因为给LISTVIEW增加了两个头布局,所以在点击事件ITEM索引会增加2,比如原来第一条数据的索引应该为0,增加两个头布局后,它的索引变为        2,为了使LISTVIEW的ITEM在点 ...

  8. ListView item 中TextView 如何获取长按事件

    昨天晚上小伙伴突然来信, ListView item中嵌套的TextView 无法获取长按事件 从前从来没有仔细留意过, coding后发现...果然没什么动静 而且没有合适的API让我调用获取Tex ...

  9. Android ListView中Item点击事件失效解决方案

    欢迎关注公众号,每天推送Android技术文章,二维码如下:(可扫描) 在平常的开发过程中,我们的ListView可能不只是简单的显示下文本或者按钮,更多的是显示复杂的布局,这样的话,我们就得自己写布 ...

随机推荐

  1. getAttribute与setAttribute用法

    getAttribute和setAttribute只能用于元素节点. 1.当用getElementById获得元素节点时 /*---------------------------index.html ...

  2. 理解CSS3 transform中的Matrix(矩阵)

    一.哥,我被你吓住了 打架的时候会被块头大的吓住,学习的时候会被奇怪名字吓住(如“拉普拉斯不等式”).这与情感化设计本质一致:界面设计好会让人觉得这个软件好用! 所以,当看到上面“Matrix(矩阵) ...

  3. $.ajax用法与举例

    下面是一段比较常用到的 $.ajax 方法: $.ajax({ type:'GET', url:'http://www.phpernote.com/jquery.php', data:{usernam ...

  4. github page 构建自己的页面

    新建一个仓库.命名为:<你的账号>.github.io 然后上传一个index.html即可 打开浏览器输入:<你的账号>.github.io 即可访问

  5. 使用EXECUTE IMMEDIATE来生成含有绑定变量的SQL

    一个SQL,通过SPM固定它的执行计划,可以通过DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE实现.也可以通地此功能在不修改原SQL的情况下对其加HINT来固定执行计划.D ...

  6. Python开发问题和解决方案汇集

    1.Sublime Text中用Tab批量替换空格Whitespace缩进:Ctrl+A全选代码,Ctrl+Shift+P打开下拉框,输入indent,找到Convert indentation to ...

  7. IOS第八天(3:UITableViewController团购, 点击底部代码调整)

    ****代理者的方法中 // 通知页脚视图调整视图显示状态 [footerView endRefresh]; //发送代理通知的类中 /** 视图控制器刷新完成调用方法 */ - (void)endR ...

  8. 投行风云:FO的酸甜苦辣【转】

    全世界收入最高的工作大概就是投行的FO前台部门 (Front Office)部门了.但在拿高薪的同时,也伴随着很多人难以想象的苦逼生活.作为投行最低层的分析师(Analyst),通常需要从早上10点工 ...

  9. Oracle 10g ORA-01034: ORACLE not available 错误

    今天在开发系统的时候,刚开始还好好的,突然就遇到了一个错误 ORA-01034: ORACLE not available 感到莫名其妙.然后排查问题 监听器ok,各项服务ok. 最后解决办法如下: ...

  10. Wysiwyg Editors 标签过滤

    针对October CMS编辑器插件取消自动过滤DIV标签开关: 找到modules\backend\formwidgets\richeditor\assets\vendor\redactor\red ...