ListView не обновляется после использования changeCursor () на адаптере - PullRequest
3 голосов
/ 14 февраля 2012

Я использую базу данных, и есть фрагмент списка, который использует адаптер курсора, который я получаю, запрашивая базу данных в загрузчике. Когда пользователь нажимает на элемент просмотра списка длительным нажатием, он видит контекстное меню и возможность удалить эту запись. Когда он нажимает «Удалить», я запускаю поток, который удаляет эту запись, а затем снова запускаю загрузчик, чтобы получить новый курсор (потому что «Requery ()» не рекомендуется). Когда загрузчик заканчивает загрузку нового курсора, я пытаюсь использовать метод changeCursor, который предполагает обновить представление списка, но не делает этого, поэтому я попытался использовать notifyDataSetChanged, но он тоже не работает. Я проверил, и курсор возвращается из загрузчика, и он меняет курсор, но представление списка не обновляется.

Что мне делать? Перезапустить фрагмент?

Вот код:

case MENU_REMOVE:
            final AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo();
            mProgress = ProgressDialog.show(getActivity(), getString(R.string.list_remove_progress_title_text),
                    getString(R.string.progress_dialog_description));
            new Thread(new Runnable() {

                @Override
                public void run() {
                    PlacesHandler wph = new PlacesHandler(getActivity());
                    wph.DeleteEntry(mPlaceName, info.id);
                    getLoaderManager().initLoader(0, null, ListFragment.this);
                }
            }).start();
            return(true);

По окончании загрузки:

@Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        if(mProgress == null || !mProgress.isShowing()){
            ...
        }
        else{
            mProgress.dismiss();
            mAdapter.changeCursor(data);
            mAdapter.notifyDataSetChanged();
        }
    }

Спасибо!

Ответы [ 4 ]

4 голосов
/ 15 февраля 2012

Спасибо всем, но я нашел свою проблему!Курсор, который был возвращен из загрузчика, был тем же курсором, что был в адаптере.Это потому, что я позвонил:

getLoaderManager().initLoader(0, null, this);

вместо:

getLoaderManager().restartLoader(0, null, this);

Так как я уже использовал загрузчик с идентификатором 0, когда впервые загрузил курсор, когда фрагмент былсоздал, он просто вернул мне курсор сразу.Поэтому, если некоторые люди сталкиваются с той же проблемой и читают ее, просто знайте, что initLoader использует существующий загрузчик с указанным идентификатором, если он есть.Если нет, он создает.Но если вы хотите сбросить старые данные загрузчика и начать все сначала, вы должны использовать restartLoader.

Опять же, спасибо всем, кто пытался помочь!

1 голос
/ 14 марта 2013

После удаления регистра SQLite я просто сделал это:

myAdapter.getFilter () фильтр ( "");.

0 голосов
/ 14 февраля 2012

Я решил похожую проблему, создав новый курсон и новый адаптер. А затем установите новый адаптер в виде списка: myListView.setAdapter(listViewAdapter);

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

0 голосов
/ 14 февраля 2012

Пара вещей.Я не знаком с фрагментами, поэтому я просто попытаюсь помочь вам.

Где вы обновляете курсор для получения новых данных?Кроме того, попробуйте использовать AsyncTask для удаления.Когда закончите, обновите адаптер в методе postexecute.

...