View.getTagで、ビューにセットしておいたタグを取得する。
今回は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