ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文

  メンテナンス 前画面に戻る

対象スレッド 件名: カスタム・リストビュー・ダイアログ(フラグメント) : ダイアログ内の ListView を ArrayAdapter でカスタムする
名前: lightbox
処理選択
パスワード

件名 カスタム・リストビュー・ダイアログ(フラグメント) : ダイアログ内の ListView を ArrayAdapter でカスタムする
名前 lightbox
コメント
[[MainActivity.java]]
@DIV
package lightbox.june.listviewdialogcustomfragment;

import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

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

		// *********************************
		// ボタンをクリック
		// ( ダイアログフラグメント で表示 )
		// *********************************
		MainActivity.this.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {

				 MyDialogFragment my_dialog_fragment = MyDialogFragment.newInstance("地域一覧");

				// ダイアログの表示
				// ※ この環境では、getSupportFragmentManager が必要です
				my_dialog_fragment.show(getSupportFragmentManager(),"dialog");

			}
		});

	}

	// *********************************
	// static クラスの定義
	// 1) DialogFragment
	// 2) ArrayAdapter
	// 3) MyData
	// *********************************
	public static class MyDialogFragment extends DialogFragment {

		// ユーザが呼び出す為のもの( 外側で処理しても良い )
		public static MyDialogFragment newInstance(String title) {
			// インスタンス作成
			MyDialogFragment my_dialog_fragment = new MyDialogFragment();
			// システムに引数を保存
			Bundle args = new Bundle();
			args.putString("title", title);
			my_dialog_fragment.setArguments(args);
			return my_dialog_fragment;
		}

		// *********************************
		// ここが、ダイアログの作成時に呼ばれます
		// 初回はユーザがダイアログを作成
		// デバイスを横にした時はシステムが
		// ダイアログを作成します
		// *********************************
		@Override
		public Dialog onCreateDialog(Bundle savedInstanceState) {

			// この中で使用するダイアログ作成用
			final AlertDialog.Builder ad_builder_in_fragment;

			// この DialogFragment に保存されているデータを取得
			// ( システムが再作成した場合でも Bundle よりデータを取得できます )
			String title = MyDialogFragment.this.getArguments().getString("title");

			// DialogFragment から Activity を取得して使う
			// ( ダイアログが使われる Activity を MyDialogFragment 内で取得しています )
			ad_builder_in_fragment = new AlertDialog.Builder(MyDialogFragment.this.getActivity());
			// タイトル設定
			ad_builder_in_fragment.setTitle(title);
			ad_builder_in_fragment.setNegativeButton("キャンセル", new DialogInterface.OnClickListener() {
				@Override
				public void onClick(DialogInterface dialog, int which) {
					// キャンセル
				}
			});
			// *********************************
			// ダイアログのメインビューに
			// リストビューを設定
			// *********************************
			LayoutInflater inflater = (LayoutInflater) MyDialogFragment.this.getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
			ListView 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) {

					// View から行データを取得
					TextView tv;
					tv = (TextView) view.findViewById(R.id.textPlace);
					String textPlace = tv.getText().toString();
					tv = (TextView) view.findViewById(R.id.textCode);
					String textCode = tv.getText().toString();

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

					// 破棄
					MyDialogFragment.this.dismiss();
				}
			});
			// *********************************
			// カスタム・アダプター
			// *********************************
			MyAdapter adapter = new MyAdapter(MyDialogFragment.this.getActivity(),R.layout.listview_item);

			// *********************************
			// 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"));

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

			// *********************************
			// カスタム・アダプターにデータをセット
			// *********************************
			adapter.addAll(my_data);
			// *********************************
			// ListView にカスタム・アダプターをセット
			// *********************************
			list_view.setAdapter(adapter);

			ad_builder_in_fragment.setView(list_view);

			// ダイアログを作成してシステムに返す
			return ad_builder_in_fragment.create();
		}
	}

	// *********************************
	// MyData 専用アダブター
	// *********************************
	public static 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) getContext().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
	// *********************************
	public static 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;
		}
	}
}
@END