Android の単純な ListView のバリエーション

ArrayAdapter を android.R.layout.simple_list_item_1 で4パターン
SimpleAdapter の android.R.layout.simple_list_item_2 で1パターンです
package app.lightbox.winofsql.jp.listviewaction;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends Activity {

	private ArrayAdapter<String> strArrayAdapter = null;
	private ArrayAdapter<MyData> arrayMyData = null;
	private ListView listview = null;
	private String [] strData1 = null;
	private String [] strData1Url = null;
	private String [] strData2 = null;
	private SimpleAdapter itemsAdapter = 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;
		}
	}

	// https://developer.android.com/guide/components/intents-common.html#Browser
	private void callBrowser( String url ) {
		// ブラウザの呼び出し
		Uri uri = Uri.parse(url);
		Intent intent = new Intent(Intent.ACTION_VIEW, uri);
		if (intent.resolveActivity(getPackageManager()) != null) {
			startActivity(intent);
			return;
		}

		// 対応するアプリが無い
		Toast.makeText(
				MainActivity.this,
				"ブラウザを呼び出せません",
				Toast.LENGTH_LONG
		).show();
		return;

	}

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

		// ListView のインスタンスを取得
		listview = (ListView) MainActivity.this.findViewById(R.id.listView);
		// クリックした時のイベント作成
		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);

			}
		});

		// 単純な文字列配列用
		strArrayAdapter = new ArrayAdapter<String>(
			MainActivity.this,
			android.R.layout.simple_list_item_1,
			android.R.id.text1
		);
		// 専用クラス用
		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"
		};

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

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.menu_main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		int id = item.getItemId();

		// 文字列を一つ一つ add して ListView を作成します
		if (id == R.id.lv_action1) {
			// ArrayAdapter をクリア
			strArrayAdapter.clear();
			for( int i = 0; i < strData1.length; i++ ) {
				strArrayAdapter.add(strData1[i]);
			}
			listview.setAdapter(strArrayAdapter);
			return true;
		}

		// 配列をそのままセットして ListView を作成します
		if (id == R.id.lv_action2) {
			// ArrayAdapter をクリア
			strArrayAdapter.clear();
			// でき上がっている配列をそのままセット
			strArrayAdapter.addAll(strData2);
			listview.setAdapter(strArrayAdapter);
			return true;
		}

		// List をそのままセットして ListView を作成します
		if (id == R.id.lv_action3) {
			// ArrayAdapter をクリア
			strArrayAdapter.clear();
			// 配列から List を作成
			List<String> list = Arrays.asList(strData1);
			// List を指定する addAll
			strArrayAdapter.addAll(list);
			listview.setAdapter(strArrayAdapter);
			return true;
		}

		// 専用クラス用のアダプタで ListView を作成します
		if (id == R.id.lv_action4) {
			// ArrayAdapter をクリア
			arrayMyData.clear();
			// 配列から作成
			for( int i = 0; i < strData1.length; i++ ) {
				arrayMyData.add(new MyData(strData1[i],strData1Url[i]));
			}
			listview.setAdapter(arrayMyData);
			return true;
		}

		// SimpleAdapter で複数項目の表示
		if (id == R.id.lv_action5) {
			// 内部データを作成
			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);
			return true;
		}

		return super.onOptionsItemSelected(item);
	}
}



画面定義
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
		xmlns:tools="http://schemas.android.com/tools"
		android:layout_width="match_parent"
		android:layout_height="match_parent"
		android:paddingBottom="@dimen/activity_vertical_margin"
		android:paddingLeft="@dimen/activity_horizontal_margin"
		android:paddingRight="@dimen/activity_horizontal_margin"
		android:paddingTop="@dimen/activity_vertical_margin"
		tools:context=".MainActivity">

	<ListView
		android:id="@+id/listView"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:layout_alignParentStart="true"
		android:layout_alignParentTop="true"/>

</RelativeLayout>


メニュー
<menu xmlns:android="http://schemas.android.com/apk/res/android"
		xmlns:tools="http://schemas.android.com/tools"
		tools:context=".MainActivity">
	<item
		android:id="@+id/lv_action1"
		android:title="ArrayAdapter add"
		android:orderInCategory="100"
		android:showAsAction="never"/>
	<item
		android:id="@+id/lv_action2"
		android:title="ArrayAdapter addAll Array"
		android:orderInCategory="100"
		android:showAsAction="never"/>
	<item
		android:id="@+id/lv_action3"
		android:title="ArrayAdapter addAll List"
		android:orderInCategory="100"
		android:showAsAction="never"/>
	<item
		android:id="@+id/lv_action4"
		android:title="ArrayAdapter addAll MyData"
		android:orderInCategory="100"
		android:showAsAction="never"/>
	<item
		android:id="@+id/lv_action5"
		android:title="SimpleAdapter で複数項目"
		android:orderInCategory="100"
		android:showAsAction="never"/>

</menu>