SQLの窓

2015年06月06日


Android の単純な ListView の ArrayAdapter による応用の効く 4バリエーション と複数項目に即対応できる SimpleAdapter による実装

  

リストビューの一行ぶんの View の定義としては、android.R.layout.simple_list_item_1android.R.layout.simple_list_item_2 を使用しています。たいていは android.R.layout.simple_list_item_1 でまかなえると思いますが、項目が二つの場合が必要な場合として、SimpleAdapter が最も簡潔に書けるのでそれを利用しています。

ArrayAdapter で、android.R.layout.simple_list_item_2 に対応するのには、ArrayAdapter を継承したユーザクラスが必要になりますが、ここでは使用していません。

全体のコードは こちら で参照して下さい

ArrayAdapter で文字列を一つづつ追加
	private ArrayAdapter<String> strArrayAdapter = null;
	private ListView listview = null;
	private String [] strData1 = null;

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

		listview = (ListView) MainActivity.this.findViewById(R.id.listView);

		// 単純な文字列配列用
		strArrayAdapter = new ArrayAdapter<String>(
			MainActivity.this,
			android.R.layout.simple_list_item_1,
			android.R.id.text1
		);

		// タイトルデータ(1)
		strData1 = new String[]{
			"Yahoo! ニュース","Yahoo! 雨雲ズームレーダー",
			"ねとらぼ","GIGAZINE","Twitter","OneDrive",
			"楽天市場","ウィキペディア","Yahoo!テレビ",
			"@IT","Stack Overflow","Android Developers"
		};

	}
			// ArrayAdapter をクリア
			strArrayAdapter.clear();
			for( int i = 0; i < strData1.length; i++ ) {
				strArrayAdapter.add(strData1[i]);
			}
			listview.setAdapter(strArrayAdapter);


ArrayAdapter で配列を一括で追加

前提となるパーツは一つ前と同じです。配列が固定で既に作成されている場合にすぐに投入できます。外部から JSON で読み込んで、結果的に配列が作成されているような場合に最適です。
			// ArrayAdapter をクリア
			strArrayAdapter.clear();
			// でき上がっている配列をそのままセット
			strArrayAdapter.addAll(strData1);
			listview.setAdapter(strArrayAdapter);


ArrayAdapter で List を一括で追加

既にできあがっているデータが配列ではなく、List インターフェイスを持つ場合に使用します

ここでは、テストなので配列から List を作成して使用しています
			// ArrayAdapter をクリア
			strArrayAdapter.clear();
			// 配列から List を作成
			List<String> list = Arrays.asList(strData1);
			// List を指定する addAll
			strArrayAdapter.addAll(list);
			listview.setAdapter(strArrayAdapter);



ArrayAdapter で 内部に別の情報を持つ

専用のクラスを作成して、それ用の ArrayAdapter で処理します。表示は 1つの内容しかできませんが、内部に別の情報を持つので、行をクリックした時にそれを使用する事ができます
	private ArrayAdapter<MyData> arrayMyData = null;
	private ListView listview = null;
	private String [] strData1 = null;
	private String [] strData1Url = null;

	// ListView にセットする配列用クラス
	class MyData {
		public String title = null;
		public String url = null;
		public MyData(String myTitle,String myUrl) {
			title = myTitle;
			url = myUrl;
		}
		// toString で呼び出された内容が ListView に表示されます
		@Override
		public String toString() {
			return title;
		}
	}

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

		// ListView のインスタンスを取得
		listview = (ListView) MainActivity.this.findViewById(R.id.listView);
		// 専用クラス用
		arrayMyData = new ArrayAdapter<MyData>(
				MainActivity.this,
				android.R.layout.simple_list_item_1,
				android.R.id.text1
		);

		// タイトルデータ(1)
		strData1 = new String[]{
			"Yahoo! ニュース","Yahoo! 雨雲ズームレーダー",
			"ねとらぼ","GIGAZINE","Twitter","OneDrive",
			"楽天市場","ウィキペディア","Yahoo!テレビ",
			"@IT","Stack Overflow","Android Developers"
		};
		// タイトルデータ(1) の URL データ
		strData1Url = new String[]{
			"http://news.yahoo.co.jp/",
			"http://weather.yahoo.co.jp/weather/zoomradar/",
			"http://nlab.itmedia.co.jp/",
			"http://gigazine.net/",
			"http://twitter.com/",
			"http://onedrive.live.com/",
			"http://www.rakuten.co.jp/",
			"https://ja.wikipedia.org",
			"http://tv.yahoo.co.jp/",
			"http://www.atmarkit.co.jp/",
			"http://stackoverflow.com/",
			"http://developer.android.com/index.html"
		};

	}
			// ArrayAdapter をクリア
			arrayMyData.clear();
			// 配列から作成
			for( int i = 0; i < strData1.length; i++ ) {
				arrayMyData.add(new MyData(strData1[i],strData1Url[i]));
			}
			listview.setAdapter(arrayMyData);


SimpleAdapter で二つの情報を表示

ArrayAdapter よりも汎用性がなくなります( メソッドでできる事がほとんどなくなってしまいます )が、手早く複数項目を持つ View への対応が簡単です。
	private ListView listview = null;
	private String [] strData1 = null;
	private String [] strData1Url = null;
	private SimpleAdapter itemsAdapter = null;

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

		// ListView のインスタンスを取得
		listview = (ListView) MainActivity.this.findViewById(R.id.listView);

		// タイトルデータ(1)
		strData1 = new String[]{
			"Yahoo! ニュース","Yahoo! 雨雲ズームレーダー",
			"ねとらぼ","GIGAZINE","Twitter","OneDrive",
			"楽天市場","ウィキペディア","Yahoo!テレビ",
			"@IT","Stack Overflow","Android Developers"
		};
		// タイトルデータ(1) の URL データ
		strData1Url = new String[]{
			"http://news.yahoo.co.jp/",
			"http://weather.yahoo.co.jp/weather/zoomradar/",
			"http://nlab.itmedia.co.jp/",
			"http://gigazine.net/",
			"http://twitter.com/",
			"http://onedrive.live.com/",
			"http://www.rakuten.co.jp/",
			"https://ja.wikipedia.org",
			"http://tv.yahoo.co.jp/",
			"http://www.atmarkit.co.jp/",
			"http://stackoverflow.com/",
			"http://developer.android.com/index.html"
		};

	}
			// 内部データを作成
			List list = new ArrayList<Map<String, ?>>();
			for( int i = 0; i < strData1.length; i++ ) {
				Map map = new HashMap();
				// 名前は文字列で適当に付けます( item1, item2 )
				map.put("item1", strData1[i]);
				map.put("item2", strData1Url[i]);
				list.add(map);
			}

			// 複数項目のビュー用のインスタンス
			itemsAdapter = new SimpleAdapter(
				// 1)
				MainActivity.this,
				// 2)
				list,
				// 3) 二つの項目を持つビュー
				android.R.layout.simple_list_item_2,
				// 4) ここで項目を一致させる
				new String[] { "item1", "item2" },
				// 5) 実際のビューの id と一致させる
				new int[] { android.R.id.text1, android.R.id.text2 }
			);
			listview.setAdapter(itemsAdapter);

クリックした時の処理

URL 情報を持つ二つのパターンでは、ブラウザを呼び出しています。
		// クリックした時のイベント作成
		listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
				// クリックされたビューの内部データ
				Object data = (Object)parent.getItemAtPosition(position);
				// クラス名を取得
				Log.i("lightbox","data type:" + data.getClass().getName());
				String myClass = "app.lightbox.winofsql.jp.listviewaction.MainActivity$MyData";
				String simple = "java.util.HashMap";
				// 専用クラスの場合
				if ( myClass.equals(data.getClass().getName()) ) {
					MyData myData = (MyData)data;
					Log.i("lightbox", "title:" + myData.title);
					Log.i("lightbox", "url:" + myData.url);

					// ブラウザの呼び出し
					callBrowser(myData.url);
					return;
				}

				if ( simple.equals(data.getClass().getName()) ) {
					Map map = (Map)data;
					Log.i("lightbox", "title:" + map.get("item1"));
					Log.i("lightbox", "url:" + map.get("item2"));

					// ブラウザの呼び出し
					callBrowser(map.get("item2").toString());
					return;
				}

				// 単純な文字列の場合
				String myData = (String)data;
				Log.i("lightbox", "text:" + (String)data);

			}
		});



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

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

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