【发布时间】:2014-06-23 16:36:00
【问题描述】:
我有一个带有按钮的视图和一个由包含 bindView() 和 newView() 的光标适配器支持的列表视图,用于自定义视图。列表的每一行都包含一个文本和一个复选框。每个视图的数据都来自数据库。我在游标适配器构造函数中传递我的数据库适配器。当复选框被选中或未选中(效果很好)时,我用它来更新数据库。当然,我在光标和 view.refreshDrawableState()) 上运行“重新查询”。这是一个好主意吗?有什么更好的解决方案?
第二个问题更严重,当一个按钮被点击时,它会启动一个新的活动。从新活动中点击后退按钮后,我会返回我的列表视图。但是,当我这次尝试单击复选框时,我得到了数据库关闭异常。为什么?如何解决此错误?
下面是列表视图和代码sn-p。
Button --------> Starts a new activity
复选框 |文本视图
复选框 |文本视图
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();
});
}
} }
【问题讨论】:
-
你能发布代码吗?也许分开问你的 2 个问题会有所帮助,因为它们似乎不相关
-
Jim,添加了代码 sn-ps。
-
您似乎没有在 onResume 中重置您的列表视图适配器 - 您有旧参考吗?
-
吉姆,对不起,我错过了那句话。我有 mListView.setAdapter(mCustomAdapter);在简历中。查看更新的代码。
-
您的 DBAdapter 代码也...您的“重新查询”很好(回答这个问题)。 “关闭”数据库可能意味着您的适配器即使在您重新创建对象后仍持有对数据库的引用...
标签: android listview android-cursoradapter