動的リスト形式の選択ダイアログ

リストを表示して選択させる形式のダイアログを表示するケースで、数種類の画面で動的に変化
したり、同じようなリストだが並びが違うなどのケースで、
ダイアログ生成を数か所で同じようなコードを書くのがとてもセンスないと思ったので、
抽象化やインターフェースの切り出しを行ってみた。


import android.content.Context;
/**
 * Selector.  リスト選択形式ダイアログ選択インターフェース
 */

public interface Selector{
   public void exec(Context context,Object...params);
}
---------------------------------------------------------------------

import android.content.DialogInterface.OnClickListener;
/**
 * SelectorItem. リスト選択形式ダイアログ インターフェース
 */

public interface SelectorItem{
   /**
    * @return 表示するタイトルを返す(不要なら null を返す)
    */

   public String title();

   /**
    * @return リスト選択で表示するアイコンの drawable ID を返す(不要なら null を返す)
    */

   public Integer icon();

   /**
    * @return リスト選択形式ダイアログ表示文字列リストを返す
    */

   public String displays();

   public OnClickListener createListner();
}

---------------------------------------------------------------------
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
/**
 * SelectorList. リスト選択形式ダイアログ表示抽象クラス
 */

public abstract class SelectorList implements SelectorItem{
   protected Context context;

   protected Object
 params;
   public abstract Selector asigneExecutor();

   public SelectorList(Context context,Object...params){
      this.context = context;
      this.params = params;
   }
   
   @Override
   public OnClickListener createListner(){
      return new OnClickListener(){

         @Override
         public void onClick(DialogInterface dialog,int which){
            asigneExecutor()[which].exec(context,params);
         }
      };
   }
}
----------------------------------------------------------------------

import android.app.AlertDialog;
import android.content.Context;
import android.view.View;
/**
 * SelectorUtil.
 */

public final class SelectorUtil{
   private SelectorUtil(){}

   /**
    * リスト選択形式ダイアログを表示する View.OnClickListener を生成
    */

   public static View.OnClickListener getOnClickListner(final Context context,final SelectorItem item){
      return new View.OnClickListener(){
         @Override
         public void onClick(View v){
            AlertDialog.Builder builder = new AlertDialog.Builder(context);
            String title = item.title();
            if (title != null){
               builder.setTitle(title);
               Integer id = item.icon();
               if (id != null) builder.setIcon(id.intValue());
            }
            builder.setItems(item.displays(),item.createListner());
            builder.create().show();
         }
      };
   }
}
----------------------------------------------------------------------

これらを使う例は、、

public class LoginSelector implements Selector{
   @Override
   public void exec(Context context,Object...params){
      // 選択された時の処理
   }
}
public class SetteingSelector implements Selector{
@Override
   public void exec(Context context,Object...params){
      // 選択された時の処理
   }
}
public class LoginSettingSelector extends SelectorList{
   public LoginSettingSelector(Context context){
      super(context);
   }
   // タイトル
   @Override
   public String title(){

      return "メニュー";
   }
   // アイコン無しにするので、null を返す。
   @Override
   public Integer icon(){

      return null;
   }
   // セレクト形式ダイアログ表示文字列配列
   @Override
   public String
 displays(){

      return new String{ "ログイン" , "設定" };
   }
   // セレクト形式ダイアログ選択インターフェース配列
   @Override
   public Selector
 asigneExecutor(){
      return new Selector[]{ new LoginSelector() , new SetteingSelector() };
   }

}

を用意して、Activity の中で、以下のようにボタンクリックなどで表示するための
android.view.View.OnClickListener を 上の SelectorUtil で生成する。

  View.OnClickListener listner = SelectorUtil.getOnClickListner(this,new LoginSettingSelector(this));