一般不优化的adapter通常继承自BaseAdapter会出现一下几个问题:
  1. getCount(), getItem(), getItemId()代码都要去重写,一个adapter还行,如果adapter越来越多的话,每个adapter都这么写就超级恶心了。
  2. 就是getview里面if else 对convertview的判断的代码也是每个adapter都要去写,超级恶心。
  3. 然后就是如果优化adapter的findviewByid的加载,肯定要使用viewholder,那么每个adapter里面都写viewholder,恶心。
那么如何解决这问题呢:

  1. 首先就是getcount,getitem(),getitemId的代码最好在父类去实现,子类继承,就能让子类继承这些方法,而不用去多余写这些代码,实现代码重用。
  2. 考虑业务需求,如果有下拉刷新,上拉加载更多的操作,肯定有刷新adapter中list数据,也坑定有加载更多的方法,写到每个adapter里面既不美观,代码里面总是要带个notifydatesetchange的代码,恶心,因此这些操作可以封装到父类中去,比如如下的updateListview,addBottom操作。
  3. 对getview里面对viewholder以及频繁的findviewByd进行简化操作,封装到如下的viewholder类里面去,其中getViewHolder()方法简化了每个adapter的判断convertview是否为null以及settag的操作,getView()简化findviewByid的操作。
 1 public abstract class EasyAdapter<T> extends BaseAdapter {
 2     private LayoutInflater inflater;
 3     private int layoutId;
 4     private List<T> mlist = new ArrayList<T>();
 5
 6     public EasyAdapter(Context context, int layoutId, List<T> list) {
 7         super();
 8         this.inflater = LayoutInflater.from(context);
 9         this.layoutId = layoutId;
10         this.mlist = list;
11     }
12
13     /**
14      * 往顶部添加数据
15      *
16      * @param list
17      */
18     public void add2Head(List<T> list) {
19         mlist.addAll(0, list);
20         notifyDataSetChanged();
21     }
22
23     public void clearAll() {
24         mlist.clear();
25         notifyDataSetChanged();
26     }
27
28     public List<T> getAllList() {
29         return mlist;
30     }
31
32     /**
33      * 往底部添加数据
34      *
35      * @param list
36      */
37     public void add2Bottom(List<T> list) {
38         mlist.addAll(list);
39         notifyDataSetChanged();
40     }
41
42     public void add2Bottom(T t) {
43         mlist.add(t);
44         notifyDataSetChanged();
45     }
46
47     /**
48      * @Title: updateListView
49      * @Description: TODO(更新BaseAdapter中的数据)
50      * @param @param list 设定文件
51      * @return void 返回类型
52      * @throws
53      */
54     public void updateListView(List<T> list) {
55         mlist = list;
56         notifyDataSetChanged();
57     }
58
59     @Override
60     public int getCount() {
61         return mlist.size();
62     }
63
64     @Override
65     public T getItem(int position) {
66         return mlist.get(position);
67     }
68
69     @Override
70     public long getItemId(int position) {
71
72         return position;
73     }
74
75     /**
76      * 实际显示View的方法,使用抽象方法强制调用者覆写!
77      */
78     @Override
79     public View getView(int position, View convertView, ViewGroup parent) {
80
81         ViewHolder viewHolder = ViewHolder.getViewHolder(parent, convertView,
82                 inflater, layoutId);
83         convert(viewHolder, mlist.get(position));
84         return viewHolder.getConvertView();
85
86     }
87
88     public abstract void convert(ViewHolder viewHolder, T t);
89
90 }

ViewHolder 的封装:
  1 public class ViewHolder {
  2     private SparseArray<View> views;
  3     private View convertView;
  4
  5     public ViewHolder(ViewGroup parent,LayoutInflater inflater,int layoutId) {
  6         this.views = new SparseArray<View>();
  7         this.convertView = inflater.inflate(layoutId,parent,false);
  8         this.convertView.setTag(this);
  9     }
 10
 11     /**
 12      * 得到viewHolder
 13      * @param parent
 14      * @param convertView
 15      * @param inflater
 16      * @param layoutId
 17      * @return
 18      */
 19     public static ViewHolder getViewHolder(ViewGroup parent,View convertView,LayoutInflater inflater,int layoutId){
 20         if (convertView==null){
 21             return new ViewHolder(parent,inflater,layoutId);
 22         }
 23         return (ViewHolder) convertView.getTag();
 24     }
 25
 26     /**
 27      * 得到convertView
 28      * @return
 29      */
 30     public View getConvertView() {
 31         return convertView;
 32     }
 33
 34     /**
 35      * 根据Id得到view
 36      * @param viewId
 37      * @param <T>
 38      * @return
 39      */
 40     public <T extends View>T getView(int viewId){
 41         View view = views.get(viewId);
 42         if (view==null){
 43             view = convertView.findViewById(viewId);
 44             views.put(viewId,view);
 45         }
 46         return (T) view;
 47     }
 48
 49     /**
 50      * 根据id得到TextView
 51      * @return
 52      */
 53     public TextView getTextView(int viewId){
 54         return getView(viewId);
 55     }
 56     /**
 57      * 根据id得到ImageView
 58      * @return
 59      */
 60     public ImageView getImageView(int viewId){
 61         return getView(viewId);
 62     }
 63     /**
 64      * 根据id得到Button
 65      * @return
 66      */
 67     public Button getButton(int viewId){
 68         return getView(viewId);
 69     }
 70     /**
 71      * 根据id得到RadioButton
 72      * @return
 73      */
 74     public RadioButton getRadioButton(int viewId){
 75         return getView(viewId);
 76     }
 77     /**
 78      * 根据id得到CheckBox
 79      * @return
 80      */
 81     public CheckBox getCheckBox(int viewId){
 82         return getView(viewId);
 83     }
 84     /**
 85      * 根据id得到ImageButton
 86      * @return
 87      */
 88     public ImageButton getImageButton(int viewId){
 89         return getView(viewId);
 90     }
 91     /**
 92      * 根据id得到ImageButton
 93      * @return
 94      */
 95     public EditText getEditText(int viewId){
 96         return getView(viewId);
 97     }
 98
 99     /**
100      * 根据id得到RelativeLayout
101      * @return
102      */
103     public RelativeLayout getRelativeLayout(int viewId){
104         return getView(viewId);
105     }
106 }

下面是在项目中的使用,可见效果是如此的简洁和高效:
  1.  1 public class MainAdapter extends EasyAdapter<MainBean> {
     2
     3     public MainAdapter(Context context, int layoutId, List<MainBean> list) {
     4         super(context, layoutId, list);
     5     }
     6
     7     @Override
     8     public void convert(ViewHolder viewHolder, MainBean t) {
     9         ImageView imageView = viewHolder.getImageView(R.id.imageview);
    10         TextView textView = viewHolder.getTextView(R.id.textView);
    11         ImageLoader.getInstance().displayImage(t.getImageUrl(), imageView);
    12         textView.setText(t.getContent());
    13     }
    14 }

对adapter的封装优化相关推荐

  1. RecyclerView Adapter 优雅封装搞定所有列表

    转载自: 依然范特稀西 RecycleView加载列表,封装Adapter,快速高效的添加一个列表(包括单 Item 列表和多item列表). 理念 1, 构造一个通用的Adapter模版,避免每添加 ...

  2. android 中自定义安装,Android开发中ListView自定义adapter的封装

    [引入] 我们一般编写listView的时候顺序是这样的: •需要展示的数据集List •为这个数据集编写一个ListView •为这个ListView编写一个Adapter,一般继承自BaseAda ...

  3. RecyclerView.Adapter的封装(RecyclerAdapter)

    思路 ListView中已经自带了添加头布局和添加底部布局的方法,但是在RecyclerView中,却没有默认实现,这导致在实现一些特殊布局中不是那么的方便. 在实现RecyclerView.Adap ...

  4. 小鱼儿yr系统封装优化设置辅助工具V2.05.3

    分享一款封装系统时写的系统优化设置封装辅助工具.软件内容包括100多项优化和清理内容,系统个性设置与应用关联备份,用户存储路径与资料转移,PE里目标系统信息查看,WIN10输入法仿WIN7一键设置,O ...

  5. java 封装优化工具_利用Java注解的简单封装的一次优化

    悟红尘:​zhuanlan.zhihu.com 在我们的项目中和后台的通信的时候,为了防止别人截获并篡改信息,于是决定启用一套自己验签规则,那就是将所有属性的值拼接起来进行SHA256签名,在这个字符 ...

  6. 第三天的实现,主要是封装优化,不会文件啊,把优化后的主文件发上来(用了xlb)

    #import "ViewController.h" #import "HMApp.h" #import "HMAppView.h" @in ...

  7. Android 优秀文章收集整理集合

    转载 自    https://github.com/jiang111/awesome-android-tips 记录自己遇到的比较有价值的Android相关的blog MaHua是online md ...

  8. Android优秀文章收集(转载)

    http://blog.csdn.net/u010375364/article/details/52200425 http://blog.csdn.net/u010375364/article/det ...

  9. 超级封装RecyclerView的适配器Adapter 只需二三十行代码

    前言 android开发中,RecyclerView是很常用的控件,而且功能也很强大,并且各种三方封装或者扩展库也是非常多,如:BaseQuickAdapter,XRecyclerview,当然还有我 ...

最新文章

  1. 天涯htmlcss基础框架
  2. linux raid更换硬盘,linux系统raid1更换故障硬盘处理过程
  3. 我的第一个Spring MVC程序
  4. hadoop读取mysql数据_Pyspark连接mysql、hive、hdfs 实例展示
  5. P2403 [SDOI2010]所驼门王的宝藏(强连通分量)(拓扑排序)
  6. 【LeetCode】Minimum Depth of Binary Tree 二叉树的最小深度 java
  7. bzoj1034题解
  8. 微信小程序自定义组件
  9. 设置HighCharts,让它生成的图表居中显示。
  10. 疫情当前,企业“逆势而上”还需“上云”加速
  11. matlab实现k-l算法,Matlab实现动态规划算法 (dynamic programming algorithm)
  12. 汇编语言(王爽)第四版检测点2.2答案
  13. 帅帅什么意思_帅帅帅是什么意思
  14. 30个优秀的后台管理界面设计案例分享
  15. 如意验证对接TV 神,马搭建 源码,搭建简单,仅供学习交流
  16. C++实现暴力筛、朴素素数筛、埃氏素数筛、欧拉素数筛的解法
  17. 【小5聊】winform窗体之最小化事件捕捉以及最小化到任务栏功能
  18. rtx2060为什么叫智商卡_八款RTX2060简单点评,谁是丐中丐,谁又是丐帮帮主
  19. 浏览器配置异常_IE浏览器常见故障及问题解决方法大全
  20. 基于FPGA的一维卷积神经网络CNN的实现(二)资源分配

热门文章

  1. 自主芯片+国产系统!天河三号原型机研制完成,中国超算有望重回No.1
  2. 对话张璐:硅谷VC没有因区块链失眠,AI应用进入产业变现阶段
  3. [CentOS 7] TexLive2017中kpsewhich Bug的修复
  4. 分析ERP上线时可能存在的失误
  5. 美法院起诉黑客组织成员 为暴雪服务器攻击者
  6. 【转】使用lockbits方法处理图像
  7. net.sf.ehcache.util.UpdateChecker
  8. 数据仓库入门(实验6)添加层次结构
  9. fortigate的RADIUS域用户的组认证为SSL×××用户(上)
  10. window7安装sqlserver2000企业版