Задать вопрос
@sulik93
Начал изучать Java. Продолжаю изучать Java.

Как устранить ошибку IllegalStateException в ListView + ContentProvider + CursorAdapter + Loader?

Я использую ContentProvider + CursorAdapter + Loader.
В отдельном потоке загружаю данные из сети, парсю и добавляю в БД через ContentProvider:
context.getContentResolver().insert(uri, contentValues);

В активити получаю Cursor в методе onLoadFinish():
@Override
public void onLoadFinished(Loader loader, Cursor cursor) {
    cursorAdapter.swapCursor(cursor);
    cursorAdapter.notifyDataSetChanged();
}


Если по мере добавления item-ов начинаю прокручивать список вылетает ошибка:
java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. [in ListView(-1, class com.madyar_android.app.PullToRefresh$4) with Adapter(class com.madyar_android.app.PullToRefresh$PullToRefreshAdapter)]
            at android.widget.ListView.layoutChildren(ListView.java:1548)
            at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:4320)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:776)
            at android.view.Choreographer.doCallbacks(Choreographer.java:579)
            at android.view.Choreographer.doFrame(Choreographer.java:547)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:762)
            at android.os.Handler.handleCallback(Handler.java:725)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:153)
            at android.app.ActivityThread.main(ActivityThread.java:5297)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
            at dalvik.system.NativeStart.main(Native Method)


Пишут, что решается вызовом метода cursorAdapter.notifyDataSetChanged();

Подскажите, пожалуйста, где мне в этом случае вызывать notifyDataSetChanged() или проблема в другом ?
  • Вопрос задан
  • 770 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
mbelskiy
@mbelskiy
Software Developer
Пишут, что
Make sure the content of your adapter is not modified from a background thread, but only from the UI thread

Что-то у вас с потоками не лады, курите.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
retor4i
@retor4i
Junior Java Developer
Информация в адаптере обновилась(поменялась), но он не уведомлял об этом ListView. adapter.notifyDataSetchanged()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы