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