使用RecycleView时候的adapter的简单封装
2016-02-13 14:04
323 查看
大家可能会看到,每次我们使用listview,recycleview的时候,如果只是简单的使用,我们大都会给一个adapter适配器,来接收和传递数据,但是当我们的项目很大的时候,是不是要写很多的adapter,并且有的时候代码几乎是一样的,简单来说也就是使用textview、imageview,来设置文字和图片,那么可不可以简单的封装一下,把公共的提取出来,我们每次用的时候只是,把变的数据(布局可能变,布局参数的设置值可能变)我们自己去实现。
(https://github.com/JoanZapata/base-adapter-helper)
这个如果大家想要了解,可以去试试的,使用起来也是很简单的。我在这里只是简单的上传一张图,
当然了哈,如果想要使用,还是要把他的这个项目依赖一下哈,或者是直接把四个java代码文件copy到你的项目中即可。
我们知道使用recycleview的时候,viewholder是强制的,而且我们如果只是简单的使用,我们一般会在把viewholder写在一起,这里我们分开来写,也就是CommentViewHolder和CommentAdapter
CommentViewHolder.java:
CommentAdapter.java:
好了,简单的封装就可以了,接下来我们来看下怎么使用吧。
使用到的user 的bean类:
这样就行了,其他的给recycleview设置一些简单的设置和适配器,和原来的是一样的,如果有疑问可以看下RecycleView的简单介绍
这里,我们看到代码量是有点多,但是要知道,我们这里只是使用了一个adapter,如果我们的项目中使用了十几个,二十几个,而且每个的item数量很多,这样写就会节省很多的代码的哈,如果有兴趣也可以去看下base-adapter-helper的实现,好了,附件一下github该项目的地址:
https://github.com/wuyinlei/BaseAdapterHelperDemo
启发
借鉴思路:用过github上的一个开源的项目[base-adapter-helper]:(https://github.com/JoanZapata/base-adapter-helper)
这个如果大家想要了解,可以去试试的,使用起来也是很简单的。我在这里只是简单的上传一张图,
当然了哈,如果想要使用,还是要把他的这个项目依赖一下哈,或者是直接把四个java代码文件copy到你的项目中即可。
[code]compile 'com.joanzapata.android:base-adapter-helper:1.1.11'
来看下我们的实现
好了,接下来开始我们的adapter的简单封装吧。(适用于recycleview):我们知道使用recycleview的时候,viewholder是强制的,而且我们如果只是简单的使用,我们一般会在把viewholder写在一起,这里我们分开来写,也就是CommentViewHolder和CommentAdapter
CommentViewHolder.java:
[code]package com.example.baseadapterhelperdemo.adapter; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.util.SparseArray; import android.view.View; import android.widget.ImageView; import android.widget.TextView; /** * Created by 若兰 on 2016/2/13. * 一个懂得了编程乐趣的小白,希望自己 * 能够在这个道路上走的很远,也希望自己学习到的 * 知识可以帮助更多的人,分享就是学习的一种乐趣 * QQ:1069584784 * csdn:http://blog.csdn.net/wuyinlei */ public class CommentViewHolder extends RecyclerView.ViewHolder { /** * 这个稀疏数组,网上说的是提高效率的 */ private final SparseArray<View> views; private View convertView; /** * 如果用到了,比如我们用glide加载图片的时候,还有其他的需要用到上下文的时候 */ private Context mContext; public CommentViewHolder(View itemView) { super(itemView); views = new SparseArray<>(); convertView = itemView; mContext = itemView.getContext(); } /** * 返回一个具体的view对象 * 这个就是借鉴的base-adapter-helper中的方法 * * @param viewId * @param <T> * @return */ protected <T extends View> T getView(int viewId) { View view = views.get(viewId); if (view == null) { view = convertView.findViewById(viewId); views.put(viewId, view); } return (T) view; } public void setText(int resId, String text) { TextView view = getView(resId); view.setText(text); } /** * 下面的这个是加载显示图片的,我用到了glide,这里只是演示,并没有显示 * * @param resId * @param url */ public void setImageByUrl(int resId, String url) { ImageView imageView = getView(resId); //Glide.with(mContext).load(url).asBitmap().into(imageView); } //// TODO: 2016/2/13 当然了哈,在这里我们可以定义其他的方法,这个demo我只是设置了textview,想要使用其他空间的 //自己去定义方法 }
CommentAdapter.java:
[code]package com.example.baseadapterhelperdemo.adapter; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import java.util.List; /** * Created by 若兰 on 2016/2/13. * 一个懂得了编程乐趣的小白,希望自己 * 能够在这个道路上走的很远,也希望自己学习到的 * 知识可以帮助更多的人,分享就是学习的一种乐趣 * QQ:1069584784 * csdn:http://blog.csdn.net/wuyinlei */ public abstract class CommentAdapter<T> extends RecyclerView.Adapter<CommentViewHolder> { /** * 这里我我们是提取的公共的,所以我们在这用泛型T,而不是给出具体的值,具体的交给我们的实现类去传入 */ private List<T> mTList; //布局id private int layoutId; /** * 这里构造函数,传入数据的list和布局 * * @param TList * @param layoutId */ public CommentAdapter(List<T> TList, int layoutId) { mTList = TList; this.layoutId = layoutId; } @Override public CommentViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { LayoutInflater inflater = LayoutInflater.from(parent.getContext()); View view = inflater.inflate(layoutId, null); return new CommentViewHolder(view); } @Override public void onBindViewHolder(CommentViewHolder holder, int position) { convert(holder, mTList.get(position)); } /** * 留给调用者去实现 * * @param holder * @param t */ public abstract void convert(CommentViewHolder holder, T t) ; @Override public int getItemCount() { return mTList.size(); } }
好了,简单的封装就可以了,接下来我们来看下怎么使用吧。
[code]package com.example.baseadapterhelperdemo.adapter; import com.example.baseadapterhelperdemo.R; import com.example.baseadapterhelperdemo.bean.User; import java.util.List; /** * Created by 若兰 on 2016/2/13. * 一个懂得了编程乐趣的小白,希望自己 * 能够在这个道路上走的很远,也希望自己学习到的 * 知识可以帮助更多的人,分享就是学习的一种乐趣 * QQ:1069584784 * csdn:http://blog.csdn.net/wuyinlei */ public class MyAdapter extends CommentAdapter<User> { /** * 这里构造函数,传入数据的list和布局 * * @param TList * @param layoutId */ public MyAdapter(List<User> TList, int layoutId) { super(TList, R.layout.item); } /** * 这个我们使用的时候直接传入数据即可 * @param list */ public MyAdapter(List<User> list){ super(list,R.layout.item); } @Override public void convert(CommentViewHolder holder, User user) { //在这里我们直接绑定数据就行了,是不是少了很多的重复的代码呢 holder.setText(R.id.tvName,user.getName()); holder.setText(R.id.tvSex,user.getSex()); } }
使用到的user 的bean类:
[code]public class User { private String name; private String sex; public User(String name, String sex) { this.name = name; this.sex = sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
这样就行了,其他的给recycleview设置一些简单的设置和适配器,和原来的是一样的,如果有疑问可以看下RecycleView的简单介绍
这里,我们看到代码量是有点多,但是要知道,我们这里只是使用了一个adapter,如果我们的项目中使用了十几个,二十几个,而且每个的item数量很多,这样写就会节省很多的代码的哈,如果有兴趣也可以去看下base-adapter-helper的实现,好了,附件一下github该项目的地址:
https://github.com/wuyinlei/BaseAdapterHelperDemo
相关文章推荐
- 项目技术总结一之JSONP实现跨域调度
- [BZOJ2243] [SDOI2011]染色
- 【N32926/N32916】QT系统的编译
- 本地化处理(IOS)
- POJ 3041 Asteroids(最小覆盖数)
- javascript看视频笔记
- CSS语法
- Scala编程Chapter24: 抽取器
- 在Ubuntu14.04中安装ROS Indigo
- Count the Colors (ZOJ_1610) 线段树 + 线段统计
- 《SSH客户端连接服务器(SecureCRT)》
- 基础HTML练习
- UI基础-02 Xcode中的iOS工程模板
- redis练习手册<五>Redis 命令
- 9.UITableView的设置
- 跑步与巨流河
- uva10382 -Watering Grass
- 跑步与巨流河
- [算法]最长子数组问题
- git diff的用法