SQLの窓

2016年06月26日


カスタム・リストビュー・ダイアログ : ダイアログ内の ListView を ArrayAdapter でカスタムする


※ この処理には、DialogFragment は使用していません。

AlertDialog 内で表示されるリストビューを外側で定義してカスタマイズするサンプルです。AlertDialog.Builder の setView で、自由にダイアログ内のメインコンテンツを差し替えれるので、ListView をそのままセットしてみました。

もちろん、ArrayAdapter を継承した独自クラスを作成して、お決まりのその中での getView の処理も実装します。問題は、表示される度に ListView をセットしなおす必要がある事をテストして知りましたが、ListView を setView でセットした後に再度 setView する場合、いったん ListView を ダイアログ内の View から削除する必要がありました。

通常、DialogFragment では無い使い方では、 AlertDialog.Builder で作成された AlertDialog は常にメモリに残っているのでそのような処理が必要なのだと思います。ボタンがクリックされる度に、AlertDialog を 毎回 1 から作成して、使うのであればそのような必要も無いのでしょうが、そうなると使用後に削除する必要が出て来るのでこのような実装になっています。

行のクリックは、ListView の OnItemClickListener で行う事になるので、AlertDialog の hide メソッドで閉じています。

また、行データの参照は、Adapter を直接参照できるので、Adapter の getItem 経由で行っています。

MainActivity 内のソースコード
private AlertDialog ad = null;
private AlertDialog.Builder ad_builder;
private MyData[] my_data;
private ListView list_view;
private MyAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);

	// *********************************
	// ListView に表示するデータ
	// *********************************
	List<MyData> list = new ArrayList<MyData>();
	list.add(new MyData("大阪","27"));
	list.add(new MyData("東京","13"));
	list.add(new MyData("岡山","33"));
	list.add(new MyData("北海道","1"));
	list.add(new MyData("沖縄","47"));
	list.add(new MyData("京都","26"));
	list.add(new MyData("滋賀","25"));

	// *********************************
	// 新しく領域確保して配列データを作成する
	// *********************************
	my_data = list.toArray( new MyData[0] );

	// *********************************
	// ノーマルダイアログ作成用インスタンス作成
	// *********************************
	ad_builder = new AlertDialog.Builder(MainActivity.this);
	// *********************************
	// タイトル設定
	// *********************************
	ad_builder.setTitle("地域一覧");
	// *********************************
	// キャンセルイベント
	// *********************************
	ad_builder.setNegativeButton("キャンセル", new DialogInterface.OnClickListener() {
		@Override
		public void onClick(DialogInterface dialog, int which) {
			// キャンセル
		}
	});
	// *********************************
	// ダイアログのメインビューに
	// リストビューを設定
	// *********************************
	LayoutInflater inflater = (LayoutInflater) MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	list_view = (ListView) inflater.inflate(R.layout.listview, null);
	// *********************************
	// 行をクリックした時のイベント
	// *********************************
	list_view.setOnItemClickListener(new AdapterView.OnItemClickListener() {
		@Override
		public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

			// Adapter 内の行データを取得
			MyData my_data = (MyData) adapter.getItem(position);

			// メッセージの作成
			String message = String.format("%s : %s", my_data.toString(), my_data.getValue());
			// logcat に表示
			Log.i("lightbox", message );
			// Toast で表示
			Toast.makeText(MainActivity.this,message,Toast.LENGTH_SHORT).show();
			// TextView に表示
			TextView tv;
			tv = (TextView) MainActivity.this.findViewById(R.id.textView);
			tv.setText(message);

			// 非表示
			ad.hide();
		}
	});
	// *********************************
	// カスタム・アダプター
	// *********************************
	adapter = new MyAdapter(MainActivity.this,R.layout.listview_item);
	// *********************************
	// カスタム・アダプターにデータをセット
	// *********************************
	adapter.addAll(my_data);
	// *********************************
	// ListView にカスタム・アダプターをセット
	// *********************************
	list_view.setAdapter(adapter);

	// *********************************
	// ボタンをクリック
	// *********************************
	MainActivity.this.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
		@Override
		public void onClick(View v) {

			// 初回はなにもしない
			if ( ad != null ) {
				// ダイアログ内の親 View から ListView を削除
				ViewGroup vg = (ViewGroup) list_view.getParent();
				vg.removeView(list_view);
			}
			// ダイアログに ListView をセット
			ad_builder.setView(list_view);
			// ダイアログの表示
			// ( AlertDialog は 非表示処理に使用 )
			ad = ad_builder.show();

		}
	});

}

// *********************************
// MyData 専用アダブター
// *********************************
private class MyAdapter extends ArrayAdapter {

	public MyAdapter(Context context, int resource) {
		super(context, resource);
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {

		View rowView = convertView;
		if (rowView == null) {
			// 現在の View の取得
			LayoutInflater inflater = (LayoutInflater) MainActivity.this.getSystemService
				(Context.LAYOUT_INFLATER_SERVICE);
			rowView = inflater.inflate(R.layout.listview_item, null);
		}

		MyData my_data = (MyData)this.getItem(position);

		TextView tv;
		// listview_item 内の textPlace にデータをセット
		tv = (TextView) rowView.findViewById(R.id.textPlace);
		tv.setText(my_data.toString());
		// listview_item 内の textCode にデータをセット
		tv = (TextView) rowView.findViewById(R.id.textCode);
		tv.setText(my_data.getValue());

		return rowView;
	}
}

// *********************************
// MyData
// *********************************
private class MyData {

	private String myString;
	private String myValue;

	public MyData(String myString,String myValue) {
		this.myString = myString;
		this.myValue = myValue;
	}

	// データ取得用
	String getValue() {
		return myValue;
	}

	@Override
	public String toString() {
		return myString;
	}
}


※ 全てのソースコードはこちらにあります



【Android Studio 2の最新記事】
posted by lightbox at 2016-06-26 01:15 | Android Studio 2 | このブログの読者になる | 更新情報をチェックする
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり