android游标适配器列表视图

时间:2014-06-23 16:36:01

标签: android listview android-cursoradapter

我有一个带有按钮和列表视图的视图,该视图由包含bindView()和newView()的游标适配器支持,用于自定义视图。列表的每一行都包含一个文本和一个复选框。每个视图的数据来自数据库。我在游标适配器构造函数中传递了我的数据库适配器。这是我用来在检查或取消选中复选框时更新数据库(效果很好)。当然我跑'#34;重新查询" on cursor和view.refreshDrawableState())。这是一个好主意吗?什么是更好的解决方案?

第二个问题更严重,当点击按钮时,它会启动一个新活动。从新活动点击后退按钮后,我回到我的列表视图。但是当我尝试单击复选框时,这次我得到数据库关闭异常。为什么?如何解决此错误?

以下是列表视图和代码段。


        Button           --------> Starts a new activity

CheckBox | TextView的


CheckBox | TextView的


MyActivity.java


onCreate() {
    ...
    Button add_item_btn = (Button) findViewById(R.id.add_item_btn_id);
    add_item_btn.setOnclickListener(new OnClickListener() {
      //Start a new activity
    });
}

protected void onPause() {
   adapter.close();
   mCursor.close();
}

protected void onResume() {
  mListView = getListView();
  adapter = new DBAdapter(getApplication());
  adapter.open();
  mCursor = adapter.getAllItems();
  mCustomAdapter = new MyCursorAdapter(MyActivity.this, mCursor, adapter);
  mListView.setAdapter(mCustomAdapter); 
}

MyCursorAdapter.java

public class MyCursorAdapter extends CursorAdapter {
  Cursor mCursor;
  DBAdapter adapter;
  public MyCursorAdapter(Context context, Cursor c, DBAdapter _adapter)  {
    ...
    mCursor = c;
    adapter = _adapter;
  }

public void bindView(final View view, Context context, final Cursor cursor) {

  final CheckBox itemStatusCB = (CheckBox) 
  view.findViewById(R.id.item_status_id);

  idx = cursor.getColumnIndex(myItem.ITEM_STATUS);
  final long itemStatus = cursor.getLong(idx);

  if (itemStatus == 1) {
     itemStatusCB.setChecked(true);           
  } else {
     itemStatusCB.setChecked(false);           
  }

  itemStatusCB.setOnClickListener(new OnClickListener() {
     @Override public void onClick(View v) {
       int newStatus = 0;  
       if (((CheckBox) v).isChecked()) {
         newStatus = 1; 
       }
         adapter.updateItemStatus(itemId, newStatus);
         mCursor.requery();                           
         view.refreshDrawableState();
     });
  }

} }

1 个答案:

答案 0 :(得分:0)

我能够解决这个问题。调用的新活动在onStart()上打开了DB连接,在onDestroy()上打开了DB。从该活动返回后,我收到了数据库非法状态异常错误,如堆栈跟踪所述。我认为它返回了DB连接的缓存版本。一旦我从访客活动中删除了DB.close(),它就停止发出数据库未打开错误。通常你会认为每个活动都可以在它的onResume()或onStart()中打开一个数据库连接,并在它的onPause()或onStop()或onDestroy()中关闭它,它赢了&#39 ; t影响跨活动的连接。这有意义吗?