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

ListView 组件

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

Adapter适配器

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

使用ArrayAdapter

用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 array=new ArrayAdapter<>(this,
                android.R.layout.simple_list_item_1,data);
        lv.setAdapter(array);
    }
}

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

ListView三种适配器介绍ArrayListAdapter,SimpleAdapter,BaseAdapter_第1张图片
Paste_Image.png

使用SimpleAdapter

SimpleAdapter(Context context, List> 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> getData(){
        ArrayList> list=new ArrayList>();
        Map hashmap=new HashMap();
        for(int i=0;i<5;i++){
            hashmap.put("key1", "data1");
            hashmap.put("key2", "data2");
            list.add(hashmap);
        }
        return list;
    }
ListView三种适配器介绍ArrayListAdapter,SimpleAdapter,BaseAdapter_第2张图片
子项的布局文件
ListView三种适配器介绍ArrayListAdapter,SimpleAdapter,BaseAdapter_第3张图片
效果

使用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;
            }
        });
    }
}

ListView三种适配器介绍ArrayListAdapter,SimpleAdapter,BaseAdapter_第4张图片
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;
            }

你可能感兴趣的:(ListView三种适配器介绍ArrayListAdapter,SimpleAdapter,BaseAdapter)