手動で追加した値をSimpleCursorAdapterで使う

デバッグとかのときとか、DB使いたくないとき用に。

ArrayAdapterを継承して新しいクラス作ってgetViewオーバーライドして値追加して…ってやるのはめんどくさい。

そこで、SimpleCursorAdapterの引数に使う、DBのクエリ結果を格納するCursorを擬似的に作成する。

二次元表のCursorとして使えるクラスMatrixCursorを使う。

もともとのコードは1つ前の記事。

public class MyListActivity extends ListActivity implements SimpleCursorAdapter.ViewBinder {

	/** 仮想的に作成するDBのカラム名 */
	private static final String FROM = { "_id", "checked", "name" };

	private static final int ID = 0;
	private static final int CHECK = 1;
	private static final int NAME = 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;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		// DBを仮想的に作成して値を追加していく。FROM配列の長さ=addRowする配列の長さ。
		MatrixCursor c = new MatrixCursor(FROM);
		c.addRow(new String { "1", "0", "Cupcake" });
		c.addRow(new String { "2", "1", "Donut" });
		c.addRow(new String { "3", "1", "Eclair" });
		c.addRow(new String { "4", "1", "Froyo" });
		c.addRow(new String { "5", "0", "Gingerbread" });
		c.addRow(new String { "6", "0", "Honeycomb" });

		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;
		case NAME:
			break;
		default:
			break;
		}
		return false;
	}
}