Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 基於“ViewHolder”技術提升Android ListView中Item View加載效率

基於“ViewHolder”技術提升Android ListView中Item View加載效率

編輯:關於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 {

	@Override
	protected 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;
		private	ViewHolder 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;
		}

		@Override
		public int getCount() {
			//巨大的數據
			return 10000;
		}

		@Override
		public 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); 
			}
			else
				holder=(ViewHolder) convertView.getTag();

			holder.text1.setText("text1:"+position);
			holder.text2.setText("text2:"+position);
			
			return convertView;
		}
	}
}

 


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved