ListFragment с загрузчиком и EndlessCursorAdapter - Кошмар - PullRequest
1 голос
/ 17 марта 2012

Я начну с того, что пытаюсь выполнить.

У меня есть ListFragment с LoaderCallbacks, связанными для получения данных из БД.Данные загружаются с помощью AsyncTask и вставляются в БД.Когда пользователь попадает в конец списка, с помощью виджета CWAC-Endless запускается AsyncTask и загружается больше данных.

Я столкнулся с несколькими проблемами здесь, и я попытался разобраться в этомв течение многих ночей, и я решил приехать сюда, чтобы попросить о помощи.

Первая проблема - configChanges.Когда пользователь поворачивает устройство, действие уничтожается, а затем воссоздает все фрагменты.Я знаю, что могу использовать setRetainInstance в true, но это не помогает, поскольку AsyncTask все еще работает, когда действие срывается!

Вторая проблема связана с загрузчиком.Если данные загружены, и AsyncTask выполняет штраф, то элементы отображаются в списке штрафов.Допустим, в БД 20 предметов.Когда пользователь поворачивает устройство, и фрагмент воссоздается, загрузчик должен быть снова связан.Когда это происходит, данные сразу не загружаются в список, и вместо этого запускается AsyncTask для загрузки, потому что адаптер CWAC-Endless считает, что это последний элемент в списке!

Оба этипроблемы исчерпали меня.Мне нужно по-новому взглянуть на это, так как я не знаю, где.

Любые предложения подойдут, и я могу опубликовать исходный код, если это необходимо.

РЕДАКТИРОВАТЬ

Хорошо, вот еще несколько подробностей, которые помогут с некоторыми предложениями.

Я загружаю данные из Интернета, которые возвращают только определенное количество элементов ввремя.Затем мне нужно запросить больше данных, когда я этого захочу (нумерация страниц).

Я решил использовать базу данных, поскольку новая функциональность Loader упрощает проверку загрузки данных.эффективно и последовательно, без каких-либо проблем с потоками.Если имеет смысл отказаться от подхода Loader и использовать стандартный адаптер для рендеринга данных, я более чем рад отказаться от этого подхода и использовать его.Я просто хотел посмотреть, сможет ли кто-нибудь понять, почему это решение так сложно.

Спасибо,

Адам

1 Ответ

1 голос
/ 17 марта 2012

Когда пользователь попадает в конец списка, с помощью виджета CWAC-Endless запускается AsyncTask и загружается больше данных.

FWIW, я не пробовал EndlessAdapter с этой комбинацией вещей (курсоры, загрузчики и AsyncTask). В частности, цитируя документы:

Обратите внимание, что это было тщательно протестировано с ArrayAdapter, но может не работать с другими типами адаптеров

Я даже не совсем уверен, какой вариант использования был бы для EndlessAdapter, примененного к локальной базе данных. Если у вас есть сумасшедший длинный список (например, тысячи строк), ответ не «загружать его постепенно», а «предоставить другой UX, чтобы избежать длинного списка». Для более коротких списков, просто загрузите все это и покончите с этим. EndlessAdapter - для случаев, когда загрузка дорогая (например, доступ в Интернет).

При этом я добавлю "play with EndlessAdapter и Loader" в свой список дел.

Я знаю, что могу использовать setRetainInstance в true, но это не помогает, так как AsyncTask все еще выполняется, когда действие прекращается!

Так? onPostExecute() не будет вызываться до тех пор, пока новое действие не достигнет onCreate(). Более того, в модели на основе фрагментов ваша задача должна общаться с фрагментом, и если этот фрагмент сохраняется с помощью setRetainInstance(true), это один и тот же экземпляр фрагмента как в старом, так и в новом действии.

Когда это происходит, данные сразу не загружаются в список

Он должен загружаться довольно быстро, хотя и асинхронно. Более того, я не понимаю, почему это отличается от того, когда деятельность создается в первую очередь.

и вместо этого запускается AsyncTask для загрузки, потому что адаптер CWAC-Endless считает его последним элементом в списке

Вы не должны создавать EndlessAdapter до тех пор, пока у вас не появятся данные.

...