petitviolet_blog

@petitviolet blog

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