SimpleCursorAdapterを継承してImageViewとTextViewを表示させる

コンテンツプロパイダから取得したデータ等を単純にListViewにリスト表示するだけであれば、SimpleCursorAdapterを使えば容易にできます。

では、その取得したデータだけではなく、別途用意したアイコンもリストの左端等にちょこっと表示させたい場合はどうすればいいでしょうか。

SimpleCursorAdapterを継承したサブクラスを作成し、そのサブクラスの中でnewView()とbindView()をオーバーライドすることにより実現可能です。newView()の中でリストアイテムのビューを生成し、bindView()の中でコンテンツプロバイダから取得したデータとアイコンリソースをセットします。

例えば、以下の様なコードになります。

public class CustomListAdapter extends SimpleCursorAdapter {
            
    static class ViewHolder {
        public ImageView imageView;
        public TextView textView;
    }
    
    public CustomListAdapter(Context context, int layout, Cursor c,
            String[] from, int[] to, int flags) {
        super(context, layout, c, from, to, flags);
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.
                getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View v= inflater.inflate(R.layout.list_item_sample,null,true);
        
        ViewHolder holder = new ViewHolder();

        holder.imageView = (ImageView) v.findViewById(R.id.icon_sample);
        holder.textView = (TextView) v.findViewById(R.id.text_sample);

        v.setTag(holder);
        
        return v;
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        ViewHolder holder = (ViewHolder) view.getTag();
        
        // SQLiteのテーブルの"sample_row"という列のデータを取得してセット
        String s = cursor.getString(cursor.getColumnIndex("sample_row")); 
        holder.textView.setText(s);

        // 別途用意したアイコンをセット
        holder.imageView.setImageResource(R.drawable.ic_sample);
    }
}

layout/list_item_sample.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >
        
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="horizontal" 
        android:gravity="center_vertical" >

        <ImageView 
            android:id="@+id/icon_sample"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" 
            android:gravity="center_vertical" />
                        
        <TextView
            android:id="@+id/text_sample"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:minHeight="50dp"
            android:gravity="center_vertical"
            android:textSize="20sp" />
    </LinearLayout>

</LinearLayout>

上記のCustomListAdapterをインスタンス化する箇所は、例えばListFragmentの中であればonActivityCreated()の中で以下のように記述します。

private CustomListAdapter mCustomListAdapter;
// 中略
@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    // 中略
    mCustomListAdapter = new CustomListAdapter(getActivity(),
            R.layout.list_item_sample, null,
            new String[] {
                    "sample_row",
            },
            new int[] {
                    R.id.text_sample,
            },
            0);
    // 中略
}

あとは、リストビューにこのアダプターをセットするという、従来のSimpleCursorAdapterの使い方と同様です。

すると、このような感じに左端にアイコンが付いたリストを表示させることができます。