ListView深入学习(1)

ListView深入学习(1)

使用ViewHolder提高效率

listView的基础使用就不多介绍了,提一下BaseAdapter。

实现了BaseAdapter之后,listView的每个item会调用BaseAdapter里面的getView方法,这个方法会返回一个View,这个View就会被item使用。

所以重点已经很明显了,就是要优化getView方法。

首先拿出一段正常的getView方法

@Override
public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
convertView=LayoutInflater.from(mContext).
        inflate(R.layout.list_item, null);                                                          TextView tv=(TextView)convertView.findViewById(R.id.list_text);
tv.setText(mData.get(position));
return convertView;
}

里面核心的就是下面两句话

convertView=LayoutInflater.from(mContext).
        inflate(R.layout.list_item, null);                                                          TextView tv=(TextView)convertView.findViewById(R.id.list_text);

目标也就是这两句。

1、第一句,每次在调用getView的时候都要重新inflate那个xml文件,所以可以先判断一下是否为空,为空了再来inflate也不迟。

第一句就变成了下面这个样子:

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        if(convertView==null){
            convertView=LayoutInflater.from(mContext).inflate(R.layout.list_item, null);
        }else{
            TextView tv=(TextView)convertView.findViewById(R.id.list_text);
            tv.setText(mData.get(position));
        }
        return convertView;
    }

2、第二句,每次都要通过得打的view来new一个新的对象。通过viewHolder可以将它们重复使用。

viewHolder使用的关键是View.setTag()这个方法,将view的一些数据存储起来。

这里就是将这些数据存进viewHolder里面,所以要写一个内部类ViewHolder,里面有两个变量,一个ImageView,一个TextView。(对应的我自己的listView的item,也可以变成其他的)

public final class ViewHolder{
        public ImageView img;
        public TextView title;
    }

接下来就是viewHolder的具体存储和取出了,代码如下:

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        ViewHolder holder=null;
        if(convertView==null){
            holder=new ViewHolder();
            convertView=LayoutInflater.from(mContext).inflate(R.layout.list_item, null);
            holder.img=(ImageView)convertView.findViewById(R.id.list_img);
            holder.title=(TextView)convertView.findViewById(R.id.list_text);
            convertView.setTag(holder);
        }else{
            holder=(ViewHolder)convertView.getTag();
        }
        holder.title.setText(mData.get(position));
        return convertView;
    }

上面的代码就是及两处优化在一起的代码了。

效果图如下(其实和正常的看上去没什么差别)
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值