Android 在单个列表中显示多个异步任务的结果

Android 在单个列表中显示多个异步任务的结果,android,list,datasource,Android,List,Datasource,原始屏幕 我有一个屏幕,顶部有一个微调器,当用户从微调器中选择一个值时,我们会在下面的列表中显示该选择的项目 数据是以分页方式使用异步任务从服务器获取的,当用户滚动时,将使用异步任务从服务器获取更多数据以添加到列表中。(即获取项目1至20,当用户向下滚动时,获取项目21至40) 例如:当您选择“Bucket 1”时,列表显示“Bucket 1”中的所有项目,然后当您选择“Bucket 2”时,列表更改为显示“Bucket 2”中的所有项目。我们永远不知道每个桶里有多少东西,数字可能会有所不同

原始屏幕

我有一个屏幕,顶部有一个微调器,当用户从微调器中选择一个值时,我们会在下面的列表中显示该选择的项目

数据是以分页方式使用异步任务从服务器获取的,当用户滚动时,将使用异步任务从服务器获取更多数据以添加到列表中。(即获取项目1至20,当用户向下滚动时,获取项目21至40)

例如:当您选择“Bucket 1”时,列表显示“Bucket 1”中的所有项目,然后当您选择“Bucket 2”时,列表更改为显示“Bucket 2”中的所有项目。我们永远不知道每个桶里有多少东西,数字可能会有所不同

新的所需屏幕

我需要更改此屏幕,以便不再使用微调器

相反,我希望有一个列表,其中包含所有存储桶中的项目(见下图)。我想显示bucket 1中的所有项目,然后显示bucket 2中的所有项目,依此类推

注意:我可能想要也可能不想要显示bucket名称的分隔行

我的问题是,服务器一次只允许我获取一个bucket的项目,因此我必须调用从bucket 1获取项目,然后当用户滚动时,如果我从bucket 1中用完了项目,则从bucket 2获取项目,依此类推

我需要将所有项目都放在一个列表中,这样我就可以跨存储桶选择多个项目

帮助

如何编写这样的列表?该列表包含来自多个不同异步调用的数据

我想我必须从打电话开始计算所有存储桶中总共有多少项,这就是我的列表计数

我看到有一个“MergeCursor”,但这对我没有帮助,因为我没有从数据库中获取数据

我看到有一个“MergeAdapter”,它是一个包含子适配器的适配器。在我的例子中,每个bucket都有一个子适配器。我的MergeAdapter count是所有子项的总计数,然后在获取每行的视图/项时,我必须使用每个bucket的位置和大小来知道从哪个bucket获取项


如果有任何建议,我们将不胜感激。

我在从服务器获取项目的异步任务中解决了这个问题。适配器向任务传递它需要数据的行。然后,任务找出bucket 1是否有这些项,如果有,则返回,如果没有所有项,则从适配器计数中删除第一个bucket的大小,并检查第二个bucket,依此类推,直到返回所有项

范例

桶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:

  • 从Bucket 1同步任务返回项目1-4
  • 返回的总数=A、B、C、D
适配器要求提供项目5-8:

  • SyncTask首先查看bucket 1是否有5个或5个以上的项目,它从bucket 1中获取第5个项目,即E

  • 当SyncTask被要求提供4个项目时,它只有1个项目,而bucket 1的项目已用完。因此,SyncTask在Bucket 2中查找。调整计数以删除bucket 1中的项目数,因此新计数要求bucket 2中的1-3,返回F、G、H

  • 返回的总数=E、F、G、H

适配器要求提供项目9-12

  • AsyncTask检查起始数字是否大于第一个存储桶中的数字,因此AsyncTask通过从存储桶1中提取总数来创建新计数

  • 所以我们要找的是4-7

  • 然后,AsyncTask检查起始数字是否大于第二个存储桶中的数字,因此AsyncTask通过从存储桶2中提取更新计数的总数来创建新计数

  • 所以我们在寻找1-4

  • Bucket 3有4个或更多项目,因此我们返回前4个项目

  • 返回的总数=I,J,K,L


请使用RecyclerView而不是ListView,使用RxJava而不是async tasks-这样您就可以在那里使用zip方法。每个存储桶中的数据是否都是相同的类型?Szymon Chaber-是的,我可能使用RecyclerView而不是ListView-这是我在标题中的错误,很抱歉误导GrabarZ121-是的,存储桶中的所有数据都是相同类型的Szymon Chaber-不幸的是,我不确定是否可以使用第三方库。不过我会看看这个,看看这是否对我有帮助,谢谢