Проблема с обновлением списка из диалогового окна - PullRequest
1 голос
/ 15 декабря 2010

У меня есть просмотр списка и моя реализация CursorAdapter.Как часть моего списка, у меня есть кнопка удаления.Когда пользователь нажимает кнопку, я показываю диалоговое окно с запросом подтверждения, и если пользователь нажимает «ОК», я удаляю элемент из базы данных.Проблема в обновлении списка.Я попытался вызвать cursor.requery () и mAdapter.notifyDataSetChanged () (отдельно или оба), но это не помогает.Requery очищает список, и он снова появляется (без отсутствующего элемента) после повторного входа в действие.notifyDataSetChanged ничего не делает (элемент все еще находится в списке), и снова все в порядке после повторного входа в действие.Мне удалось заставить это работать после перезагрузки всей базы данных:

 //in the dialog:
{
DBAdapter db = new DBAdapter( getApplicationContext() );
db.open();

db.deleteTitle( rowid );

db.close();

//cursor.requery();
//mAdapter.notifyDataSetChanged();

fillData();
}


private void fillData() {

                try{
                db.open();
                cursor = db.getAllTitles();
                startManagingCursor(cursor);

                 mAdapter = new MyIDsListCursorAdapters(this, R.layout.myidsrow,
cursor, columns, to);

                setListAdapter(mAdapter);
                db.close();
             }catch (SQLException e){
                showDatabaseErrorDialog ();
             }
         }

Но перезагрузка всей базы данных кажется очень дорогой задачей, и я совершенно уверен, что должен быть лучший способ сделать это.

У меня также есть другая проблема - мои элементы списка определяются относительным макетом.Однако макет, похоже, игнорирует все «вертикальные» атрибуты, такие как alignParentBottom или centerVertical.Я видел Google I / O с Romain Guy, и он ответил на аналогичный вопрос, сказав, что мы должны передать родительскую ViewGroup, за которой следует false, функции inflate, но это все еще не решает мою проблему.Не знаю, что здесь происходит.Я решил это, разместив свои элементы под некоторыми другими и поиграв с полем / отступом, но мне не очень нравится это решение.

1 Ответ

0 голосов
/ 09 июня 2011

запрос устарел. В моей реализации я просто воссоздаю курсор, который, кажется, работает. Вот мои биты кода. В моем случае я использую контекстное меню, чтобы отметить элемент в виде списка, но базовый подход должен работать для вас.

    private Cursor fetchCursor(){
    Intent intent = getIntent();
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        return mDbHelper.fetchSpellSearch(query);
    } else {
        return mDbHelper.fetchAllSpells();
    }
}

@Override  
public boolean onContextItemSelected(MenuItem item) {  
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    switch (item.getItemId()) {
      case 0:
          mDbHelper.updateFavorite(info.id, 1);
          new bgRequery().execute();
          return true;
      case 1:
          mDbHelper.updateFavorite(info.id, 0);
          new bgRequery().execute();
          return true;
      default:
          return super.onContextItemSelected(item);
      }
}

private class bgRequery extends AsyncTask<Void, Integer, Void> {
    @Override
    protected Void doInBackground(Void... voids ) {
        mSpellCursor = fetchCursor();
        return null;
    }
...