【问题标题】:How to use RecyclerView according to device screensize?如何根据设备屏幕大小使用 RecyclerView?
【发布时间】:2015-10-26 12:34:16
【问题描述】:

我有一个后端 API 端点,它在某些集合中返回 JSON。每组包含10 lines of Json

例如: curl http://www.something.com?getData=0 将提供 first 10 elementscurl http://www.something.com?getData=1 将返回下一组,依此类推。

我正在使用RecyclerViewStaggeredGridView 从给定的endpoints 加载数据。现在我只取第一组,它工作得很好。

我在寻找什么?

如何根据Android 中的屏幕尺寸在RecyclerView 中加载数据。例如:

假设设备hdpi 可以在RecyclerView 中加载25 个staggeredGridView。所以,这里是endpoints的请求顺序:

http://www.something.com?getData=0    // will fetch 0-10
http://www.something.com?getData=10   // will fetch 11-20
http://www.something.com?getData=10&skip=5 // will fetch 21-25

我怎样才能动态地进行上述过程。这样它就适用于所有屏幕尺寸?

顺便说一句,这就是我将数据加载到 StaggeredGridView 适配器的方式:

 mRecyclerView = (RecyclerView) mActivity.findViewById(R.id.staggering_grid);
 mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
 mAdapter = new StaggeredGridAdapter(mContext);
 mAdapter.addItems(response);
 mRecyclerView.setAdapter(mAdapter);

可能的解决方案

  • 如果我知道我需要根据设备填写多少Grid,那么我可以简单地提出请求,直到我得到数据以填写预期的数字。
  • 我还可以使用Event BusRetrofit 发送通知,以便在设备屏幕填满之前再次拨打电话。

这是好方法吗?如果是,那么我该如何实现呢?

【问题讨论】:

  • 是否可以选择始终获取尽可能多的项目来填满最大的屏幕?就像如果 xxxhpdi 需要 50 个项目来填满屏幕,总是分批获取 50 个?较小的屏幕需要较少地获取数据,而较大的屏幕将有足够的项目来填充视图。
  • 不,这不可能。端点将始终一次返回 10 个项目。
  • @TimCastelijns 但是如果我按顺序向 xxxhdpi 发出 5 个请求并一次加载数据呢?
  • 很难看出您的问题与 android-layout、android-activity 或 android-recyclerview 有何关系。您是否在询问如何确定在给定特定布局/布局管理器和设备配置的情况下屏幕上可以容纳多少项目?
  • @ataulm 我试图解释它 :) 是的,你说得对,我只是想知道我需要获取多少物品才能让什么设备适合屏幕。我没有布局,它只是一个带有StaggeredGridView 适配器的RecyclerView

标签: android android-layout android-activity android-recyclerview android-screen-support


【解决方案1】:

您可以做的是一次加载超过 50 个而不是 10 个的数据,这样您就有足够的数据来填充整个显示,如果您的 api 只允许您每次请求获取 10 个项目,那么您会触发多个请求来自不同的线程并将它们添加到您的适配器,并在所有请求成功完成后刷新视图。所以这样你就不需要请求所有的项目并且有足够的项目在任何设备屏幕设置中显示

【讨论】:

  • 我有点困惑:假设我有两个设备xhdpixxxhdpi。在xxxhdpi 中,我们可以在一个显示中加载 50 个项目(无需滚动)。根据您的解决方案,我将通过顺序发出 5 个请求来获取前 50 个项目(我可以这样做,因为它不会耗费太多时间),如果用户尝试向下滚动,那么我将获取接下来的 50 个项目。但让我们为xhdpi 假设一次只能显示 15 或 18 个项目(只是猜测)。我如何知道我需要为哪些设备获取多少项目,并且每次滚动我需要完全相同数量的项目
  • 不,当您在单独的线程中触发所有请求时,理想情况下您希望它们异步并行发生,一旦达到 5 个成功响应,您就会为成功响应保留一个计数器,您使用新数据刷新您的视图并重置计数器。并且一旦适配器达到显示 itemposition % 50-5 或您刚开始请求接下来的 50 个项目的内容,设备的屏幕尺寸无关紧要,您还可以像大多数服务器端分页列表视图一样显示不确定的进度对话框/跨度>
  • 最后,我将使用您的解决方案,在每次调用中获取 50 个项目。您能否建议我或给我任何教程链接如何启用加载更多功能?
  • 您可以使用 http 库,例如 okhttp 或 ion 等,它们会在自己的线程中处理网络请求。使用 http 库非常简单
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多