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

本文介绍了ListView组件在Android开发中的应用,重点讲解了ArrayAdapter、SimpleAdapter和BaseAdapter的使用。ArrayAdapter适用于简单数据绑定,SimpleAdapter支持自定义布局,而BaseAdapter则提供更高的灵活性,尤其在处理复杂列表项时。同时,文章提到了ListView性能优化,如convertView的重用,包括直接缓存和结合ViewHolder的方式,以提升UI响应速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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<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

使用步骤

  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;
            }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值