安卓基础:ListView的简单使用和优化

ListView
就是用来显示一行一行的条目的
每一个条目都是一个View对象

BaseAdapter  最常用的
ListView lv = (ListView) findViewById(R.id. lv );
        lv.setAdapter( new BaseAdapter() {
               @Override
               public View getView( int position, View convertView, ViewGroup parent) {
                   View v = null;
// ListView代码的优化(非常重要)  因为上面的代码会重复的创建textView对象,很有可能会照成内存溢出
                    if(convertView!=null){
                         v =View.inflate(MainActivity.this, R.layout.list_items, null);v =View.inflate(MainActivity.this, R.layout.list_items, null);
                   }else{
                        v= convertView;
                   }
                   Person p = list .get(position);
                   TextView tv_name = (TextView) v.findViewById(R.id. name );
                   tv_name.setText(p.getName());
                    return v;
              }
                @Override
               public int getCount() {
                    // TODO Auto-generated method stub
                    return list.size();
              }
//下面的这两个方法暂时不要管
               @Override
               public long getItemId( int position) {
                    // TODO Auto-generated method stub
                    return 0;
              }       
               @Override
               public Object getItem( int position) {
                    // TODO Auto-generated method stub
                    return null ;
              }   
             
          });
    }


进一步优化
1.创建一个ViewHolder内部类
2.把list_items中的所有控件都保存在 ViewHolder中
3.给view设置Tag  
4.取出view中的Tag
public View getView( int position, View convertView, ViewGroup parent) {
                News news = newsList .get(position);
                View v = null ;
                ViewHolder mHolder;
                 if (convertView == null ){
                     v = View.inflate(MainActivity. this , R.layout. item_listview , null );
                     mHolder = new ViewHolder();
                      //把布局文件中所有组件的对象封装至ViewHolder对象中
                     mHolder. tv_title = (TextView) v.findViewById(R.id.tv_title);
                     mHolder.tv_detail = (TextView) v.findViewById(R.id.tv_detail);
                     mHolder.tv_comment = (TextView) v.findViewById(R.id.tv_comment);
                     mHolder.siv = (SmartImageView) v.findViewById(R.id.iv);
                      //把ViewHolder对象封装至View对象中
                     v.setTag(mHolder);
                }
                 else {
                     v = convertView;
                     mHolder = (ViewHolder) v.getTag();
                }
                 //给三个文本框设置内容
                mHolder.tv_title.setText(news.getTitle());
                
                mHolder.tv_detail.setText(news.getDetail());
                
                mHolder.tv_comment.setText(news.getComment() + "条评论");
                
                 //给新闻图片imageview设置内容
                mHolder. siv .setImageUrl(news.getImageUrl());
                 return v;
           }
           
            class ViewHolder{
                //条目的布局文件中有什么组件,这里就定义什么属性
                TextView tv_title;
                TextView tv_detail;
                TextView tv_comment;
                SmartImageView siv;
           }
           
当我们需要写一些复杂条目的listView时,上面的就不够用了。我们需要
1.先在布局文件中写一个list_item布局,作为listview的子布局
2.利用下面三种方式都可以获得一个布局填充器对象,然后填充我们写的子布局文件


ArrayAdapter    只能对一种数据进行操作,比如只是对“名字”进行操作
 
String[] objects = { "aa", "bb", "cc" };
          ListView lv = (ListView) findViewById(R.id.lv);
          lv.setAdapter(new ArrayAdapter<String>(this,
                   android.R.layout.simple_list_item_1, objects));

SimpleAdapter   可以对两种数据进行操作

ListView lv = (ListView) findViewById(R.id.lv);
          List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
          Map<String, Object> map1 = new HashMap<String, Object>();
          map1.put("photo", R.drawable.ic_launcher);
          map1.put("name", "老王1");
          data.add(map1);

          Map<String, Object> map2 = new HashMap<String, Object>();
          map2.put("photo", R.drawable.ic_launcher);
          map2.put("name", "老王2");
          data.add(map2);

          Map<String, Object> map3 = new HashMap<String, Object>();
          map3.put("photo", R.drawable.ic_launcher);
          map3.put("name", "老王3");
          data.add(map3);
          /**
           * 参数1:context没什么好说的       参数2:数据(这里我们就是自定义的一个map数组)
           * 参数3:自定义的一个listview的子条目布局文件       参数4:数据中KEY的值的集合 参数5:子条目布局文件中的id
           */
          lv.setAdapter(new SimpleAdapter(this, data, R.layout.simple_items,
                   new String[] { "photo", "name" }, new int[] { R.id.iv_photo,
                             R.id.tv_name }));

---进一步的优化用一个MyHolder内部类保存控件的信息,具体参见第一行代码部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值