Отображение результатов нескольких асинхронных задач в одном списке - PullRequest
0 голосов
/ 29 августа 2018

Оригинальный экран

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

Данные получают с сервера, используя асинхронную задачу, с разбивкой по страницам. По мере прокрутки пользователь получает больше данных с сервера, используя асинхронную задачу для добавления в список. (я получаю предметы с 1 по 20, когда пользователь прокручивает вниз, получаю предметы с 21 по 40).

Например: при выборе «Bucket 1» в списке отображаются все элементы в «Bucket 1», затем при выборе «Bucket 2» список изменяется для отображения всех элементов в «Bucket 2». Мы никогда не знаем, сколько предметов в каждом ведре, количество может варьироваться.

enter image description here

Новый требуемый экран

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

Вместо этого я хочу иметь один список, который содержит все элементы из все корзины (см. Изображение ниже). Я хочу отобразить все элементы из корзины 1, затем все элементы из корзины 2 и так далее.

Примечание: я могу или не могу хотеть разделительные строки, показывающие название корзины,

Проблема, с которой я столкнулся, заключается в том, что сервер позволяет мне получать предметы только по одному ведру за раз, поэтому мне придется звонить, чтобы получить предметы из ведра 1, а затем пользователь прокручивает, если у меня заканчиваются предметы из ведро 1 получить предметы из ведра 2 и т. д.

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

enter image description here

Помощь

Как мне закодировать такой список? Список содержит данные, поступающие от НЕСКОЛЬКИХ РАЗНЫХ асинхронных вызовов.

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

Я видел, что есть "MergeCursor", но это не поможет мне, поскольку я не получаю данные из базы данных.

Я видел, что есть "MergeAdapter", который является одним адаптером, который содержит дочерние адаптеры. В моем случае у меня был бы 1 дочерний адаптер для каждого ведра. Мой счетчик MergeAdapter будет общим количеством всех дочерних элементов, и затем при получении представления / элементов для каждой строки мне придется использовать положение и размер каждого сегмента, чтобы узнать, из какого сегмента получить элемент.

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

1 Ответ

0 голосов
/ 17 декабря 2018

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

Пример

Ведро 1: 5 предметов (A, B, C, D, E) Ведро 2: 3 предмета (F, G, H) Ведро 3: 10 предметов (I, J, K, L, M, N, O, P, R, S)

Адаптер запрашивает пункты 1 - 4:

  • SyncTask возвращает предметы 1 - 4 из корзины 1
  • Всего возвращено = A, B, C, D

Адаптер запрашивает пункты 5 - 8:

  • SyncTask сначала определяет наличие 5 или более элементов в корзине 1, а также получает 5-й элемент из корзины 1, E

  • В SyncTask есть только 1 предмет, когда у него запросили 4 предмета, а в корзине 1 закончились предметы. Поэтому SyncTask ищет в Bucket 2. Количество корректируется для удаления количества элементов в Bucket 1, поэтому новый счет запрашивает 1 - 3 в Bucket 2, которые возвращаются, F, G, H

  • Всего возвращено = E, F, G, H

Адаптер запрашивает предметы 9-12

  • AsyncTask проверяет, больше ли начальное число, чем число в первом сегменте, поэтому AsyncTask создает новый счет, вычитая общее количество из Bucket 1

  • Итак, мы ищем 4 - 7

  • Затем AsyncTask проверяет, больше ли начальное число, чем число во втором сегменте, поэтому AsyncTask создает новый счет, вычитая общее количество из корзины 2 из обновленного счетчика

  • Итак, мы ищем 1 - 4

  • Ведро 3 содержит 4 или более элементов, поэтому мы возвращаем первые 4 элемента

  • Всего возвращено = I, J, K, L

...