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 до тех пор, пока у вас есть данные.

Другие вопросы по тегам