SQLの窓

2015年07月14日


できる限り不必要な記述は省いて simple_list_item_2 を使った 自前クラスを扱う専用 ArrayAdapter(private) でリストビューの表示



android.R.layout にあるものを適当に使えるのですが、とりあえず simple_list_item_2 を使って実装しました。

一般的な ListView のカスタマイズですが、できる限り不必要な記述は省いて作成しています。( 正確には、『不必要な記述は省く』では無く『書かなくても動作する部分は省く』です。 )

MyArrayAdapter はプライベートクラスなので、getView で必要なものは直接参照するようにして、コンストラクタの引数は無くしました。スーパークラスのコンストラクタは呼んでおかないと、内部の List のインスタンスが作成されないので呼んでいますが、MainActivity の インスタンスにしても、直接参照できるので必要無いのですが、渡さないとスーパークラスの初期処理でエラーとなるのでセットしています。
package sample.lightbox.listview02;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;


public class MainActivity extends Activity {

	private static final String DEBUG_TAG = "ListView :";
	MyArrayAdapter adapter = null;

	// MyArratAdapter 用プライベートクラス
	private class MyLinkData {
		String myText;
		String myUrl;

		public MyLinkData(String myText, String myUrl) {
			this.myText = myText;
			this.myUrl = myUrl;
		}
	}

	// simple_list_item_2 を使った MyLinkData 専用 ArrayAdapter
	private class MyArrayAdapter extends ArrayAdapter<MyLinkData> {

		// プライベートなので、コンストラクタに渡す情報はありません
		public MyArrayAdapter() {
			// スーパークラスに必要なのは、アクティビティのインスタンスのみ
			super(MainActivity.this, 0);
		}

		// 一般的な getView 内のカスタマイズ
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			View rowView = convertView;

			if (rowView == null) {
				LayoutInflater inflater = MainActivity.this.getLayoutInflater();
				rowView = inflater.inflate(android.R.layout.simple_list_item_2, null);
			}

			MyLinkData myLinkData = MyArrayAdapter.this.getItem(position);
			TextView textView1 = (TextView) rowView.findViewById(android.R.id.text1);
			textView1.setText(myLinkData.myText);
			TextView textView2 = (TextView) rowView.findViewById(android.R.id.text2);
			textView2.setText(myLinkData.myUrl);

			return rowView;
		}
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// リストビューに表示させる情報
		MyLinkData[] myLinks = {
			new MyLinkData( "SQLの窓", "http://winofsql.jp" ),
			new MyLinkData( "logical error", "http://logicalerror.seesaa.net/" ),
			new MyLinkData( "琴線に触れる", "http://heart.winofsql.jp/"),
			new MyLinkData( "GINPRO", "http://ginpro.winofsql.jp/")
		};

		// リストビュー用のアダプターを作成
		adapter = new MyArrayAdapter();
		adapter.addAll(myLinks);

		// リストビューを取得
		ListView listView = (ListView) MainActivity.this.findViewById(R.id.listView);

		// リストビューにデータ( アダプター ) をセット
		listView.setAdapter(adapter);

		// リストビューのアイテムがクリックされた時の処理
		listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View view,
									int position, long id) {

				MyLinkData item = adapter.getItem(position);
				// LogCatに表示
				Log.i(DEBUG_TAG, item.myText);
				Log.i(DEBUG_TAG, item.myUrl);
				Log.i(DEBUG_TAG, Integer.toString(position));

				// URL を開く
				startActivity( new Intent(Intent.ACTION_VIEW, Uri.parse(item.myUrl)) );

			}
		});
	}


}

関連する記事

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

画面定義
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_vertical_margin"
                android:paddingBottom="@dimen/activity_vertical_margin"
                tools:context=".MainActivity">

    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/listView"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"/>
</RelativeLayout>

R.layout は、ユーザー定義で、android.R.layout は システム定義です



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

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

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