如何在Android RecyclerView中循环浏览项目?

4
如何在Android RecyclerView中循环遍历项目?
我想要一个可以横向滚动的RecyclerView。当滚动到右侧末尾时,它会通过重新开始显示项目列表来继续滚动。当滚动到左侧末尾时也是同样的操作。
例如:
项目列表: 0,1,2,3,4,5,6,7,8,9
起始视图显示: 0,1,2,3,4,5,6,7
向右滚动5个项目后: 5,6,7,8,9,0,1,2
向左滚动2个项目后: 8,9,0,1,2,3,4,5

像往常一样扩展RecyclerView,覆盖必要的方法以检索下一个/上一个元素,并在达到极限时将索引更新为零/最大值。 - Jordi Castilla
2个回答

11
另一个想法是,让您的适配器的getItemCount()返回Integer.MAX_VALUE,然后为了获取您的项目,您将调用itemsList.get(position % list.size)
这样,当滚动超出实际列表大小时,它会从0重新开始,并在最后一个元素之后显示列表的第一个元素。

另一件事是,在LayoutManager上调用scrollToPosition(int x),其中x%yourList.size()==0,x接近Integer.MAX_VALUE/2,这样滚动将看起来像是无限(从起始点向每个方向有大约10亿个位置)。
正如评论中指出的,如果列表大小为0,则getItemCount应返回0。例如:
return list.size == 0 ? 0 : Integer.MAX_VALUE

我认为如果我们将其向右滚动,它会完美地工作,但是当我们将其向左滚动时,如何计算呢? - Linh
我描述的方式将从0索引开始,因此您无法向左滚动。您可以做的一件事是在LayoutManager上调用scrollToPosition(int x),其中 x%yourList.size()== 0 而x接近 Integer.MAX_VALUE/2。通过这种方式,滚动会看起来像无限的(从起始点向每个方向大约有10亿个位置)。 - lelloman
这正是我在寻找的,而且它完美地运行。谢谢! - studersi
我确保代码跟您的一样,但在"itemsList.get(position % list.size)"这行会出现除零错误。如果将getItemCount改成返回Integer.MAX_VALUE,list.size()似乎总是返回0。 - Erfan
我修改了getItemCount()方法,将其改为list.size()*10000。这样可以避免在使用Integer.MAX_VALUE时,list.size()返回0的问题。无论如何,你得到了我的赞成票 ;) - Erfan
显示剩余2条评论

-3

我有一个这样的想法
首先创建一个新列表 = 原始列表的3倍

original list: 0,1,2,3,4,5,6,7,8,9
new list     : 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9

首次显示 RecyclerView 时,您应该将 RecyclerView 向右滚动 10 项(10 是原始列表的大小)。然后,如果用户向左或向右滚动少于 10 项,则它将像一个循环一样工作。

并且当他们到达右侧或左侧的末尾时,您应该将 RecyclerView 滚动回到您首次显示 RecyclerView 的状态。如果我理解有误,请纠正我。谢谢帮助。


谢谢您的建议,但我会选择@lelloman建议的那个。它不需要存储太多数据。 - studersi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接