Android-ListViewの多重化最適化

3748 ワード

私达のふだんの使用の过程の中で、みんながListViewというコントロールを使ったことがあると信じて、例えばqq友达のリスト、电话帳の通信录など.ただし、カスタムListViewをより多く使用しています.ここでは、ListViewコントロールをカスタマイズして開発ニーズを満たす方法について説明します(listviewリストに画像と文字情報を同時に表示させる).
まず、いくつかの果物(文字に対応してプレゼンテーション)に対応する画像をいくつか用意する必要があります.
画像と文字を表示させたいので、ListViewの適合タイプとして、新しいクラスFruitを定義します.コードは以下の通りです.
public class Fruit {
	   private String name;
	   private int imageID;
       public Fruit(String name,int imageId) {
		this.name=name;
		this.imageID=imageId;
	}
	public String getName() {
		return name;
	}
	public int getImageID() {
		return imageID;
	}
       
}
Fruitクラスには2つの属性しかありません.1つはnameが表示する文字を表し、もう1つはimageIDが対応するピクチャリソースを表します.その後、ListViewのサブアイテムにカスタムレイアウトを書き、layoutディレクトリの下で新規作成する必要があります.
fruit_item.xml、コードは以下の通りです.


    
    
    



このレイアウトファイルでは、画像を表示するためにImageViewを定義し、文字を表示するためにTextViewを定義します.次に、ArrayAdapterを継承し、汎用型をFruitクラスとして指定し、新しいクラスFruit Adapterを作成します.listViewの稼働効率を向上させるために、カスタム内部クラスViewHolderを直接使用してコードを完了します.コードは次のとおりです.
public class FruitAdapter extends ArrayAdapter{
    private int resourceId;
	public FruitAdapter(Context context, int resource, List objects) {
		super(context, resource, objects);
		resource=resourceId;
	}
	public View getView(int position,View convertView,ViewGroup parent){
		Fruit fruit=getItem(position);//      Fruit  
		View view;
		ViewHolder viewHolder;
		if(convertView==null){
			view=LayoutInflater.from(getContext()).inflate(resourceId, null);
			viewHolder=new ViewHolder();
			viewHolder.fruitImage=(ImageView) view.findViewById(R.id.fruit_imae);
			viewHolder.fruitName=(TextView) view.findViewById(R.id.fruit_name);
			view.setTag(viewHolder);
		}else{
			view=convertView;
			viewHolder=(ViewHolder) view.getTag();
		}
		
		viewHolder.fruitImage.setImageResource(fruit.getImageID());
		viewHolder.fruitName.setText(fruit.getName());
		return view;
		
	}
	//      
     class ViewHolder{
    	 ImageView fruitImage;
    	 TextView fruitName;
     }
}

FruitAdapterは、コンテキスト、ListViewサブアイテムレイアウトのidおよびデータを転送するための親クラスの構造関数のセットを書き換え、getViewメソッドを書き換え、各サブアイテムが画面内にスクロールされたときに呼び出される.getViewメソッドでは、まずgetItem()メソッドで現在のアイテムのFruitのインスタンスを取得し、LayoutInflaterを使用してこのサブアイテムに入力したレイアウトをロードし、次にViewのfindView ById()メソッドを呼び出してImageViewとTextViewのインスタンスを取得し、setImageResource()メソッドとsetText()メソッドをそれぞれ呼び出して表示状況を設定し、最後にレイアウトviewを返してカスタムアダプタを完了します.次のように、MainActivityのコードを補完します.
public class MainActivity extends Activity {
    private List fruitList=new ArrayList();
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		FruitAdapter adapter=new FruitAdapter(MainActivity.this, R.layout.fruit_item, fruitList);
		ListView listView=(ListView)findViewById(R.id.list_view);
		listView.setAdapter(adapter);
	}
}

ここでconvertViewパラメータについて説明すると、後で再利用できるように、以前にロードされたレイアウトをキャッシュできます.
新しい内部クラスViewHolderは、コントロールのインスタンスをキャッシュするために使用されます.convertViewが空の場合、ViewHolderオブジェクトを作成し、コントロールインスタンスをViewHolderに保存します.次にsetTag()メソッドを呼び出し、オブジェクトをViewに格納します.convertViewが空でない場合は、ViewのgetTag()メソッドを呼び出して再取り出し、ListViewの実行効率を最適化することができます.