本人之前也是不喜欢写博客,可是发现好多知识当时知道过了很长时间就会忘记,又得回去找资料看,最近看一些资料,觉得用recycleview每次写adapter 就很麻烦,看了不是的博客,自己也了已个通用的adapter,这个还是收到Darren的启发,确实要自己总结一下自己的知识,就写这个通用的adapter,第一次写写得不好,看到的希望对你有帮助,可以互相学习。

基本思路:

要让adapter通用的话,要解决布局,数据,r绑定怎么搞?数据的话可以通过泛型来传递,布局的话可以通过构造传,绑定显示就可以回传

1:改造adapter  下面是一个通用的adapter 他实现了单布局和多布局

/*** Created by Administrator on 2017/7/11 0011.** Description: 通用的Adapter*/
public abstract class CommonAdapter<DATA> extends RecyclerView.Adapter<ViewHodle>{private int mLayoutId;protected List<DATA> mDatas;private LayoutInflater mLayoutInfater;private Context mContext;private  MulitiTypeSupport typeSupport;//这个是普通布局就可以调用这个方法public CommonAdapter(Context mContext,int mLayoutId, List<DATA> mDatas) {mLayoutInfater = LayoutInflater.from(mContext);this.mContext = mContext;this.mLayoutId = mLayoutId;this.mDatas = mDatas;}//这个是多布局public CommonAdapter(Context mContext,List<DATA> mDatas, MulitiTypeSupport typeSupport ){this(mContext,-1,mDatas);this.typeSupport = typeSupport;}@Overridepublic ViewHodle onCreateViewHolder(ViewGroup parent, int viewType) {if(typeSupport!=null){//需要多布局mLayoutId = viewType;}View itemView = mLayoutInfater.inflate(mLayoutId,parent,false);ViewHodle viewHodle = new ViewHodle(itemView);return viewHodle;}@Overridepublic int getItemViewType(int position) {//多布局用if(typeSupport!=null){return typeSupport.getLayoutId(mDatas.get(position));}return super.getItemViewType(position);}@Overridepublic void onBindViewHolder(ViewHodle holder, final int position) {convert(holder,mDatas.get(position),position);if(itemClickListeren!=null){holder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {itemClickListeren.itemClick(position);}});}if(onItemLongClickListeren!=null){holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {onItemLongClickListeren.onItemLongClick(position);return true;}});}}//这个方法是把数据 ViewHolder 还有当前的位置传出去  实现在你自己的adapter里面protected abstract void convert(ViewHodle holder, DATA data, int position);@Overridepublic int getItemCount() {return mDatas.size();}//recycleview的点击跟长按事件private ItemClickListener itemClickListeren;public void setOnItemClickListeren(ItemClickListener itemClickListeren){this.itemClickListeren = itemClickListeren;}private OnItemLongClickLiateren onItemLongClickListeren;public  void setOnItemLongClickListeren(OnItemLongClickLiateren onItemLongClickListeren){this.onItemLongClickListeren = onItemLongClickListeren;}//这个是数据刷新 添加数据
    public void upData(List<DATA> mDatas){this.mDatas = mDatas;notifyDataSetChanged();}
}


2:下面是我自己写的一个例子
/*** Created by Administrator on 2017/7/11 0011.* Description: 通用的Adapter*/
//在集成通用的adapter的时候 数据传递是根据你自己的数据格式传递
public class TextAdapter extends CommonAdapter<A.Data> {//我们继承的时候 会继承单布局 和多布局 这里是多布局/** mContext  上下文* mDatas 数据* typeSupport 布局的类型*  这里我们可以不用这种 直接 MulitiTypeSupport 这个直接new出来*//* public TextAdapter(Context mContext, List<A.Data> mDatas, MulitiTypeSupport typeSupport) {super(mContext, mDatas, typeSupport);}*/public TextAdapter(Context mContext, final List<A.Data> mDatas) {super(mContext, mDatas, new MulitiTypeSupport<A.Data>() {@Overridepublic int getLayoutId(A.Data item) {//我这里只是用了2种布局if (item.position == 1) {return R.layout.item_1;}return R.layout.item_0;}});}// //我们继承的时候 会继承单布局 和多布局 这里是单布局  单布局实现就很简单了  数据/** mContext  上下文* mLayoutId  布局id* mDatas   数据*//*public TextAdapter(Context mContext, int mLayoutId, List<A.Data> mDatas) {super(mContext, mLayoutId, mDatas);}*//** holder viewholder* data  数据* position  当前的位置*/@Overrideprotected void convert(ViewHodle holder, A.Data data, int position) {if (data.position == 1) {holder.setText(R.id.tv1, data.content);} else if (data.position == 0) {holder.setText(R.id.tv0, data.content);}
        //这里是调用显示网络图片
//        holder.setImagePath(R.id.tv0, data.content,new ImageLoad(data.content) ) }


3:最后就是ViewHolder 直接贴代码
/*** Created by Administrator on 2017/7/11 0011.* Description: RecyclerView的ViewHolder*/
public class ViewHodle extends RecyclerView.ViewHolder{//通过 SparseArray<View> 来缓存 不用每次都去findViewByIdprivate SparseArray<View> mViews;public ViewHodle(View itemView) {super(itemView);mViews = new SparseArray<>();}/** getView 这个方法是去 findViewById 不用你在外面去findViewById 减少代码**/public <T extends View> T  getView(int viewId){View view = mViews.get(viewId);if(view == null){view = itemView.findViewById(viewId);mViews.put(viewId,view);}return (T)view;}
/** setText  这个方法是直接调用设置TextView* viewId  TextView 的id* text   TextView 的数据*/public ViewHodle setText(int viewId,String text){TextView view = getView(viewId);view.setText(text);return this;}//处理本地图片public ViewHodle setImageResource(int viewId,int resource){ImageView view  =getView(viewId);view.setImageResource(resource);return this;}/*** 设置图片通过路径,这里稍微处理得复杂一些,因为考虑加载图片的第三方可能不太一样* 也可以直接写死*/
 public ViewHodle setImagePath(int viewId, String path,HolderImageLoader imageLoader){ImageView view  =getView(viewId);//这里是写死的
//        Glide.with(view.getContext()).load(path).into(view);if(imageLoader == null) {throw new NullPointerException("imageLoader is null!");}imageLoader.loadImage(view.getContext(),view,imageLoader.getmPath());return this;}}
  /*** 图片加载,这里稍微处理得复杂一些,因为考虑加载图片的第三方可能不太一样* 也可以不写这个类*/public abstract static class HolderImageLoader{private String mPath;public String getmPath() {return mPath;}public HolderImageLoader(String path) {this.mPath = path;}public abstract void loadImage(Context context,ImageView imageView,String path);}



4:最后调用
/*** Created by Administrator on 2017/7/11 0011.*/
public class A extends AppCompatActivity{private RecyclerView rl;List<Data> list ;private TextAdapter adapter;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_a);list = new ArrayList<>();for (int i=0;i<50;i++){if(i%3==0){list.add(new Data("我是布局1的数据"+i,1));}else {list.add(new Data("我是布局0的数据"+i,0));}}rl = (RecyclerView) findViewById(R.id.recycle);rl.setLayoutManager(new LinearLayoutManager(this));adapter = new TextAdapter(this, list);rl.setAdapter(adapter);adapter.setOnItemClickListeren(new ItemClickListener() {@Overridepublic void itemClick(int position) {Toast.makeText(A.this,"你点击了第"+position+"个条目",Toast.LENGTH_SHORT).show();}});adapter.setOnItemLongClickListeren(new OnItemLongClickLiateren() {@Overridepublic void onItemLongClick(int position) {Toast.makeText(A.this,"你长按了第"+position+"个条目",Toast.LENGTH_SHORT).show();}});}
/*
* 这个方法是添加数据 这里没有上啦  就模拟点击加载数据
*/public void n(View view) {List<Data> da = new ArrayList<>();for (int i=0;i<50;i++){if(i%3==0){da.add(new Data("我是添加布局1的数据"+i,1));}else {da.add(new Data("我是添加布局0的数据"+i,0));}}list.addAll(da);adapter.upData(list);}public class Data{String content;int position;public Data(String content, int position) {this.content = content;this.position = position;}}
}

以上是全部代码 都测试过 单布局跟多布局 














/*
* 图片处理
* */public class ImageLoad extends ViewHodle.HolderImageLoader {public ImageLoad(String path) {super(path);}@Overridepublic void loadImage(Context context, ImageView imageView, String path) {//这里你可以用Glide 也可以用其他第三方的网络加载图片Glide.with(context).load(path).into(imageView);}}
}

打造通用的recycleview的adapter相关推荐

  1. springboot+aop+自定义注解,打造通用的全局异常处理和参数校验切面(通用版)

    springboot+aop+自定义注解,打造通用的全局异常处理和参数校验切面(通用版) 参考文章: (1)springboot+aop+自定义注解,打造通用的全局异常处理和参数校验切面(通用版) ( ...

  2. jdbc增删改查有哪些步骤_JDBC打造通用增删改方法

    [JDBC]打造通用增删改方法原创 简介:在我们学习JDBC的时候或者编写简单的Servlet程序的时候,经常需要增删改查等操作,很多小伙伴的做法是:增删改查各写一个方法,这样写虽然可以实现我们想要的 ...

  3. 08_android_打造通用svg地图自定义组件

    android_打造通用svg地图自定义组件 一.地图svg数据准备 这里笔者已经整理了云南省16个地州.129个县的svg path数据,如果你要绘制的是其他省份,甚至是中国地图,那么可以从下面这个 ...

  4. 最新web/springboot打造通用的短信验证码微服务(详细)

    前言 很久之前的一篇文章, 最新web/java/jsp实现发送手机短信验证码和邮箱验证码的注册登录功能(详细),截止到目前,依然有很多小伙伴,私信需要帮助,于是我再加一篇,让大家能更好的使用.(当然 ...

  5. RecycleView和Adapter的基本使用

    1.创建布局文件,word_fragment用来放Recycle,word_fragment_grad_cell用来放小单元 word_fragment布局: word_fragment_grad_c ...

  6. 打造炫酷通用的ViewPager指示器 Adapter模式适配所有 1

    ###1.概述 上一期我们已经写了一篇 打造炫酷通用的ViewPager指示器 - 玩转字体变色 可是这种效果虽然绚烂可以装装A和C之间,但是在实际的大多数效果中并不常见,只是在内涵段子中有这个效果而 ...

  7. 北大清华合力打造通用人工智能实验班

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 今日,北京大学官方微信发文称:北大清华联手开启通用人工智能实验班. ...

  8. 智源研究院发布“智能体系架构与芯片”重大研究方向,打造通用智能处理器,突破“算法共性特征”难题...

    9 月 18 日上午,北京智源人工智能研究院(以下简称"智源研究院")在北大科技园举行"智能体系架构与芯片"重大研究方向发布会,智源研究院院长黄铁军以及北京人工 ...

  9. 学界丨北大清华合力打造通用人工智能实验班,朱松纯教授领衔

    来源:北京大学微信公众号.AI科技评论.新智元 据悉,首批北大通班同学已经开课,清华通班也已启动首批招生.师资方面,清华和北大各有优势学科,在通班的合作上可以优势互补:在平台方面,以朱松纯教授牵头筹建 ...

最新文章

  1. 计算机网络技术社团纳新海报,精品社团纳新 | 加入计算机协会和我一起做些有意义的事儿吧~...
  2. 大数据在犯罪预防中有独特价值
  3. angularjs php上传文件,AngularJS 文件上传 的功能你了解的多少?几分钟就让你了解angularjs的文件上传...
  4. php 图片处理库 Imagick 代替 gd
  5. SpringMVC---数据校验
  6. asp.net引用用户控件
  7. c++中lambda表达式用法
  8. Eclipse中如何恢复已删除文件
  9. 公司6:JrVue重用布局
  10. MFC 网络编程小结
  11. hibernate.hbm2ddl.auto配置及意义
  12. 【2021Java最新学习路线】java前端开发
  13. 使用Java轻松破解顶象滑动拼图验证码,成功率接近100%?
  14. linux wifi音箱,基于Orangpi Zero和Linux ALSA实现WIFI无线音箱(三)
  15. 读研整活笔记1:调研编译器solang
  16. 苹果电脑上的Word打不开怎么办?Word文件怎么恢复?
  17. js获取当前是第几周
  18. 电子商务网站之购买欲望和购买目标
  19. mysql 查询字母集合_使用MySQL查询查找所有以字母“ a”,“ b”或“ c”开头的名称?...
  20. oracle远程不能访问权限,oracle限制远程访问

热门文章

  1. 搜索引擎 梁斌的那本走进搜索引擎很不错,简明扼要
  2. 晟辉论金:4.20黄金修正阶段,今日黄金行情走势分析及操作建议
  3. 校园招聘-找工作的经验
  4. intel E810 100G网卡iperf测试
  5. ImageMagick图像处理
  6. 电脑不支持MOV怎么办 怎么快速将mov格式转换为MP4 1
  7. 华为鸿蒙系统智能家居产品大全,华为鸿蒙系统应用于智能家居产品中,有何卖点...
  8. IntelliJ IDEA Live Temlates功能使用举例介绍
  9. Http请求 url 请求头 请求体 大小长度限制
  10. 101 个 MySQL 的调节和优化的提示