【问题标题】:android cursor adapter list viewandroid光标适配器列表视图
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多