Adapter与ListView的合作

如果要在ListView中展示一系列的item列表(都是相同的布局), 除了在资源文件中添加之外, 还可以用Adapter, 将数据放到ListView上展示出来. 那么, 我们就来介绍一下, Adapter和ListView是如何一起工作的.

使用SimpelAdapter

可以控制一些复杂的布局.
通过观察它的参数列表我们可以发现, 它的参数是有要求的.
第一个参数是Context, 第二个是一个List. 但是这个List的泛型是要求的, 必须是一个Map或者是Map的子类, 而这个Map的键必须是String, 值的类型不限. 第三个是String数组(拿到数据, Map中的key), 第四个是int数组(放到某个控件上, 控件的id), 可以达到一一对应的关系.
new一个Adapter:

SimpleAdapter adapter = new SimpleAdapter(this, list, android.R.layout.simple_list_item_2,
                new String[]{"title", "body"},
                new int[]{android.R.id.text1, android.R.id.text2});

使用BaseAdapter

使用继承BaseAdapter的方式时至少有两个属性: 一个上下文(Context), 一个是数据源的对象. 另外还有一个是数据文件的id.

BaseAdapter中的getView方法

在ListView中, 如果它的item列表是相同的布局, 那么, 它的item是可以重复利用的(上面消失的item, 重新利用到下面新出现的item), 那么, 消失的那个item就会传入convertView, 减少加载布局的次数.这是对ListView的优化

  public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null){
            convertView = inflater.inflate(R.layout.item, parent, false);
            convertView.setTag(new ViewHolder(convertView));
        }
        ViewHolder holder = (ViewHolder) convertView.getTag();
        Entry entry = list.get(position);
        holder.text.setText(entry.getText());
        new ImageLoader(holder.image).execute(entry.getImgUrl());
        return convertView;
    }

finViewById 操作

这层级比较深的时候, 这也是一个耗时操作. 所以我们要尽量减少使用这种方法.
所以, 我们可以写一个方法, 来保存这些控件. 不用每次都去findViewById.

  public static class ViewHolder{
        private ImageView image;
        private TextView text;
        private ViewHolder(View itemView){
            text = (TextView) itemView.findViewById(R.id.item_text);
            image = (ImageView) itemView.findViewById(R.id.item_image);
        }
    }

在这里我们就可以得到所有要用的控件, 并且不用每次都去调用findViewById.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值