SimpleCursorAdapter より CursorAdapter

SimpleCursorAdapter は、簡単で便利だけど、ListView で任意の行で特殊な処理が必要な時は辛い。

  final ListView listview = (ListView)findViewById(R.id.listView);

である場合、SimpleCursorAdapter は、以下のとおり書けるのは魅力的

listview.setAdapter(new SimpleCursorAdapter(this
   ,android.R.layout.simple_list_item_2
   ,cursor
   ,new String{"name","telno"}
   ,new int
{android.R.id.text1,android.R.id.text2)

);

これを、CursorAdapte で記述するなら、

listview.setAdapter(new CursorAdapter(this,cursor,false){
   @Override
   public View newView(Context context,Cursor cursor,ViewGroup parent){
      LayoutInflater inflater = LayoutInflater.from(context);

      View view = inflater.inflate(android.R.layout.simple_list_item_2,parent,false);
      bindView(view,context,cursor);
      return view;
   }
   @Override
   public void bindView(View view,Context context,Cursor cursor){

      TextView name = (TextView)view.findViewById(android.R.id.text1);
      name.setText(cursor.getString(cursor.getColumnIndex("name")));
      // 任意のレコードで、TextView の属性を変更する。
      TextView telno = (TextView)view.findViewById(android.R.id.text2);
      telno.setText(cursor.getString(cursor.getColumnIndex("telno")));
   }
});

そして、レコードの追加は、

*1.setOnClickListener(new View.OnClickListener(){
   @Override
   public void onClick(View view){
      ((CursorAdapter)listview.getAdapter()).changeCursor(timeDB.queryAll());
      *2.notifyDataSetChanged();
   }
});

*1:Button)findViewById(R.id.addButton

*2:BaseAdapter)listview.getAdapter(