Просмотр списка адаптеров курсора Android

У меня есть представление с кнопкой и представление списка, поддерживаемое адаптером курсора, содержащим bindView() и newView() для настраиваемых представлений. Каждая строка списка содержит текст и флажок. Данные для каждого представления поступают из базы данных. Я передаю свой адаптер базы данных в конструкторе адаптера курсора. Это я использую для обновления базы данных, когда флажок установлен или не отмечен (работает хорошо). Конечно, я запускаю «повторный запрос» для курсора и view.refreshDrawableState()). Это хорошая идея? Что было бы лучшим решением?

Вторая проблема, более серьезная, когда нажимается кнопка, она запускает новое действие. После нажатия кнопки «Назад» из нового действия я возвращаю свой список View. Но когда я пытаюсь установить флажок на этот раз, я получаю исключение закрытия базы данных. Почему? Как исправить эту ошибку?

Ниже приведен список и фрагмент кода.


        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();
     });
  }

} }


person Atarang    schedule 23.06.2014    source источник
comment
можешь выложить код? и, возможно, было бы полезно задать два вопроса отдельно, поскольку они не кажутся связанными.   -  person Jim    schedule 23.06.2014
comment
Джим, добавлены фрагменты кода.   -  person Atarang    schedule 23.06.2014
comment
похоже, вы не сбрасываете свой адаптер списка в onResume - у вас есть старая ссылка?   -  person Jim    schedule 23.06.2014
comment
Джим, извини, я пропустил эту строчку. У меня есть mListView.setAdapter(mCustomAdapter); в резюме. Смотрите обновленный код.   -  person Atarang    schedule 23.06.2014
comment
Ваш код DBAdapter также... ваш запрос в порядке (чтобы ответить на этот вопрос). Закрытая база данных, вероятно, означает, что ваш адаптер содержит ссылку на базу данных даже после повторного создания объекта...   -  person Jim    schedule 23.06.2014
comment
Как решить эту проблему? Любая помощь приветствуется.   -  person Atarang    schedule 23.06.2014
comment
опубликовать трассировку стека и больше кода   -  person Jim    schedule 23.06.2014
comment
Больше нечего показывать, вот и все. Но я скоро обновлю трассировку стека.   -  person Atarang    schedule 24.06.2014
comment
06-23 21:59:07.760: E/AndroidRuntime(3236): java.lang.IllegalStateException: база данных не открыта 06-23 21:59:07.760: E/AndroidRuntime(3236): в android.database.sqlite.SQLiteDatabase. updateWithOnConflict(SQL\ iteDatabase.java:1702) 06-23 21:59:07.760: E/AndroidRuntime(3236): в android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.ja\ va:1656)   -  person Atarang    schedule 24.06.2014


Ответы (1)


Я смог решить это. Новое действие, которое было вызвано, имело соединение с БД, открытое в onStart(), и БД, закрытое в onDestroy(). После возвращения из этого действия я получил ошибку исключения недопустимого состояния базы данных, как описано в трассировке стека. Я думаю, что он возвращал кешированную версию соединения с БД. Как только я удалил DB.close() из гостевой активности, он перестал выдавать ошибку «база данных не открыта». Обычно вы думаете, что каждое действие может открыть соединение с БД в своем onResume() или onStart() и закрыть его в своем onPause() или onStop() или onDestroy(), и это не повлияет на соединение между действиями. Имеет ли это смысл?

person Atarang    schedule 24.06.2014