Я начну с того, что я пытаюсь выполнить.
У меня есть ListFragment, с LoaderCallbacks, связанным с извлечением данных из БД. Данные загружаются с использованием AsyncTask и вставляются в БД. Когда пользователь попадает в нижнюю часть списка, используя виджет CWAC-Endless, AsyncTask запускается и загружает больше данных.
Я столкнулся с несколькими проблемами здесь, и я попытался разобраться в этом много ночи, и я решил приехать сюда, чтобы попросить о помощи.
Первая проблема - configChanges. Когда пользователь поворачивает устройство, активность уничтожается, а затем воссоздает все фрагменты. Я знаю, что могу использовать setRetainInstance в true, но это не помогает, так как AsyncTask все еще работает, когда Activity срывается!
Вторая проблема связана с загрузчиком. Если данные загружаются, и AsyncTask завершает штраф, элементы отображаются в списке. Допустим, в БД имеется 20 элементов. Когда пользователь поворачивает устройство, а фрагмент воссоздается, загрузчик необходимо снова связать. Когда это произойдет, данные сразу не загружаются в список, и вместо этого AsyncTask для загрузки запускается, потому что адаптер CWAC-Endless считает его последним элементом в списке!
Оба эти вопроса исчерпали меня. Мне нужен свежий взгляд на это, так как им нечего делать.
Любые предложения сделают, и я могу опубликовать исходный код, если это необходимо.
РЕДАКТИРОВАТЬ
Хорошо, вот несколько подробностей, чтобы помочь с некоторыми предложениями.
Я загружаю данные из Интернета, которые будут возвращать только определенное количество элементов одновременно. Затем я должен запросить больше данных, когда захочу (разбиение на страницы).
Я решил использовать базу данных, так как новая функциональность Loader позволяет сделать так, чтобы данные загружались эффективно и последовательно, без каких-либо проблем с потоками. Если было бы целесообразно отказаться от подхода Loader и использовать стандартный адаптер для визуализации данных, я более чем рад отказаться от этого подхода и использовать его. Я просто хотел посмотреть, сможет ли кто-нибудь понять, почему это решение так сложно.
Благодаря,
Адам
Когда пользователь попадает в нижнюю часть списка, используя виджет CWAC-Endless, AsyncTask запускается и загружает больше данных.
FWIW, я не пробовал EndlessAdapter
с такой комбинацией вещей (курсоры, загрузчики и AsyncTask
). В частности, цитирование документов:
Обратите внимание, что это было протестировано с помощью
ArrayAdapter
широко, но может не работать с другими типами адаптеров
Я даже не совсем EndlessAdapter
какой EndlessAdapter
использования EndlessAdapter
применим к локальной базе данных. Если у вас сумасшедший длинный список (например, тысячи строк), ответ не "загружает его постепенно", а "предоставляет другой UX, чтобы избежать длинного списка". Для более коротких списков просто загрузите все это и сделайте это. EndlessAdapter
предназначен для случаев, когда загрузка является дорогостоящей (например, доступ в Интернет).
При этом я добавлю "играть с EndlessAdapter
и Loader
" в список дел.
Я знаю, что могу использовать setRetainInstance в true, но это не помогает, так как AsyncTask все еще работает, когда Activity срывается!
Так? onPostExecute()
не будет вызываться до тех пор, пока новая активность не onCreate()
через onCreate()
. Кроме того, в модели на основе фрагментов ваша задача должна быть setRetainInstance(true)
с фрагментом, и если этот фрагмент сохраняется через setRetainInstance(true)
, он является тем же фрагментом как в старом, так и в новом действии.
Когда это произойдет, данные сразу не загружаются в список
Он должен быть загружен довольно быстро, хотя и асинхронно. Более того, я не понимаю, почему это ничем не отличается от того, когда деятельность создается в первую очередь.
и вместо этого AsyncTask для загрузки стартует, потому что адаптер CWAC-Endless считает его последним пунктом в списке
Вы не должны создавать EndlessAdapter
до EndlessAdapter
пор, пока не получите данные.