標籤:android
對於提升Android中頻繁使用的ListView子Item View的載入效率,基於兩點基本考慮:
1,Android的View的建立比較消耗資源;
2,findViewById()也不是最快的。
所以在實際開發中經常使用的適配器中的getView()方法:
public View getView(int position, View convertView, ViewGroup parent);
如果每次都在裡面建立一個新View出來,將導致效率低下,比較高效率的做法是每次判斷convertView是否為空白,若不為空白,則直接使用convertView的findViewById()把子View重建出來即可。
但是,這種做法雖然提升了效率,但仍不是最高效的做法,因為還是使用了findViewById()。
因此,進一步的效率提升改進之處是:使用一種稱為“ViewHolder”的技術,緩衝convertView中的View組件,使用convertView的setTag()和getTag(),每次當ListView需要建立Item的View時候,調用convertView的getTag()找出ViewHolder,重新複用。具體的使用方法如代碼所示:
package zhangphil.listview;import android.app.ListActivity;import android.content.Context;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.TextView;public class MainActivity extends ListActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ListView lv = this.getListView();setContentView(lv);ArrayAdapter adapter = new MyAdapter(this,android.R.layout.simple_list_item_2);lv.setAdapter(adapter);}private class MyAdapter extends ArrayAdapter {private int resId;private LayoutInflater mInflater;privateViewHolder holder = null; public MyAdapter(Context context, int resource) {super(context, resource);this.resId = resource;mInflater = LayoutInflater.from(context);}//子View的“容器”public final class ViewHolder {public TextView text1;public TextView text2;}@Overridepublic int getCount() {//巨大的資料return 10000;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {convertView = mInflater.inflate(resId, null);holder = new ViewHolder(); holder.text1=(TextView) convertView.findViewById(android.R.id.text1);holder.text2=(TextView) convertView.findViewById(android.R.id.text2);convertView.setTag(holder); }elseholder=(ViewHolder) convertView.getTag();holder.text1.setText("text1:"+position);holder.text2.setText("text2:"+position);return convertView;}}}
基於“ViewHolder”技術提升Android ListView中Item View載入效率