ArrayAdapter.java の中身を見ると、getView では、ListView に使われた ArrayAdapter 内のクラスに対して、toString() で文字列を取得して行のテキストにセットしています。 そして、行のテキストは TextView という前提で作られており、コンストラクタにその TextView の id が引き渡されているかどうかで行の画面定義が2通りである事が解ります。 コンストラクタに TextView の id を渡さない この場合は、行の画面定義は TextView だけで成り立っている必要があり、ここで使っている android.R.layout.simple_list_item_1 には、TextView の定義しかありません。 コンストラクタに TextView の id を渡す この場合は、行の画面定義内に少なくとも一つ TextView があれば良く、その TextView の id を引き渡す必要があります。
try { if (mFieldId == 0) { // If no custom field is assigned, assume the whole resource is a TextView text = (TextView) view; } else { // Otherwise, find the TextView field within the layout text = (TextView) view.findViewById(mFieldId); } } catch (ClassCastException e) { Log.e("ArrayAdapter", "You must supply a resource ID for a TextView"); throw new IllegalStateException( "ArrayAdapter requires the resource ID to be a TextView", e); }
package sample.lightbox.listview01; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import java.util.ArrayList; public class MainActivity extends Activity { static final String DEBUG_TAG = "ListView :"; // ArrayAdapter 用プライベートクラス private class MyLinkData { String myText; String myUrl; MyLinkData( String myText, String myUrl ) { this.myText = myText; this.myUrl = myUrl; } public String toString() { return myText; } } // 変数定義 ArrayList<MyLinkData> myLinks = null; ArrayAdapter<MyLinkData> adapter = null; ListView listView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myLinks = new ArrayList<MyLinkData>(); myLinks.add(new MyLinkData( "SQLの窓", "http://winofsql.jp" )); myLinks.add(new MyLinkData("logical error", "http://logicalerror.seesaa.net/")); myLinks.add(new MyLinkData("琴線に触れる", "http://heart.winofsql.jp/")); myLinks.add(new MyLinkData("GINPRO", "http://ginpro.winofsql.jp/")); // リストビュー用のアダプターを作成 adapter = new ArrayAdapter<MyLinkData>(this, android.R.layout.simple_list_item_1); adapter.addAll(myLinks); // リストビューのインスタンスを取得 listView = (ListView) MainActivity.this.findViewById(R.id.listView); // リストビューにデータ( アダプター ) をセット listView.setAdapter(adapter); // イベント listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { MyLinkData item = adapter.getItem(position); // LogCatに表示 Log.i(DEBUG_TAG, item.myUrl); Log.i(DEBUG_TAG, item.toString()); Log.i(DEBUG_TAG, Integer.toString(position)); // URL を開く startActivity( new Intent(Intent.ACTION_VIEW, Uri.parse(item.myUrl)) ); } }); } }
onItemClick の中身については、以下のように SDK で書かれています。 Parameters parent => The AdapterView where the click happened. ※ クリックされた View( Adapter をセットした View / ここでは ListView ) view => The view within the AdapterView that was clicked (this will be a view provided by the adapter) ※ クリックされた View の 中の行の View( ArrayAdapter で用意されたもの ) position => The position of the view in the adapter. ※ ArrayAdapter 内の位置 id => The row id of the item that was clicked. ※ 行の id ( position とどう違うが不明。おそらく、ArrayAdapter をカスタマイズした時に自分で実装するものと思われる )
|
【Android Studio 1の最新記事】
- Tools クラスを使って Livedoor の お天気Webサービスを呼び出して Google gson でリストビューに一括で投入するとこうなります
- Android の ListView で ArrayAdapter をカスタマイズして表示する時、リストビューのアイテム内にボタン等がある場合のイベント登録時の注意事項
- できる限り不必要な記述は省いて simple_list_item_2 を使った 自前クラスを扱う専用 ArrayAdapter(private) でリストビューの表示
- インターネットからアイコン画像を取得してリストビューを表示する
- Android の AlertDialog を使いやすくする MessageBox クラス
- できるだけ難しい事をせずに、Android のリストビューでタイトルをクリックしたらそのページを表示する
- Android の単純な ListView の ArrayAdapter による応用の効く 4バリエーション と複数項目に即対応できる SimpleAdapter による実装
- 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 ドキュメントを日本語化する