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