ListView三种适配器介绍ArrayListAdapter,SimpleAdapter,BaseAdapter

ListView 组件

作用:使用ListView组件 绘制出漂亮的列表

Adapter适配器

  • 只有通过Adapter才可以把列表中的数据映射到ListView中
  • 在android的开发中最Adapter 一共可以分为
    ArrayAdapter<T>,BaseAdapter,CursorAdapter,HeaderViewListAdapter,
    ResourceCursorAdapter,SimpleAdapter,SimpleCursorAdapter,WrapperListAdapter
  • 软件开发中最常用的有ArrayAdapter<T>, BaseAdapter, SimpleAdapter

使用ArrayAdapter<T>

用ArrayAdapter可以实现简单的ListView的数据绑定。默认情况下,ArrayAdapter绑定每个对象的toString值到layout中预先定义的TextView控件上。

使用步骤

  1. 定义一个数组来存放ListView中item的内容。
  2. 通过实现ArrayAdapter的构造函数来创建一个ArrayAdapter的对象。
  3. 通过ListView的setAdapter()方法绑定ArrayAdapter。
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView lv=(ListView) findViewById(R.id.lv);
        //简单设置测试字符数组
        String []data ={"hi","nihao","yes","no"};
        ArrayAdapter<String> array=new ArrayAdapter<>(this,
                android.R.layout.simple_list_item_1,data);
        lv.setAdapter(array);
    }
}

注:android.R.layout.simple_list_item_1是系统定义好的布局文件,它只显示一行文字

Paste_Image.png

使用SimpleAdapter

SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
参数context:上下文,比如this。关联SimpleAdapter运行的视图上下文
参数data:Map列表,列表要显示的数据,这部分需要自己实现,如例子中的getData(),类型要与上面的一致,每条项目要与from中指定条目一致
参数resource:ListView单项布局文件的Id,这个布局就是你自定义的布局了,你想显示什么样子的布局都在这个布局中。这个布局中必须包括了to中定义的控件id
参数 from:一个被添加到Map上关联每一个项目列名称的列表,数组里面是列名称
参数 to:是一个int数组,数组里面的id是自定义布局中各个控件的id,需要与上面的from对应

使用步骤

  1. 根据需要定义ListView每行所实现的布局。
  2. 定义一个HashMap构成的列表,将数据以键值对的方式存放在里面。
  3. 构造SimpleAdapter对象。
  4. 将LsitView绑定到SimpleAdapter上。
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView lv=(ListView) findViewById(R.id.lv);
 
        SimpleAdapter simple=new SimpleAdapter(this, getData(),
                R.layout.list_view_item, new String[]{"key1","key2"}, new int[]{R.id.textView1,R.id.textView2});
        lv.setAdapter(simple);
    }
 
    private ArrayList<Map<String, Object>> getData(){
        ArrayList<Map<String, Object>> list=new ArrayList<Map<String, Object>>();
        Map<String,Object> hashmap=new HashMap<String, Object>();
        for(int i=0;i<5;i++){
            hashmap.put("key1", "data1");
            hashmap.put("key2", "data2");
            list.add(hashmap);
        }
        return list;
    }
子项的布局文件
效果

使用BaseAdapter

当SimpleAdapter添加一个按钮到ListView的条目中,会发现可以添加,但是却无法获得焦点,点击操作被ListView的Item所覆盖。
这时候最方便的方法就是使用灵活的适配器BaseAdapter了。

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView lv=(ListView) findViewById(R.id.lv);
 
        lv.setAdapter(new BaseAdapter() {
      //每个item要显示在lv上的时候,会被调用的方法,安卓系统调用
      //     position    当前的item处于第几个位置
      //     convertView  用于做优化
      //     parent    当前的父控件
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                View view=View.inflate(MainActivity.this, R.layout.list_view_item, null);
                TextView tv1=(TextView) view.findViewById(R.id.textView1);
                tv1.setText("我是第:"+position+"个");
                return view;
            }

            //这个方法是最开始被调用的,用来计算到底有多少个item需要显示在lv上
            @Override
            public int getCount() {
                // TODO Auto-generated method stub
                return 20;
            }
        });
    }
}

Paste_Image.png

优化方法 convertView 重用对象

1.通过缓存convertView实现

  • 这种利用缓存contentView的方式可以判断如果缓存中不存在View才创建View,如果已经存在可以利用缓存中的View,提升了性能
public View getView(int position, View convertView, ViewGroup parent) {
                if (convertView == null) {
                    View view = View.inflate(MainActivity.this, R.layout.list_view_item, null);
                    TextView tv1 = (TextView) view.findViewById(R.id.textView1);
                    tv1.setText("我是最屌的");
                    return view;
                }
                return convertView;
            }

2.通过convertView+ViewHolder来实现

  • ViewHolder就是一个静态类,使用 ViewHolder 的关键好处是缓存了显示数据的视图(View),加快了 UI 的响应速度。
  • 代码中,当convertView为空时,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象。当convertView不为空,重复利用已经创建的view的时候,使用getTag()方法获取绑定的ViewHolder对象,这样就避免了findViewById对控件的层层查询,而是快速定位到控件。
//静态ViewHolder类
public static class ViewHolder {
        public TextView title;
        public TextView info;
    }


protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView lv = (ListView) findViewById(R.id.lv);
 
        lv.setAdapter(new BaseAdapter() {
 
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                ViewHolder holder;
                if (convertView == null) {
                    holder = new ViewHolder();
                    View view = View.inflate(MainActivity.this, R.layout.list_view_item, null);
                    holder.title=(TextView) view.findViewById(R.id.textView1);
//                    TextView tv1 = (TextView) view.findViewById(R.id.textView1);
                    holder.title.setText("我是最屌的");
                    view.setTag(holder);
                    return view;
                }else{
                     holder = (ViewHolder) convertView.getTag(); 
 
                }
                holder.title.setText("我是最屌的");
                return convertView;
            }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容