读书人

【Android】高效率ListView

发布时间: 2012-08-07 14:54:48 作者: rapoo

【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;}}

?

?

运行结果:

【Android】高效率ListView

?

?

不错!

读书人网 >Android

热点推荐