在实际开发过程中,为了定制ListView项内容,通常所使用的方式是,创建所需要Adapter的子类,并重写getView()方法。
getView()方法接受一个名为convertView,View类型的参数。
如果convertView为null,就需要创建一个新的View对象;如果convertView非null,它实际上是之前使用过的View对象。
事实上,Android试图循环使用那些scroll到列表边界外的View。
另一个消耗CPU的方法是findViewById()。
所有继承自View的子类都有getTab()方法和setTab()方法,这样我们就可以通过设置“tab”关联任何对象到该View。
使用Holder模式,仅需调用一次findViewById()方法,让“tag”持有该View的子Widget,在每次使用该View时,就可以直接访问这些子Widget,而无需重复调用了。
示例代码:
创建一个ListActivity显示ListView
package lizhen.listview;
import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
public class Main extends ListActivity {
private String[] data = {"A", "N", "D", "R", "O", "I", "D", "G", "O", "O", "G", "L", "E"};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setListAdapter(new MyAdapter(this, data));
}
private class MyAdapter extends BaseAdapter {
private final Context context;
private final String[] data;
public MyAdapter(Context context, String[] data) {
this.context = context;
this.data = data;
}
@Override
public int getCount() {
return data.length;
}
@Override
public Object getItem(int position) {
return data[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Holder holder = null;
if(convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.item, parent, false);
holder = new Holder(convertView);
convertView.setTag(holder);
} else {
holder = (Holder) convertView.getTag();
}
holder.getIcon().setImageResource(R.drawable.icon);
holder.getLabel().setText(data[position]);
return convertView;
}
}
}
创建自定义类Holder,用于持有列表项的子Widget
package lizhen.listview;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
public class Holder {
private View parentView;
private ImageView iconImageView;
private TextView labelTextView;
public Holder(View view) {
this.parentView = view;
}
public ImageView getIcon() {
if(iconImageView == null) {
iconImageView = (ImageView) parentView.findViewById(R.id.icon);
}
return iconImageView;
}
public TextView getLabel() {
if(labelTextView == null) {
labelTextView = (TextView) parentView.findViewById(R.id.label);
}
return labelTextView;
}
}
运行结果: