【发布时间】:2016-03-29 15:44:11
【问题描述】:
我正在使用RecyclerView 并以十个批次从 API 获取对象。对于分页,我使用EndlessRecyclerOnScrollListener。
一切正常。现在剩下的就是在列表底部添加一个进度微调器,同时由 API 获取下一批对象。这是 Google Play 商店应用程序的屏幕截图,显示ProgressBar 肯定是RecyclerView:
问题是,RecyclerView 和 EndlessRecyclerOnScrollListener 都没有内置支持在获取下一批对象时在底部显示 ProgressBar。
我已经看到了以下答案:
1. Put an indeterminate ProgressBar as footer in a RecyclerView grid.
2. Adding items to Endless Scroll RecyclerView with ProgressBar at bottom.
我对这些答案不满意(都是同一个人)。这涉及在用户滚动时将null 对象插入数据集中,然后在下一批交付后将其取出。它看起来像一个 hack,它回避了可能正常工作也可能不正常工作的主要问题。它会在列表中造成一些不和谐和失真
在这里使用SwipeRefreshLayout 不是解决方案。 SwipeRefreshLayout 涉及从顶部拉取 最新 项,无论如何它不会显示进度视图。
有人可以为此提供一个好的解决方案吗?我很想知道谷歌是如何为他们自己的应用程序实现的(Gmail 应用程序也有)。有没有详细介绍过的文章?所有答案和 cmets 将不胜感激。谢谢。
其他一些参考资料:
1. Pagination with RecyclerView。 (精湛的概述......)
2. RecyclerView header and footer。 (更多相同...)
【问题讨论】:
-
好的 - 我问了你提到的问题 2,直到现在我找不到更好的解决方案来解决 Vilen 提出的问题。我还在一些包含 recyclerview 的活动中使用了他的解决方案,完全没有问题。据我所知,recyclerview 中没有对 progressBar 的内置支持,因为谷歌将它构建为没有内置花里胡哨的开发人员的香草选项,所以如果你想要花里胡哨,你需要自己将它们构建到 recyclerview .您是否有理由怀疑 Vilen 的代码并且有没有对您不起作用的情况?
-
好吧,我会更详细地解释...使用
notifyItemInserted()和notifyItemRemoved()当用户滚动会导致列表中出现一些滞后和不和谐的效果。这种方法总是会发生这种情况,尤其是当用户扔列表时。谷歌自己的应用程序也在其分页列表中显示微调器,但没有任何类型的列表项滞后或移动。我得出的结论是,他们使用了其他一些方法,这些方法不涉及在用户滚动时将null对象添加到数据集中......所以我对他们的解决方案感兴趣...... :) -
所以使用的“null”对象有点问题——我不使用它,我在对象arrayList 中添加了一个名为“viewType”的额外字段,并将其值设置为“progressBar”。在我的适配器的“getItemViewType”方法中,我检索对象的“viewType”,然后使用它来确定我应该显示哪个视图,它是普通的recyclerview 视图还是progressBar。这有助于防止空指针异常。滚动时我没有遇到任何滞后或锯齿状的影响。如果你想自己测试一下,试试我做的这个 repo:github.com/Winghin2517/ReverseLayoutRecyclerview
-
repo 是一个 reverseLayoutRecyclerview,里面有他的代码,但它是一个反向的 recyclerview,在 recyclerview 中只包含 3 个项目。您可以取消注释代码部分,如果您向上滚动以使其更具功能性,它将添加 15 个以上的项目。
-
如果您不想破解适配器,让 getItemCount 在等待下一页时返回实际大小 + 1,您可以尝试在布局中的 RecyclerView 下方添加微调器并更改其可见性相应。我使用第二种方法让微调器重叠最新的可见项目(具有半透明背景)
标签: android android-listview android-recyclerview android-5.0-lollipop android-progressbar