前回記事「CursorLoaderを使ったListView一覧表示」では、SimpleCursorAdapterを使ったDBのListView表示を行った。文字列だけをListView表示するならSimpleCursorAdapterで事足りるが、撮った写真のサムネイルを表示したいとなるとAdapterのカスタマイズが必要。そこで今回はサムネイル表示の準備段階として、前回と同じ内容をSimpleCursorAdapterではなくてCursorAdapterで実現することを目標とする。
同じような感じでカスタマイズしている記事を見つけたので、参考にさせて頂いた。
ViewHolderの準備
ListViewに表示されるデータの実体を入れる入れ物として、ViewHolderを定義する。今回はテスト用なので、文字列(TextView)にてidと写真のURIを定義すれば良い。
static class ViewHolder {
TextView id_text;
TextView uri_text;
}
CursorAdapterクラスの拡張
CursorAdapterクラスを拡張して、MyCursorAdapterを作成する。ざっくりした仕様は以下のような感じ。
- 上記ViewHolderを内部クラスに持ち
- CursorのデータをViewHolder変数に格納した上で
- ViewHolderをViewに渡す
とりあえずListViewの表示には、newViewメソッドとbindViewメソッドの実装すればOK。
package com.example.photologger;
import android.content.Context;
import android.database.Cursor;
import android.support.v4.widget.CursorAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class MyCursorAdapter extends CursorAdapter {
private LayoutInflater mCursorInflater;
public MyCursorAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
mCursorInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
static class ViewHolder {
TextView id_text;
TextView uri_text;
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
View view = mCursorInflater.inflate(R.layout.list_item, null);
ViewHolder holder = new ViewHolder();
holder.id_text = (TextView) view.findViewById(R.id.id);
holder.uri_text = (TextView) view.findViewById(R.id.uri);
view.setTag(holder);
return view;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
ViewHolder holder = (ViewHolder) view.getTag();
int id = cursor.getInt(0);
String string1 = cursor.getString(1);
holder.id_text.setText(String.valueOf(id));
holder.uri_text.setText(string1);
}
}
MainActivity.javaの変更
curAdapterの宣言型をSimpleCursorAdapterからMyCursorAdapterに変更し、コンストラクタの呼び出しを変更する。
SimpleCursorAdapterを使った前回記事では、
String[] from = {"_id", LogDBAdapter.COL_PHOTO_URI};
int[] to = {R.id.id, R.id.uri};
curAdapter = new SimpleCursorAdapter(this, R.layout.list_item, null, from, to, FLAG_REGISTER_CONTENT_OBSERVER);
となっていた所を、新しく作ったクラスでは、
curAdapter = new MyCursorAdapter(this, null, FLAG_REGISTER_CONTENT_OBSERVER);
とすればよい。
それ以外は親クラスが一緒ということもあって互換性があり、何も変更しなくてOK。
実行結果
あえてスクショは掲載しないが、期待通り前回記事と同じ結果が得られた。
コメント