第一种是把创建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. js变量

    由于undefined和null两个值的比较是相等的,所以,未初始化的变量和赋值为null的变量会相等.这时,可以采用typeof变量的类型进行比较.但,建议还是养成编码的规范,不要忘记初始化变量. ...

  2. C++中嵌入Lua脚本环境搭建

    第一步(环境准备工作): 工具: ●LuaForWindows_v5.1.4-46.exe傻瓜式安装. 作用:此工具可以在windows环境下编译运行Lua脚本程序.安装完成后会有两个图标:Lua和S ...

  3. Lambda表达式动态拼接(备忘)

    EntityFramework动态组合Lambda表达式作为数据筛选条件,代替拼接SQL语句 分类: C# Lambda/Linq Entity Framework 2013-05-24 06:58 ...

  4. Rails problem

    总是wa~ #include <stdio.h> int main() { ]; ], b[]; while(scanf("%d %s %s", &n, a, ...

  5. Web前端开发基础 第四课(CSS文字和段落排版)

    文字排版--字体 我们可以使用css样式为网页中的文字设置字体.字号.颜色等样式属性.下面我们来看一个例子,下面代码实现:为网页中的文字设置字体为宋体. body{font-family:" ...

  6. Construct a tree from Inorder and Level order traversals

    Given inorder and level-order traversals of a Binary Tree, construct the Binary Tree. Following is a ...

  7. java常用工具类

    http://www.cnblogs.com/langtianya/p/3875124.html

  8. Bash中各种以$开头的特殊变量的含义

    $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行的命令的结束代码(返回值) $- 使用Set命令设定的Flag一览 $* 所有参 ...

  9. 《UML大战需求分析》阅读笔记02

    软件应能真正的对客户的工作提供帮助,只有客户使用并真正对其有用才能说我们做的软件成功了.客户从开始提出需求时到后期的工作过程中,需求总是不停变化的,所以这就需要需求人员对需求领先于客户.所以活用UML ...

  10. cookie的作用

    Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术.Cookies是当你浏览某网站时,由Web服务器置于你硬盘上的一个非常小的文本文件,它可以 ...