リストビューの一行ぶんの View の定義としては、android.R.layout.simple_list_item_1 と android.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); } });
|
【Android Studio 1の最新記事】
- Tools クラスを使って Livedoor の お天気Webサービスを呼び出して Google gson でリストビューに一括で投入するとこうなります
- Android の ListView で ArrayAdapter をカスタマイズして表示する時、リストビューのアイテム内にボタン等がある場合のイベント登録時の注意事項
- できる限り不必要な記述は省いて simple_list_item_2 を使った 自前クラスを扱う専用 ArrayAdapter(private) でリストビューの表示
- できるだけ難しい事をせずに、Android のリストビューでタイトルをクリックしたらそのページを表示する( 自前のオブジェクトを ArrayAdapter にセットする )
- インターネットからアイコン画像を取得してリストビューを表示する
- Android の AlertDialog を使いやすくする MessageBox クラス
- できるだけ難しい事をせずに、Android のリストビューでタイトルをクリックしたらそのページを表示する
- Android Studio : インターネット上の画像を取得して、Bitmap か Drawable で ImageView に表示する
- Storage Access Framework のガイドラインに基づく、Android 4.4 とそれ以降における 画像参照
- Android Studio : GET(POST)メソッドで呼び出す際に、PHP 側のセッションを有効にする為に CookieManager を static で使用する
- Android Studio で AsyncTask / Android Studio ならではの操作でコードを楽々作成
- Android Studio : 現在の時間を ライフサイクルのアクティブな時に処理される onStart で表示する( 5.1.1 )
- Android Studio でボタンをクリックして トースト(Toast) を表示する / onClick プロパティと Button へのイベント登録( Listener )
- Google スプレッドシートで、Android Studio の重要な操作のまとめ
- Android Studio で com.example. lightbox. myapplication を jp.winofsql. lightbox. threeButton に変更
- ショートカットキーを使って、Android Studio のコード記述を極限まで楽にする
- Android Studio の 『CTRL + SHIFT + I』(定義の参照) を中心に、少しでも時間短縮
- Android Strudio で行われている『スペルチェック』をオフにする( Typo: In word '.....' という表示 )
- Android Studio と Pleiades Eclipse + Android SDK が参照する Java SE ドキュメントを日本語化する