У меня есть представление с кнопкой и представление списка, поддерживаемое адаптером курсора, содержащим 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();
});
}
} }