【Android】高效ListView
在实际开发过程中,为了定制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; }@Overridepublic int getCount() {return data.length;}@Overridepublic Object getItem(int position) {return data[position];}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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;}}?
?
运行结果:

?
?
不错!