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に入れたデータ
_id | checked | name |
---|---|---|
1 | 0 | Cupcake |
2 | 1 | Donut |
3 | 1 | Eclair |
4 | 1 | Froyo |
5 | 0 | Gingerbread |
6 | 0 | Honeycomb |
表示結果
内部クラスでも、無名クラスでも大丈夫。
とにかくSimpleCursorAdapter.ViewBinderのsetViewValueを実装してSimpleCursorAdapterにsetViewBinderする。