一般我们在写自定义adapter时,一般会继承BaseAdapter,其中会重写一个方法就是getView,让我们先看一下这个重写的方法刚出来的时候的参数。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
return null;
}
可以看到需要传3个参数,第一个用的最多,是指数据显示在界面上的第几个,从0开始。至于第二个参数convertView,它相当于一个容器,当刚开始加载时,convertView是为null的,然后当屏幕下滑第一个item离开界面时,convertView变成非null,这个时候再请求下面的数据。至于第三个参数用的比较少,笔者目前还未使用过。
说了convertView的原理后,回到我们的主题优化,在加载很多数据的时候最耗时的有点个,一个是view的创建,第二个是findviewbyid方法,所以我们需要通过判断convertView是否为空,来创建view,至于第二个方法我们可以用tag来得到对象。
下面是代码:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.grid_item, null);
holder = new ViewHolder();
holder.titleName = (TextView) convertView
.findViewById(R.id.gridview_text);
holder.image = (ImageView) convertView
.findViewById(R.id.gridview_img);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
// 设置内容
holder.titleName.setText(mTitleArr[position]);
holder.image.setBackgroundResource(mImgIdArr[position]);
return convertView;
}
/**
* 内部类viewholder
*/
private class ViewHolder {
TextView titleName = null;
ImageView image = null;
}
代码中的gridview_text是文字,gridview_img是图片,一张图和一段字组成一个gridview的一个item。