美文网首页Android知识
ListView三种适配器介绍ArrayListAdapter,

ListView三种适配器介绍ArrayListAdapter,

作者: hongjay | 来源:发表于2016-05-18 11:03 被阅读817次

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

    相关文章

      网友评论

        本文标题:ListView三种适配器介绍ArrayListAdapter,

        本文链接:https://www.haomeiwen.com/subject/oybirttx.html