![]()
![]()
リストビューの一行ぶんの 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 ドキュメントを日本語化する


リストビューの一行ぶんの View の定義としては、



