Activity起動のListView のコードをパターン化

ListView を表示して、タップしたら行毎のActivityを開始するというケースは、
サンプルや、デバッグ用コードを書いていると、結構、何回も同じようなことを書いている。

時間がもったいないので、以下のような List Adapter を用意すると時間が節約できる。

import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
/**
 * ActivityListAdapter
 */

public final class ActivityListAdapter extends BaseAdapter{
   Context context;
   LayoutInflater layoutInflater;
   int rowId;
   int titleId;
   private List<Element> list;

   /**
    * @param context Context
    * @param rowId 1行分のレイアウトID
    * @param titleId 1行表示(タイトル)のID
    * @param builder ActivityListAdapter.Builder リスト生成
    */

   public ActivityListAdapter(Context context,int rowId,int titleId,ActivityListAdapter.Builder builder){
      this.context = context;
      this.rowId = rowId;
      this.titleId = titleId;
      this.list = builder.mylist;
      layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
   }

   public static class Builder{
      List<Element> mylist;
      public Builder(){
         mylist = new ArrayList<ActivityListAdapter.Element>();
      }
      public Builder add(String desc,Class<? extends Activity> cls){
         mylist.add(new Element(desc,cls));
         return this;
      }
   }

   static class Element{
      String desc;
      Class<? extends Activity> cls;
      Element(String desc,Class<? extends Activity> cls){
         this.desc = desc;
         this.cls = cls;
      }
   }


   /* @see android.widget.Adapter#getView(int, android.view.View, android.view.ViewGroup) */
   @Override
   public View getView(int position,View convertView,ViewGroup parent){
      View view = convertView==null ? layoutInflater.inflate(rowId,null) : convertView;

      final Element item = list.get(position);
      if (item != null){
         *1.setText(item.desc);
         view.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
               context.startActivity(new Intent(context,item.cls));
            }
         });
      }
      return view;
   }


   /* @see android.widget.Adapter#getItem(int) */
   @Override
   public Object getItem(int position){
      return list.get(position);
   }

   /* @see android.widget.Adapter#getItemId(int) */
   @Override
   public long getItemId(int position){
      return position;
   }

   /* @see android.widget.Adapter#getCount() */
   @Override
   public int getCount(){
      return list.size();
   }
}
これを使うのは、簡単で、、、

ActivityListAdapter.Builder 生成して、リストの順にタイトルと Activityクラスを追加していく。

この ActivityListAdapter.Builder を、ActivityListAdapterのコンストラクタで指定して、

ListView の Adapter としてセットするだけ。

ActivityListAdapter.Builder builder = new ActivityListAdapter.Builder();
builder.add("Aの起動",Aactivity.class);
builder.add("Bの起動",Bactivity.class);
builder.add("Cの起動",Cactivity.class);

ListView listView = (ListView)findViewById(R.id.listView);
listView.setAdapter(new ActivityListAdapter(this,android.R.layout.simple_list_item_1,android.R.id.text1,builder));

*1:TextView)view.findViewById(titleId