SimpleCursorAdapterのAdapt先にsetTextなどをする値をいじる

前回はSimpleCursorAdapterを継承して新しいクラスを作ってたけど、listenerいらないならそこまでしなくても大丈夫。

main.xml

<?xml version="1.0" encoding="utf-8"?>
<ListView
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:id="@android:id/list"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent" />

list_row.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent"
	android:layout_height="wrap_content">

	<CheckBox
		android:id="@+id/check"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:paddingRight="5dp" />

	<TextView
		android:id="@+id/text_number"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:layout_toRightOf="@id/check"
	/>

	<TextView
		android:id="@+id/text_name"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:layout_below="@id/text_number"
		android:layout_alignLeft="@id/text_number"
		android:textSize="23sp" />

</RelativeLayout>


public class MyListActivity extends ListActivity implements SimpleCursorAdapter.ViewBinder {

	/**
	 * AdapterでバインドされるデータのDB内カラム名
	 * DBに_idカラムがないとIllegalStateExceptionが発生する。)
	 */
	private static final String FROM = { "_id", "checked", "name" };

	// 0番目は_id
	private static final int ID = 0;
	private static final int CHECK = 1;
	private static final int NAME = 2;

	private static final String DB_FILENAME = "database.db";
	private static final String DB_TABLENAME = "database";
	private static final int DB_VERSION = 2;

	/** AdapterでバインドするViewのID */
	private static final int TO = { R.id.text_number, R.id.check, R.id.text_name };

	/** ListViewにDBの値をバインドするクラス */
	private SimpleCursorAdapter adapter;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		MyDBOpenHelper helper = new MyDBOpenHelper(getApplicationContext(), DB_FILENAME, null, DB_VERSION);
		SQLiteDatabase db = helper.getReadableDatabase();
		Cursor c = db.query(DB_TABLENAME, null, null, null, null, null, null);
		adapter = new SimpleCursorAdapter(getApplicationContext(), R.layout.list_row, c, FROM, TO);
		adapter.setViewBinder(this);
		setListAdapter(adapter);
	}

	public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
		switch (columnIndex) {
		case CHECK:
			CheckBox cb = (CheckBox) view;
			cb.setChecked(cursor.getInt(columnIndex) == 1);
			return true;
		case ID:
			TextView number = (TextView) view;
			number.setText("No." + cursor.getString(columnIndex));
			return true;
		default:
			break;
		}
		return false;
	}
}

DBに入れたデータ

_idcheckedname
10Cupcake
21Donut
31Eclair
41Froyo
50Gingerbread
60Honeycomb

表示結果

f:id:clomie_p:20101010013824p:image:h300

内部クラスでも、無名クラスでも大丈夫。

とにかくSimpleCursorAdapter.ViewBinderのsetViewValueを実装してSimpleCursorAdapterにsetViewBinderする。