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>
|
|
【Android Studio 2の最新記事】
- Android : WebView 経由のデータベースアプリケーション
- Android で WebView を使ってWEBにあるデータベースのデータを取得する為のクラス
- WebView で JavaScript にデータを渡したい時に注意する事
- シンプル Android Data Binding : Android Studio 2.2 / 古い定義との違いと、以前のプロジェクトでエラーが出る場合の対処
- Android Studio で、ListView アプリケーションを作成するテンプレート
- Android : Data Binding で ListView へのデータ表示を凄く簡単にする
- Android Studio で理解不能なエラーが出た時の対処方法 : Invalidate Caches / Restart
- Android : TabHost のタブに下から上へのアニメーションを設定して、include で同一画面を使用するので 回転しないように AndroidMainfest で設定する
- Android : TabHost 内の各 TabSpec 内にある TextView の 端末回転時における保存と復帰
- Android の 端末回転時の EditText と TextView の違い
- ViewPager 内のイベントで設定した TextView の値を保持する Fragment 処理
- ExpandableListView を使用して、タップした時に明細データ表示する
- カスタム・リストビュー・ダイアログ : DialogFragment 内の ListView を ArrayAdapter でカスタムする
- カスタム・リストビュー・ダイアログ : ダイアログ内の ListView を ArrayAdapter でカスタムする
- AlertDialog.Builder の setItems(int itemsId, DialogInterface .OnClickListener listener) を使用した、ListVie..
- AsyncTask<Params, Progress, Result> の Progress を無しにして、onPostExecute 内の処理を interface を使って MainA..
- javamail-android + AsyncTask でメール送信を行う為のテンプレート
- tools.jar の callHttpGet のテストと include による画面再利用と HttpPost クラスで掲示板書き込み / Android Studio
- Android の Spinner に関するいろいろな実装と知識 / Android Studio
- AsyncTask を継承して、Drawable を取得する専用クラスを作成する : Android Studio



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




