SQLの窓

2015年06月27日


Android の ListView をカスタマイズする為のテスト用の TestArrayAdapter クラスを作成しました。getView を外に出したので、継承して getView を Override する必要がありません

tools.jar

(Tools/Tools2/TestArrayAdapter)



tools.jar には、以下のサンプルコードで使用している、テストを楽にする static メソッドを持った、Tools クラスと Tools2 クラスと、TestArrayAdapter がカタログされています。tools.jar で動かすのもいいですが、どうせテスト目的なので、ソースで実装したほうが面白いかもしれません。
TestArrayAdapter

コンストラクタの第三引数で、OnGetViewListener を渡して、コンストラクタ作成部分で、内部の getView 情報をもらって、カスタムの行画面に対してデータをセットしようというものです。( 通常処理に戻すには、第三引数は null にします )
package jp.android.work;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;

/**
 * Created by lightbox on 2015/06/27.
 */
public class TestArrayAdapter<T> extends ArrayAdapter<T> {

	public interface OnGetViewListener {
		abstract public View onGetViewListener(int position, View convertView, ViewGroup parent);
	}

	private OnGetViewListener listener = null;

	public TestArrayAdapter(Context context, int resource,OnGetViewListener listener) {
		super(context, resource);
		this.listener = listener;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		if ( listener != null ) {
			return listener.onGetViewListener(position, convertView, parent);
		}
		return super.getView(position, convertView, parent);
	}
}


使用サンプル

Tools や Tools2 のメソッドでできる限りソースを簡潔に書けるように努力しています。

getView 内のお約束の処理に関しては、一応 Android Developer のサンプルコードで該当するものをチェックしました。

LayoutInflater の取得に関しては、getSystemService を使うものと、getLayoutInflater を使うものと両方がありましたが、LayoutInflater の説明ではどちらでもいいような記述でした。ただ、目立ってたので getSystemService を使いました。
package sample.lightbox.simplelistview;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.TextView;

import com.google.gson.Gson;

import jp.android.work.TestArrayAdapter;
import jp.android.work.Tools;
import jp.android.work.Tools2;


public class MainActivity extends Activity {

	// Livedoor の お天気Webサービス用 (配列データ用)
	class PinpointLocation {
		String link;
		String name;
		public PinpointLocation(String myLink, String myName) {
			name = myName;
			link = myLink;
		}

		@Override
		public String toString() {
			return name;
		}
	}
	// Livedoor の お天気Webサービス用 (JSON用)
	class Weather {
		PinpointLocation[] pinpointLocations;
	}

	// 専用アダプター
	TestArrayAdapter<PinpointLocation> adapter = null;

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

		// リストビュー(PinpointLocation)用のテスト用アダプターを作成
		adapter =
			new TestArrayAdapter<PinpointLocation>(
				MainActivity.this,
				android.R.layout.simple_list_item_1,
				// 内部からこの OnGetViewListener 内の onGetViewListener を呼び出しています
				new TestArrayAdapter.OnGetViewListener() {
					@Override
					public View onGetViewListener(int position, View convertView, ViewGroup parent) {
						// 行処理のお約束
						// ▼ getView を使ったカスタムのサンプル
						// developer.android.com/samples/DataLayer/Application/src/com.example.android.wearable.datalayer/MainActivity.html
						View rowView = convertView;
						if (rowView == null) {
							// developer.android.com/reference/android/view/LayoutInflater.html
							LayoutInflater inflater = (LayoutInflater)MainActivity.this.getSystemService
								(Context.LAYOUT_INFLATER_SERVICE);
							rowView = inflater.inflate(R.layout.layout_items, null);
						}

						// 外側の自分自身を参照して、内部の PinpointLocation を取得
						PinpointLocation pl = adapter.getItem(position);
						// useView を使用して直接値をセット
						Tools2.<TextView>useView(rowView,R.id.text1).setText(pl.name);
						Tools2.<TextView>useView(rowView,R.id.text2).setText(pl.link);
						Tools2.<TextView>useView(rowView,R.id.text3).setText(Integer.toString(position+1));

						return rowView;
					}
				}
			);

		// ボタンイベントの作成
		Tools2.useButton(MainActivity.this, R.id.button, new View.OnClickListener() {
			@Override
			public void onClick(View v) {

				// データをセット
				Tools.callHttpGet(
					"http://weather.livedoor.com/forecast/webservice/json/v1?city=270000",
					"utf-8",
					new Tools.OnAsyncTaskListener() {
						@Override
						public void onAsyncTaskListener(String s) {

							Gson gson = new Gson();
							Weather weatherData = gson.fromJson(s, Weather.class);

							adapter.clear();
							adapter.addAll(weatherData.pinpointLocations);
							// リストビューに適用
							Tools2.<ListView>useView(MainActivity.this, R.id.listView)
								.setAdapter(adapter);

						}
					}
				);
			}
		});
	}

}


画面定義
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:padding="20dp">

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="New Text"
        android:id="@+id/text1"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:textSize="20dp"/>

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="New Text"
        android:id="@+id/text2"
        android:layout_below="@+id/text1"
        android:layout_alignParentStart="true"/>

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="New Text"
        android:id="@+id/text3"
        android:layout_below="@+id/text2"
        android:layout_alignParentStart="true"/>
</RelativeLayout>



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

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

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