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

ArrayAdapter を android.R.layout.simple_list_item_1 で4パターン
SimpleAdapter の android.R.layout.simple_list_item_2 で1パターンです

001.package app.lightbox.winofsql.jp.listviewaction;
002. 
003.import android.app.Activity;
004.import android.content.Intent;
005.import android.net.Uri;
006.import android.os.Bundle;
007.import android.util.Log;
008.import android.view.Menu;
009.import android.view.MenuItem;
010.import android.view.View;
011.import android.widget.AdapterView;
012.import android.widget.ArrayAdapter;
013.import android.widget.ListView;
014.import android.widget.SimpleAdapter;
015.import android.widget.Toast;
016. 
017.import java.util.ArrayList;
018.import java.util.Arrays;
019.import java.util.HashMap;
020.import java.util.List;
021.import java.util.Map;
022. 
023.public class MainActivity extends Activity {
024. 
025.        private ArrayAdapter<String> strArrayAdapter = null;
026.        private ArrayAdapter<MyData> arrayMyData = null;
027.        private ListView listview = null;
028.        private String [] strData1 = null;
029.        private String [] strData1Url = null;
030.        private String [] strData2 = null;
031.        private SimpleAdapter itemsAdapter = null;
032. 
033.        // ListView にセットする配列用クラス
034.        class MyData {
035.                public String title = null;
036.                public String url = null;
037.                public MyData(String myTitle,String myUrl) {
038.                        title = myTitle;
039.                        url = myUrl;
040.                }
041.                // toString で呼び出された内容が ListView に表示されます
042.                @Override
043.                public String toString() {
044.                        return title;
045.                }
046.        }
047. 
048.        // https://developer.android.com/guide/components/intents-common.html#Browser
049.        private void callBrowser( String url ) {
050.                // ブラウザの呼び出し
051.                Uri uri = Uri.parse(url);
052.                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
053.                if (intent.resolveActivity(getPackageManager()) != null) {
054.                        startActivity(intent);
055.                        return;
056.                }
057. 
058.                // 対応するアプリが無い
059.                Toast.makeText(
060.                                MainActivity.this,
061.                                "ブラウザを呼び出せません",
062.                                Toast.LENGTH_LONG
063.                ).show();
064.                return;
065. 
066.        }
067. 
068.        @Override
069.        protected void onCreate(Bundle savedInstanceState) {
070.                super.onCreate(savedInstanceState);
071.                setContentView(R.layout.activity_main);
072. 
073.                // ListView のインスタンスを取得
074.                listview = (ListView) MainActivity.this.findViewById(R.id.listView);
075.                // クリックした時のイベント作成
076.                listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
077.                        @Override
078.                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
079.                                // クリックされたビューの内部データ
080.                                Object data = (Object)parent.getItemAtPosition(position);
081.                                // クラス名を取得
082.                                Log.i("lightbox","data type:" + data.getClass().getName());
083.                                String myClass = "app.lightbox.winofsql.jp.listviewaction.MainActivity$MyData";
084.                                String simple = "java.util.HashMap";
085.                                // 専用クラスの場合
086.                                if ( myClass.equals(data.getClass().getName()) ) {
087.                                        MyData myData = (MyData)data;
088.                                        Log.i("lightbox", "title:" + myData.title);
089.                                        Log.i("lightbox", "url:" + myData.url);
090. 
091.                                        // ブラウザの呼び出し
092.                                        callBrowser(myData.url);
093.                                        return;
094.                                }
095. 
096.                                if ( simple.equals(data.getClass().getName()) ) {
097.                                        Map map = (Map)data;
098.                                        Log.i("lightbox", "title:" + map.get("item1"));
099.                                        Log.i("lightbox", "url:" + map.get("item2"));
100. 
101.                                        // ブラウザの呼び出し
102.                                        callBrowser(map.get("item2").toString());
103.                                        return;
104.                                }
105. 
106.                                // 単純な文字列の場合
107.                                String myData = (String)data;
108.                                Log.i("lightbox", "text:" + (String)data);
109. 
110.                        }
111.                });
112. 
113.                // 単純な文字列配列用
114.                strArrayAdapter = new ArrayAdapter<String>(
115.                        MainActivity.this,
116.                        android.R.layout.simple_list_item_1,
117.                        android.R.id.text1
118.                );
119.                // 専用クラス用
120.                arrayMyData = new ArrayAdapter<MyData>(
121.                                MainActivity.this,
122.                                android.R.layout.simple_list_item_1,
123.                                android.R.id.text1
124.                );
125. 
126.                // タイトルデータ(1)
127.                strData1 = new String[]{
128.                        "Yahoo! ニュース","Yahoo! 雨雲ズームレーダー",
129.                        "ねとらぼ","GIGAZINE","Twitter","OneDrive",
130.                        "楽天市場","ウィキペディア","Yahoo!テレビ",
131.                        "@IT","Stack Overflow","Android Developers"
132.                };
133.                // タイトルデータ(1) の URL データ
134.                strData1Url = new String[]{
135.                        "http://news.yahoo.co.jp/",
136.                        "http://weather.yahoo.co.jp/weather/zoomradar/",
137.                        "http://nlab.itmedia.co.jp/",
138.                        "http://gigazine.net/",
139.                        "http://twitter.com/",
140.                        "http://onedrive.live.com/",
141.                        "http://www.rakuten.co.jp/",
142.                        "https://ja.wikipedia.org",
143.                        "http://tv.yahoo.co.jp/",
144.                        "http://www.atmarkit.co.jp/",
145.                        "http://stackoverflow.com/",
146.                        "http://developer.android.com/index.html"
147.                };
148. 
149.                // タイトルデータ(2)
150.                strData2 = new String[]{
151.                        "GIGAZINE","Twitter","OneDrive","楽天市場",
152.                        "ウィキペディア","Yahoo! ニュース",
153.                        "Yahoo! 雨雲ズームレーダー","Yahoo!テレビ",
154.                        "ねとらぼ","@IT","Stack Overflow",
155.                        "Android Developers","Facebook","Dropbox"
156.                };
157. 
158.        }
159. 
160.        @Override
161.        public boolean onCreateOptionsMenu(Menu menu) {
162.                getMenuInflater().inflate(R.menu.menu_main, menu);
163.                return true;
164.        }
165. 
166.        @Override
167.        public boolean onOptionsItemSelected(MenuItem item) {
168.                int id = item.getItemId();
169. 
170.                // 文字列を一つ一つ add して ListView を作成します
171.                if (id == R.id.lv_action1) {
172.                        // ArrayAdapter をクリア
173.                        strArrayAdapter.clear();
174.                        for( int i = 0; i < strData1.length; i++ ) {
175.                                strArrayAdapter.add(strData1[i]);
176.                        }
177.                        listview.setAdapter(strArrayAdapter);
178.                        return true;
179.                }
180. 
181.                // 配列をそのままセットして ListView を作成します
182.                if (id == R.id.lv_action2) {
183.                        // ArrayAdapter をクリア
184.                        strArrayAdapter.clear();
185.                        // でき上がっている配列をそのままセット
186.                        strArrayAdapter.addAll(strData2);
187.                        listview.setAdapter(strArrayAdapter);
188.                        return true;
189.                }
190. 
191.                // List をそのままセットして ListView を作成します
192.                if (id == R.id.lv_action3) {
193.                        // ArrayAdapter をクリア
194.                        strArrayAdapter.clear();
195.                        // 配列から List を作成
196.                        List<String> list = Arrays.asList(strData1);
197.                        // List を指定する addAll
198.                        strArrayAdapter.addAll(list);
199.                        listview.setAdapter(strArrayAdapter);
200.                        return true;
201.                }
202. 
203.                // 専用クラス用のアダプタで ListView を作成します
204.                if (id == R.id.lv_action4) {
205.                        // ArrayAdapter をクリア
206.                        arrayMyData.clear();
207.                        // 配列から作成
208.                        for( int i = 0; i < strData1.length; i++ ) {
209.                                arrayMyData.add(new MyData(strData1[i],strData1Url[i]));
210.                        }
211.                        listview.setAdapter(arrayMyData);
212.                        return true;
213.                }
214. 
215.                // SimpleAdapter で複数項目の表示
216.                if (id == R.id.lv_action5) {
217.                        // 内部データを作成
218.                        List list = new ArrayList<Map<String, ?>>();
219.                        for( int i = 0; i < strData1.length; i++ ) {
220.                                Map map = new HashMap();
221.                                // 名前は文字列で適当に付けます( item1, item2 )
222.                                map.put("item1", strData1[i]);
223.                                map.put("item2", strData1Url[i]);
224.                                list.add(map);
225.                        }
226. 
227.                        // 複数項目のビュー用のインスタンス
228.                        itemsAdapter = new SimpleAdapter(
229.                                // 1)
230.                                MainActivity.this,
231.                                // 2)
232.                                list,
233.                                // 3) 二つの項目を持つビュー
234.                                android.R.layout.simple_list_item_2,
235.                                // 4) ここで項目を一致させる
236.                                new String[] { "item1", "item2" },
237.                                // 5) 実際のビューの id と一致させる
238.                                new int[] { android.R.id.text1, android.R.id.text2 }
239.                        );
240.                        listview.setAdapter(itemsAdapter);
241.                        return true;
242.                }
243. 
244.                return super.onOptionsItemSelected(item);
245.        }
246.}


画面定義
01.<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
02.                xmlns:tools="http://schemas.android.com/tools"
03.                android:layout_width="match_parent"
04.                android:layout_height="match_parent"
05.                android:paddingBottom="@dimen/activity_vertical_margin"
06.                android:paddingLeft="@dimen/activity_horizontal_margin"
07.                android:paddingRight="@dimen/activity_horizontal_margin"
08.                android:paddingTop="@dimen/activity_vertical_margin"
09.                tools:context=".MainActivity">
10. 
11.        <ListView
12.                android:id="@+id/listView"
13.                android:layout_width="wrap_content"
14.                android:layout_height="wrap_content"
15.                android:layout_alignParentStart="true"
16.                android:layout_alignParentTop="true"/>
17. 
18.</RelativeLayout>

メニュー
01.<menu xmlns:android="http://schemas.android.com/apk/res/android"
02.                xmlns:tools="http://schemas.android.com/tools"
03.                tools:context=".MainActivity">
04.        <item
05.                android:id="@+id/lv_action1"
06.                android:title="ArrayAdapter add"
07.                android:orderInCategory="100"
08.                android:showAsAction="never"/>
09.        <item
10.                android:id="@+id/lv_action2"
11.                android:title="ArrayAdapter addAll Array"
12.                android:orderInCategory="100"
13.                android:showAsAction="never"/>
14.        <item
15.                android:id="@+id/lv_action3"
16.                android:title="ArrayAdapter addAll List"
17.                android:orderInCategory="100"
18.                android:showAsAction="never"/>
19.        <item
20.                android:id="@+id/lv_action4"
21.                android:title="ArrayAdapter addAll MyData"
22.                android:orderInCategory="100"
23.                android:showAsAction="never"/>
24.        <item
25.                android:id="@+id/lv_action5"
26.                android:title="SimpleAdapter で複数項目"
27.                android:orderInCategory="100"
28.                android:showAsAction="never"/>
29. 
30.</menu>