SQLの窓

2015年07月13日


できるだけ難しい事をせずに、Android のリストビューでタイトルをクリックしたらそのページを表示する( 自前のオブジェクトを ArrayAdapter にセットする )

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 をカスタマイズした時に自分で実装するものと思われる )


【1 Android Studioの最新記事】
posted by lightbox at 2015-07-13 15:35 | 1 Android Studio | このブログの読者になる | 更新情報をチェックする
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり