对于 ListView 的使用,他有两个重点的部分,一个是下拉刷新和加载更多,这个今天我们不讲,另外一个是 BaseAdapter 的使用,这个是今天的主角,BaseAdapter 中又有 ViewHolder 模式来实现缓存视图
继承BaseAdapter类,实现以下几个方法

getCount() ->int 返回的是 List的个数

getView(int, View, ViewGroup)->View 返回显示的视图
getItemId(int position) ->long返回position位置的 id
getItem(int position)->Object 返回position位置的 item
现在我们在这个基础上,继承 BaseAdapter 实现几个方法.
MBaseAdapter.class

public abstract class MBaseAdapter  extends BaseAdapter {
 
    public LayoutInflater inflater;
    public Context context;
    public List<?> list;
 
    public MBaseAdapter(Context context, List<?> list) {
        this.context = context;
        this.list = list;
        this.inflater = LayoutInflater.from(context);
    }
 
    public MBaseAdapter(LayoutInflater inflater, List<?> list) {
        this.context = inflater.getContext();
        this.list = list;
        this.inflater = inflater;
    }
    @Override
    public int getCount() {
        return list.size();
    }
 
    @Override
    public Object getItem(int position) {
        return list.get(position);
    }
 
    @Override
    public long getItemId(int position) {
        return position;
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return getView33(position, convertView, parent);
    }
 
    /**
     * 与BaseAdapter 中的getView() 一样
     *
     * @param position
     * @param convertView
     * @param parent
     * @return
     */
    public abstract View getView33(int position, View convertView,
                                   ViewGroup parent);
 
 
 
 
}
为了实现 ViewHodler 缓存我写了这个工具类
ViewHolderUtils.class

public class ViewHolderUtils {
 
    /**
     * 得到视图为 view 的 viewHodler
     * @param view
     * @return
     */
    public ViewHolder get(View view) {
        ViewHolder viewHolder = (ViewHolder) view.getTag();
        if (viewHolder == null) {
            viewHolder = new ViewHolder(view);
            view.setTag(viewHolder);
        }
 
        return viewHolder;
    }
 
 
    /**
     * viewhodler  存储 view的子 view 的索引
     * @author zzz40500
     *
     */
    public class ViewHolder {
 
        private SparseArray<View> viewHolder;
        private View view;
 
        public ViewHolder(View view) {
            this.view = view;
            viewHolder = new SparseArray<View>();
        }
 
        public <T extends View> T get(int id) {
 
            View childView = viewHolder.get(id);
            if (childView == null) {
                childView = view.findViewById(id);
                viewHolder.put(id, childView);
            }
            return (T) childView;
 
        }
 
 
        /**
         * 得到 view 下 id 为 id 的TextView 这里没有做类型的判断所以你要保证 id 为 id 的控件确实为 TextView类型
         * @param id
         * @return
         */
        public TextView getTextView(int id) {
 
            return get(id);
        }
 
        /**
         * 直接设置文字
         * @param id
         * @param text
         */
        public void setText(int id,String text){
 
            getTextView(id).setText(text);
        }
 
        public ImageView getImageView(int id) {
 
            return get(id);
        }
 
 
    }
 
}
现在结合上面两个类,我们可是实现了更简单的 adapter 写法
AutoAdapter.class

public abstract class AutoAdapter extends MBaseAdapter{
 
        /**
         * item 的布局文件
         */
        private int layoutID;
        /**
         * 这是一个生产 ViewHolder的工具类
         */
        private ViewHolderUtils vh;
 
        public AutoAdapter(Context context, List<?> list, int layoutID) {
            super(context, list);
            this.layoutID = layoutID;
            vh = new ViewHolderUtils();
        }
 
        @Override
        public View getView33(int position, View convertView, ViewGroup parent) {
 
            if (convertView == null) {
                convertView = inflater.inflate(layoutID, parent, false);
            }
            getView33(position, convertView, vh.get(convertView));
            return convertView;
        }
 
        /**
         * 通过暴露这个方法,通过操作vh实现将数据的绑定在视图上
         * @param position
         * @param v
         * @param vh
         */
        public abstract void getView33(int position, View v, ViewHolderUtils.ViewHolder vh);
 
}
重点来了:
我们现在有一个适配器要写,怎么写呢,只要继承AutoAdapter,
我们只要实现了两个方法:getView33和它自身的构造方法,他就可以快速实现了适配器的编写,并且这个适配器是 Viewhodler 的形式.
例子:

public class DemoAdapter extends AutoAdapter {
 
    public DemoAdapter(Context context, List<?> list) {
 
        /**
         * 这里的 LayoutID 确定 ListView item 的布局资源文件.
         */
        super(context, list, R.layout.item);
    }
 
    /**
     * 将数据绑定在视图上
     */
    @Override
    public void getView33(int position, View v, ViewHolder vh) {
        Entity item=(Entity) list.get(position);
        vh.getTextView(R.id.name).setText(item.getName());
        vh.getTextView(R.id.age).setText(item.getAge());
        vh.setText(R.id.height,item.getHeight()); 
    }
 
}
在 Activity 中的使用:


 BaseAdapter adapter=new DemoAdapter(this, dateA);      
     listView.setAdapter(adapter);



超简便的ListView中Adapter的写法的更多相关文章

  1. listView中adapter有不同的click事件的简单写法

    在android中,listview一般都是通过一个adapter来绑定数据,一般的item的点击事件都会指向同一个目标(intent),仅仅是所带的參数不同而已.但有的时候事与愿违,每一个item的 ...

  2. Android 关于ListView中adapter调用notifyDataSetChanged无效的原因

    话说这个问题已经困扰我很久了,一直找不到原因,我以为只要数据变了,调用adapter的notifyDataSetChanged就会更新列表,最近在做微博帐号管理这一块,想着动态更新列表,数据是变了,但 ...

  3. Android开发之关于ListView中adapter调用notifyDataSetChanged无效的原因

    1.数据源没有更新,调用notifyDataSetChanged无效. 2.数据源更新了,但是它指向新的引用,调用notifyDataSetChanged无效. 3.数据源更新了,但是adpter没有 ...

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

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

  5. [Android]ListView的Adapter.getView()方法中延迟加载图片的优化

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4139998.html 举个例子吧,以好友列表为例 ListVi ...

  6. android 自定义adapter和线程结合 + ListView中按钮滑动后状态丢失解决办法

    adapter+线程 1.很多时候自定义adapter的数据都是来源于服务器的,所以在获取服务器的时候就需要异步获取,这里就需要开线程了(线程池)去获取服务器的数据了.但这样有的时候adapter的中 ...

  7. listview中的adapter学习小结

    概述 Adapter是数据和UI之间的一个桥梁,在listview,gridview等控件中都会使用到,android给我们提拱了4个adapte供我们使用: BaseAdapter是一个抽象类,继承 ...

  8. ListView的adapter中getView方法一直调用

    当ListView的高度不定(比如重写ListView搞成可自己主动的扩展的ListView)或 ListView嵌套在SrollView(高度不定)中,listView中的一个item元素改变会使得 ...

  9. ListView中动态显示和隐藏Header&Footer

    ListView的模板写法 ListView模板写法的完整代码: android代码优化----ListView中自定义adapter的封装(ListView的模板写法) 以后每写一个ListView ...

随机推荐

  1. fork 炸弹

    一段古老的Linux shell程序 :() { :|:& };: 这是bash shell的写法,首先定义了一个函数:(),花括号里面是函数体,这里递归执行函数本身,通过管道在后台再递归运行 ...

  2. JavaWeb学习笔记(八)—— EL表达式

    一.EL表达式概述 在JSP开发中,为了获取Servlet域对象中存储的数据,经常需要书写很多Java代码,这样的做法会使JSP页面混乱,难以维护.为此,在JSP2.0规范中提供了EL表达式.EL全名 ...

  3. perl中一些模块的ubuntu中依赖包

    GD 先更新系统中的依赖包: sudo apt-get update sudo apt-get upgrade 进入 cpan> install GD 会提示没有安装libgd模块. 所以,先需 ...

  4. C++_IO与文件4-简单文件的输入与输出

    通过键盘输入和屏幕输出被称为是控制台输入/输出: 更广义上讲控制台的输入/输出也是一种特殊的文件输入/输出: 当使用cin进行输入时,程序将输入视为一系列的字节,其中的每个字节都被解释成字符编码: 不 ...

  5. C++_类入门1-对象和类的介绍

    面向对象是(OOP)是特殊的.设计程序的概念性方法:包含以下特性: 抽象: 封装和数据隐藏: 多态: 继承: 代码的可重用性: 为了实现这些特性并且将这些特性组合在一起,C++所做的最重要的改进是提供 ...

  6. LeetCode268.缺失数字

    268.缺失数字 描述 给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数. 示例 示例 1: 输入: [3,0,1] 输出: 2 示例 ...

  7. WordPress 设置GeoIP数据库目录权限时错误解决方案

    存在一个问题 更新完WP-statistics后,不知道为什么出现了一个错误提示:设置GeoIP数据库目录权限时错误,请确保您的Web服务器有权限写入到目录/var/www/html/wordpres ...

  8. 全排列 next_permutation() 函数的使用

    看来看去还是这篇博客比较简洁明了 https://www.cnblogs.com/My-Sunshine/p/4985366.html 顺便给出牛客网的一道题,虽然这道题用dfs写出全排列也能做,题意 ...

  9. kindeditor<=4.1.5文件上传漏洞

    最近发现很多网页篡改与暗链都是利用kindeditor编辑器,于是搜了一下kindeditor的漏洞,发现低于4.1.5版本的存在文件上传的漏洞,可以上传txt,html后缀的文档,许多恶意的文档貌似 ...

  10. selenium原理和尝试

    引用文章:https://www.cnblogs.com/Albert-Lee/p/6238866.html Selenium是一个自动化测试框架.因为它能够模拟人工操作,比如能在浏览器中点击按钮.在 ...