listview = (ListView) findViewById(R.id.listview);
imageview = (ImageView) findViewById(R.id.imageview);
//填充数据
for(int i = 0; i < 30; i++) {
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("name", "第" +i+"个人");
    map.put("age", i);
    list.add(map);
}
// 当listview中没有数据的时候显示空白的图片
listview.setEmptyView(imageview);
// 创建MyAdapter对象(这是不是用系统定义的ArrayAdapter)
MyAdapter adapter = new MyAdapter();
// 显示adapter对象到listview上
listview.setAdapter(adapter);
// 定制自己的Adapter 继承BaseAdapter
class MyAdapter extends BaseAdapter {
    // 该Adapter对应的数据列表中有多少项目
    @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;
    }
    // 根据下标生成(产生)listview中一行对应的视图
    // getView()不会立即把所有数据项全部加载 只加载用户可见的数据项
    // 当上面或下面的数据项因为上拉或下拉而退出屏幕的时候 系统回收该view
    // 重新往回拉的时候 又再次调用getView()进行加载
    // 合理的使用convertView --- 系统已经回收的view 可以拿来重新使用
    // 如果刚开始时 没有已经回收的view 则convertView==null
    // 正确的做法是 根据convertView是否为空来进行操作
    //   1. 如果convertView==null 从系统中分配内容
    //   2. 如果convertView!=null 直接拿convertView来使用
    // 同时 把view中的控件作为附属包裹连接在view中(getTag()、setTag())
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // 一行显示的view
        View view = null;
        // 模拟SimpleAdapter的做法 一行只显示两个TextView(封装在holder中)
        ViewHolder holder = null;
        // 判断convertView是否为空 并根据判断的结果进行不同的操作
        if(convertView == null) {
            // 从系统中分配内存作为view
            // 通过LayoutInflater把布局转换成view
            LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
            // new View()从系统中分配内存
            view = inflater.inflate(android.R.layout.simple_list_item_2, null);
            // 创建holder对象 从布局中找出textview(查找是很耗时间的)
            holder = new ViewHolder();
            holder.textview1 = (TextView) view.findViewById(android.R.id.text1);
            holder.textview2 = (TextView) view.findViewById(android.R.id.text2);
            // 把view与holder绑定在一起
            view.setTag(holder);
        } else {
            // 直接拿convertView来使用
            view = convertView;
            // 把holder从view的绑定中提取出来(基本上不需要时间的)
            holder = (ViewHolder) view.getTag();
        }
        // 给textview设置显示的内容
        Map<String, Object> map = list.get(position); // 获得list中的map
        String name = (String) map.get("name"); // map中根据key=name获取对应的值
        holder.textview1.setText(name);
        int age = (Integer) map.get("age"); // map中根据key=age获得对应的值
        holder.textview2.setText(age+"");
        Log.i("ListView", "getView: " + position
                + ", View is " + view
                + ", convertView is " + convertView);
        return view;
    }

    // viewHolder是MyAdapter的内部类
    // 负责把textview1和textview2进行简单的打包
    class ViewHolder {
        public TextView textview1;
        public TextView textview2;
    }
}

BaseAdapter自定义适配器的更多相关文章

  1. BaseAdapter自定义适配器——思路详解

    BaseAdapter自定义适配器——思路详解 引言: Adapter用来把数据绑定到扩展了AdapterView类的视图组.系统自带了几个原生的Adapter. 由于原生的Adapter视图功能太少 ...

  2. Android中GridView通过自定义适配器(未优化)实现图文视图排列

    Android中GridView组件用来以网格方式排列视图,与矩阵类似,当屏幕上有很多元素(文字.图片或其他元素)需要显示时,可以使用该组件.下面我们通过代码实现如下图例(为了方便截图,将事件处理(土 ...

  3. 细解ListView之自定义适配器

    下面我们将以一个例子来讲述ListView之自定义适配器 首先我们看一下效果图: [分析] 首先:需要创建一个ListView控件,自定义适配器是为了实现自定义ListView的ListView_It ...

  4. Android -- ListView(SimpleAdapter) 自定义适配器

    aaarticlea/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA ...

  5. (转)Android之自定义适配器

    ListView作为一个实际开发中使用率非常高的视图,一般的系统自带的适配器都无法满足开发中的需求,这时候就需要开发人员来自定义适配器使得ListView能够有一个不错的显示效果. 有这样一个Demo ...

  6. Android:自定义适配器

    无论是ArrayAdapter还是SimpleAdapter都继承了BaseAdapter,自定义适配器同样继承BaseAdapter 实例:Gallery实现图片浏览器 <?xml versi ...

  7. 最简单的自定义适配器adapter

    下面是一个非常简单的自定义适配器的总体源码,从这个源码入门,就可以慢慢学会适配器了 适配器的作用: 完成数据和界面控件的绑定,把数据绑定到界面的现实控件条目上(对于listView,应该是listVi ...

  8. 安卓开发_浅谈ListView(自定义适配器)

    ListView作为一个实际开发中使用率非常高的视图,一般的系统自带的适配器都无法满足开发中的需求,这时候就需要开发人员来自定义适配器使得ListView能够有一个不错的显示效果 有这样一个Demo ...

  9. ListView的自定义适配器及其优化(listView序号混乱问题的处理)

    ListView是最常使用的android组件之一,关于listView的优化问题刚刚了解了一些,在这里做出总结. PS:如果想让ListView中的item根据数据内容显示item的大小,需要在it ...

随机推荐

  1. 新浪微博客户端(2)-自定义导航控制器,统一NavigationItem

      继承系统提供的UINavigationViewController,拦截并重写其push方法. #import "DJNavigationController.h" @impl ...

  2. C++ Primer Plus第6版18个重点笔记

    下面是我看<C++ Primer Plus>第6版这本书后所做的笔记,作为备忘录便于以后复习. 笔记部分 C++的const比C语言#define更好的原因? 首先,它能够明确指定类型,有 ...

  3. Mac OS X【快捷键组合】汇总

    以下是可能会出现在 OS X 菜单中的修饰键符号: ⌘—— () ⌃ ——Control ⌥—— (alt) ⇧——Shift ⇪——Caps Lock fn——功能键就是fn 启动快捷键 按下按键 ...

  4. codeforces 258div2 B Sort the Array

    题目链接:http://codeforces.com/contest/451/problem/B 解题报告:给出一个序列,要你判断这个序列能不能通过将其中某个子序列翻转使其成为升序的序列. 我的做法有 ...

  5. [Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符

    “1.0e0”=={valueOf:function(){return true;}} 是值是多少? 这两个完全不同的值使用==运算符是相等的.为什么呢?请看<[Effective JavaSc ...

  6. [Effective JavaScript 笔记]第29条:避免使用非标准的栈检查属性

    许多js环境都提供检查调用栈的功能.调用栈是指当前正在执行的活动函数链.在某些旧的宿主环境中,每个arguments对象含有两个额外的属性:arguments.callee和arguments.cal ...

  7. Stanford机器学习---第六讲. 怎样选择机器学习方法、系统

    原文:http://blog.csdn.net/abcjennifer/article/details/7797502 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归 ...

  8. 第3章 K近邻法

    参考: http://www.cnblogs.com/juefan/p/3807713.html http://blog.csdn.net/v_july_v/article/details/82036 ...

  9. nyoj 20

    http://acm.nyist.net/JudgeOnline/message.php?msg=已提交&url=status.php%3Fpid%3D20&second=0 #inc ...

  10. struts1老古董配置

    <!--Struts1 struts-config.xml Demo --><?xml version="1.0" encoding="UTF-8&qu ...