SImpleCursorAdapterについて
SimpleCursorAdapter
Androidアプリ開発において、ListViewにデータを渡すために用いられるアダプターの1つ。
ArrayAdapterなんかが一般的だが、これはコンストラクタに表示したいデータを渡してあげなければならない。
SQLiteなどのDBから特定のデータを取り出してそれをListViewに表示するというにはデータを取り出してから渡す、という二度手間になってしまいます。
そこで、SimpleCursorAdapterを使うと、DBのカーソルを渡すことで、直接DBのデータを表示させることが出来ます。
コンストラクタ
SimpleCursorAdapter (Context context, int layout, Cursor c, String[] from, int[] to, int flags)
- context:コンテキスト
- layout:表示するためのレイアウト
- cursor:SQLiteのCursor
- from:表示させたいColumn名
- to:バインドする先のID
- flags:さぁ?笑
となっている。
Example(ListView内に2つの要素(headとbody)を表示させる。)
まず元となるListViewをonCreateで用意しておく。ここではandroidで用意されているものを使う。
ListView lv = (ListView) this.findViewById(android.R.id.list);
そして、TextViewをLinearLayout等で2つ並べたlayoutを別で作る(res/layout/text.xml)
これがListViewの1行にあたるものとなる。
TextViewそれぞれのidをheadとbodyにしておき、
Cursor cursor = db.query(~) //dbはSQLiteDatabaseオブジェクト String[] from = {"head", "body"}; //DBのheadとbodyというColumnのデータを int[] to = {R.id.head, R.id.body}; //R.id.headとR.id.bodyに埋める SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.text, cursor, from, to, 0); setListAdapter(adapter);
とすれば、DBのheadとbodyが1行に表示されたもののリストが表示される。
flagsは知らない笑
レイアウトをいじる
例えば上の例でheadとbodyとで文字色や背景色を変えたい時、
layoutのxmlをいじってもいいが、
adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() { public boolean setViewValue(View view, Cursor cursor, int columnIndex) { if (columnIndex == 0) { int Color = getResources().getColor(R.color.black); ((TextView)view).setTextColor(Color); } else { int Color = getResources().getColor(R.color.gray); ((TextView)view).setTextColor(Color); } return false; } }); setListAdapter(adapter);
とすることで、表示するColumnのindexが0(DBの0番目のColumn)の時、
その文字色を黒にし、そうでない時グレーにする、という処理ができる。
色はres/values/color.xmlに定義しといてください。
悩み
長押しした時に選択されている(state_pressedやstate_selected)によって
背景色を変えたいのに出来ないのなんでだろ〜orz