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