一般不优化的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的操作。
 public abstract class EasyAdapter<T> extends BaseAdapter {
private LayoutInflater inflater;
private int layoutId;
private List<T> mlist = new ArrayList<T>(); public EasyAdapter(Context context, int layoutId, List<T> list) {
super();
this.inflater = LayoutInflater.from(context);
this.layoutId = layoutId;
this.mlist = list;
} /**
* 往顶部添加数据
*
* @param list
*/
public void add2Head(List<T> list) {
mlist.addAll(0, list);
notifyDataSetChanged();
} public void clearAll() {
mlist.clear();
notifyDataSetChanged();
} public List<T> getAllList() {
return mlist;
} /**
* 往底部添加数据
*
* @param list
*/
public void add2Bottom(List<T> list) {
mlist.addAll(list);
notifyDataSetChanged();
} public void add2Bottom(T t) {
mlist.add(t);
notifyDataSetChanged();
} /**
* @Title: updateListView
* @Description: TODO(更新BaseAdapter中的数据)
* @param @param list 设定文件
* @return void 返回类型
* @throws
*/
public void updateListView(List<T> list) {
mlist = list;
notifyDataSetChanged();
} @Override
public int getCount() {
return mlist.size();
} @Override
public T getItem(int position) {
return mlist.get(position);
} @Override
public long getItemId(int position) { return position;
} /**
* 实际显示View的方法,使用抽象方法强制调用者覆写!
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = ViewHolder.getViewHolder(parent, convertView,
inflater, layoutId);
convert(viewHolder, mlist.get(position));
return viewHolder.getConvertView(); } public abstract void convert(ViewHolder viewHolder, T t); }
ViewHolder 的封装:
 public class ViewHolder {
private SparseArray<View> views;
private View convertView; public ViewHolder(ViewGroup parent,LayoutInflater inflater,int layoutId) {
this.views = new SparseArray<View>();
this.convertView = inflater.inflate(layoutId,parent,false);
this.convertView.setTag(this);
} /**
* 得到viewHolder
* @param parent
* @param convertView
* @param inflater
* @param layoutId
* @return
*/
public static ViewHolder getViewHolder(ViewGroup parent,View convertView,LayoutInflater inflater,int layoutId){
if (convertView==null){
return new ViewHolder(parent,inflater,layoutId);
}
return (ViewHolder) convertView.getTag();
} /**
* 得到convertView
* @return
*/
public View getConvertView() {
return convertView;
} /**
* 根据Id得到view
* @param viewId
* @param <T>
* @return
*/
public <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;
} /**
* 根据id得到TextView
* @return
*/
public TextView getTextView(int viewId){
return getView(viewId);
}
/**
* 根据id得到ImageView
* @return
*/
public ImageView getImageView(int viewId){
return getView(viewId);
}
/**
* 根据id得到Button
* @return
*/
public Button getButton(int viewId){
return getView(viewId);
}
/**
* 根据id得到RadioButton
* @return
*/
public RadioButton getRadioButton(int viewId){
return getView(viewId);
}
/**
* 根据id得到CheckBox
* @return
*/
public CheckBox getCheckBox(int viewId){
return getView(viewId);
}
/**
* 根据id得到ImageButton
* @return
*/
public ImageButton getImageButton(int viewId){
return getView(viewId);
}
/**
* 根据id得到ImageButton
* @return
*/
public EditText getEditText(int viewId){
return getView(viewId);
} /**
* 根据id得到RelativeLayout
* @return
*/
public RelativeLayout getRelativeLayout(int viewId){
return getView(viewId);
}
}
下面是在项目中的使用,可见效果是如此的简洁和高效:
  1.  public class MainAdapter extends EasyAdapter<MainBean> {
    
         public MainAdapter(Context context, int layoutId, List<MainBean> list) {
    super(context, layoutId, list);
    } @Override
    public void convert(ViewHolder viewHolder, MainBean t) {
    ImageView imageView = viewHolder.getImageView(R.id.imageview);
    TextView textView = viewHolder.getTextView(R.id.textView);
    ImageLoader.getInstance().displayImage(t.getImageUrl(), imageView);
    textView.setText(t.getContent());
    }
    }

对adapter的封装优化的更多相关文章

  1. Adapter的封装之路

    原文:Adapter的封装之路 一.几种常见列表效果: 假如要用RecyclerView实现下面的几种效果,你会如何实现呢? 效果1:单布局效果   效果2:多布局效果 有多种Item布局   效果3 ...

  2. android代码优化----ListView中自定义adapter的封装(ListView的模板写法)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  3. android RecycleView Adapter简单封装

    早些时候我们使用系统提供个的BaseAdapter的时候为了满足大家的需要,我们总会对BaseAdapter做一层上层的封装,然后对于实际业务我们只需要关心getView里面的View即可,是代码可读 ...

  4. RecyclerView下拉刷新上拉加载(三)—对Adapter的封装

    RecyclerView下拉刷新上拉加载(一) http://blog.csdn.net/baiyuliang2013/article/details/51506036 RecyclerView下拉刷 ...

  5. MemCached Cache Java Client封装优化历程

    1.什么是memcached?(从官网翻译翻译) 免费和开源.高性能.分布式内存对象缓存系统,通用在自然界,但用于加速动态web应用程序,减轻数据库负载. Memcached是一个内存中的键值存储为小 ...

  6. ORM框架 EF - code first 的封装 优化一

    上一节我们讲到对EF(EntityFramework)的初步封装,任何事情都不可能一蹴而就,通过大量的实际项目的实战,也发现了其中的各种问题.在这一章中,我们对上一章的EF_Helper_DG进行优化 ...

  7. ListView适配器Adapter介绍与优化

    一.ListView与Adapter的关系 ListView是Android开发过程中较为常见的组件之一,它将数据以列表的形式展现出来.一般而言,一个ListView由以下三个元素组成: 1.View ...

  8. 全栈之路-杂篇-前端Http请求封装优化

    在项目开发过程中,代码的封装是很有必要的,我觉得这是程序员进阶的一个重要的技能,不会封装代码,你的代码看起来乱的一批,基本上不能维护,像一次性塑料袋一样,用完一次就失去了价值,这同时也会无缘无故的增加 ...

  9. Java面向对象封装优化2_构造方法

    1. 类 package cn.itcast.day06.demo05; /* 一个标准的类通常要拥有下面四个组成部分: 1. 所有的成员变量都要使用private关键字修饰 2. 为每一个成员变量编 ...

随机推荐

  1. 按自己的想法去理解事件和泛型(C#)

    上一篇那些年困扰我们的委托(C#)讲了委托,这一篇自然就轮到事件了. 不喜欢官方的表达方式,喜欢按照自己的想法去理解一些抽象的东西. 事件 考虑到委托使用的一些缺陷,就有了事件.委托是不安全的,打个比 ...

  2. ASP.NET Zero--11.一个例子(4)商品分类管理-数据检验

    虽然已经可以添加商品分类,但还需进行优化,比如:用户是否输入.输入字符串是否有格式限制等等. 打开添加分类按钮,名称不输入任何字符,直接保存,会发现列表添加一条空记录.在实际项目中,这是不允许出现的事 ...

  3. C#开发学习——常用的正则表达式

    对于想学习正则表达式的童鞋,一些基础的语法啥的,可以参考 http://www.cnblogs.com/China3S/archive/2013/11/30/3451971.html 下边是一些我们常 ...

  4. TCP的滑动窗口机制【转】

    原文链接:http://www.cnblogs.com/luoquan/p/4886345.html      TCP这个协议是网络中使用的比较广泛,他是一个面向连接的可靠的传输协议.既然是一个可靠的 ...

  5. ie7,IE8不支持document.getElmentsByClassName的问题

    if (!document.getElementsByClassName) { document.getElementsByClassName = function(className, elemen ...

  6. mysql报错1024-can't get hostname for your address

    前一段时间mysql用的好好的,突然一天,mysql启动后,在使用navicat连接数据库的时候 报错1024-can't get hostname for your address 这里我是这样解决 ...

  7. B树、B-树、B+树、B*树详解

    注:本文为个人学习摘录,原文地址:http://www.blogjava.net/supercrsky/articles/185167.html B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿 ...

  8. httpclient用法

    Http通信方式:HttpURLConnection和HttpClient HttpURLConnection是java的标准类,什么都没封装,用起来太原始,不方便HttpClient就是一个增强版的 ...

  9. ideaIU-2016.2.5激活

    IntelliJ IDEA的在线注册码生成页面 http://idea.iteblog.com 新的License server地址为:http://idea.iteblog.com/key.php

  10. PyQt5+python3+pycharm开发环境配置

    1.下载PyQt https://sourceforge.net/projects/pyqt/files/PyQt5/PyQt-5.6/PyQt5-5.6-gpl-Py3.5-Qt5.6.0-x32- ...