View.getTag

View.getTagで、ビューにセットしておいたタグを取得する。

View  |  Android Developers

今回はListViewの中で使う。
list_item.xmlで、

LinearLayoutの中にTextViewというアイテム。
activity_main.xmlは、

ListView。
CustomAdapter.javaで、

package com.bgstation0.android.sample.view_;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

// カスタムアダプタ
public class CustomAdapter extends ArrayAdapter<String> {

	// メンバフィールドの定義.
	private final LayoutInflater mInflater;	// インフレータmInflater.
	
	// コンストラクタ.
	public CustomAdapter(Context context, int textViewResourceId, List<String> objects) {
		super(context, textViewResourceId, objects);
		// TODO Auto-generated constructor stub
		mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);	// mInflaterを生成.
	}

	// アイテム表示のカスタマイズ
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// convertViewがnullの時.
		if ( == null){
			convertView = mInflater.inflate(R.layout.list_item, null);	// convertViewがnullならinflater.inflateで取得.(ここは難しいのでひとまずこういうものだと捉えておく.)
		}
		TextView liTextView = (TextView)convertView.findViewById(R.id.list_item_textview);	// convertView.findViewByIdでR.id.list_item_textviewをliTextViewに格納.
		liTextView.setText(getItem(position));	// position番目のアイテムをliTextView.setTextでセット.
		return convertView;	// convertViewを返す.
	}
	
}

引数のconvertViewがnullの時は再生成が必要なので、mInflater.inflateの結果のViewをconvertViewに格納。
convertView.findViewByIdでliTextViewを探してそれに現在位置のテキストをセット。

アイテム1万個用意。

起動時
起動時

起動時。
動かしてみる。

どうだろうか。もっさりするかはわからない。
どうだろうか。もっさりするかはわからない。

どうだろうか。もっさりするかはわからない。
要はアイテムが多すぎると、convertView.findViewByIdは時間かかるので、パフォーマンスに影響が出るかもということ。

convertViewがnullなら、再生成が必要なので、mInflater.inflateとconvertView.findViewByIdしないといけない。
で、それが終わったら、convertView.setTagでliTextViewをタグとしてセットする。
nullでなければ、再生成不要だから、convertView.getTagでliTextViewを取得できるし、それにテキストをセットするだけでいい。
convertViewがいれば、liTextViewもいるわけだから、liTextViewの参照を取得出来れば、わざわざfindViewByIdする必要もない。

どうだろうか
どうだろうか

どうだろうか。
動かしてみる。

わからない
わからない

わからない。
でもアイテムがもっと大量にあった場合のパフォーマンスには影響しそう。

Sample/android/View/getTag/src/View at master · bg1bgst333/Sample · GitHub