CursorAdapterの拡張

前回記事「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を作成する。ざっくりした仕様は以下のような感じ。

  1. 上記ViewHolderを内部クラスに持ち
  2. CursorのデータをViewHolder変数に格納した上で
  3. 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。

実行結果

あえてスクショは掲載しないが、期待通り前回記事と同じ結果が得られた。

コメント