自己封装的 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可能不只是简单的显示下文本或者按钮,更多的是显示复杂的布局,这样的话,我们就得自己写布 ...
随机推荐
- django向数据库添加数据
url.py views.py host.html (样式) (展示部分) (添加信息界面) (js部分) 展示添加数据:
- print_r、echo、var_dump三者的区别
这三者均是php里输出的方式. 1.print_r用于输出数组. 2.echo只能用于输出字符串,在没有框架的时候,多用这种方法将结果打印在html页面上. 3.var_dump能输出任何类型的数据, ...
- js 节点属性
节点属性 在文档对象模型 (DOM) 中,每个节点都是一个对象.DOM 节点有三个重要的属性 : 1. nodeName : 节点的名称 2. nodeValue :节点的值 3. nodeType ...
- js 原生 ajax 异步上传图片
<script type="text/javascript"> function upload() { var file1 = document.getElementB ...
- vue 一些开发姿势
.vue : <template></template><script></script> .js :import Vue from 'vue'
- 【iCore3 双核心板】例程二十五:LAN_DNS实验——域名解析
实验指导书及代码包下载: http://pan.baidu.com/s/1jHlBpqe iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- angularJs模糊查询
html代码 <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <tit ...
- JQ中的延迟对象deferred中的promise等的使用
一.什么是deferred对象? 开发网站的过程中,我们经常遇到某些耗时很长的javascript操作.其中,既有异步的操作(比如ajax读取服务器数据),也有同步的操作(比如遍历一个大型数组),它们 ...
- css before&after 特殊用途
平常仅仅需要将这两个伪元素用于添加一些自定义字符 p:before {content:"hello"} 但我们还可以使用before&after这两个伪类做一些特殊效果 ...
- Samba配置
https://wiki.samba.org/index.php/Samba_AD_DC_Port_Usage 安装后开放端口 1 ACCEPT tcp -- 0.0.0.0/0 ...