第一种是把创建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. phpweb漏洞合集

    admin' or '1'='1 万能密码 inurl:/class/?1.html inurl:webmall/query.php?typeid=?inurl:shop/class/?226.htm ...

  2. thinkphp的field方法的用法

    ThinkPHP的连贯操作方法中field方法有很多的使用技巧,field方法主要目的是标识要返回或者操作的字段. 1.用于查询 在查询操作中field方法是使用最频繁的. $Model->fi ...

  3. js 获取控制台的错误信息

    适合移动端调试的时候优化的报错使用.缺点是无法打印出多条记录,有方法的同学留言告诉我. <!DOCTYPE html> <html lang="en"> & ...

  4. BizTalk开发系列(五) 属性字段

    在根据消息内容进行路由的时候经常使用的是可分辨字段和属性字段.属性字段可以在各个 BizTalk Server 组件(包括管道和业务流程)中进行访问.属性字段还可用于消息路由.如果需要在上下文(而不是 ...

  5. 四则运算之C++实现篇

    对四则运算的一些要求如下: 1.题目避免重复:2.可定制(数量/打印方式):3.可以控制下列参数:   是否有乘除法.数值范围.加减有无负数.除法有无余数.否支持分数 (真分数, 假分数, …): 一 ...

  6. centos安装vsftp

    yum install -y vsftpd chkconfig vsftpd on 配置问价在/etc/vsftpd/下面 chroot_list 默认没有 必须自己建立 vi /etc/vsftpd ...

  7. Sharepoint 2013 网站集的删除与还原

    一.可以通过三种方法删除网站集: 1.打开Sharepoint 2013 管理页面首页 ---> 单击‘应用程序管理(Application Management)’并进入该页面 ---> ...

  8. Thinking in Java——笔记(4)

    Controlling Execution true and false Java doesn't allow you to use a number as a boolean. If you wan ...

  9. 【转】Unity中的协同程序-使用Promise进行封装(二)

    原文:http://gad.qq.com/program/translateview/7170970 译者:王磊(未来的未来)    审校:崔国军(飞扬971)   在上一篇文章中,我们的注意力主要是 ...

  10. nodejs 80端口监听失败及NODE_PATH不起作用的问题

    nodejs做web服务器,打开80时报错:Error: listen EACCES 0.0.0.0:80 80端口监听失败,是因为1024以下的端口需要root权限,需要sudo或su之后执行.但这 ...