RecyclerView 可以实现双向无限滚动

3
我想实现一个永远不会结束的RecyclerView。在第一个项目之前是最后一个项目,在滚动到最后一个项目后,将显示第一个项目。 我该如何做到这一点? 我的目标是一个音乐播放器,它显示当前歌曲、前一首歌曲和后一首歌曲。 像这样: enter image description here (附注:是否有比使用RecyclerView更好的方法?)

你尝试过一些东西吗?我们能看到(代码)以更好地理解你想要的吗? - Crammeur
1
@crammeur 谢谢你的回答,但我刚刚意识到如何解决这个问题!我只需要实现一个双向链表并在recyclerview适配器中使用它即可!我忘记了我不必总是在适配器中使用ArrayList类!我正在编写自定义列表类,完成后我会发布它 :) - MH. Abdi
2个回答

6

我曾经见过的做法是将要显示的项目数定义为Integer.MAX_VALUE。在适配器的onBindViewHolder()方法中,你会有如下代码:

@Override
public int getItemCount() {
    return (mItems == null) ? 0 : Integer.MAX_VALUE;
}

现在你不可能真的有Integer.MAX_VALUE个项目要显示,所以这是对RecyclerView的小谎言。在你的代码中,像这样将索引值从0...Integer.MAX_VALUE-1映射到0...your_item_count-1,在onBindViewHolder()中实现:

int realPos = position % mItems.size();

使用realPos代替RecyclerView传递的位置。

现在唯一需要做的就是将RecyclerView滚动到范围的中间:

mRecycler.scrollToPosition(Integer.MAX_VALUE / 2);

这个可以正常工作,但是它完美吗?不是,但足够接近;我认为没有人会滚动到看到缺陷。在极端情况下,它将停止换行。


是的,我认为它有效!但最好使用mRecycler.scrollToPosition((Integer.MAX_VALUE / 2)-(Integer.MAX_VALUE / 2)% mItems.size());来滚动到第一个项目。顺便说一句,这种方式会因为所有大数字而导致性能问题吗? - MH. Abdi
2
@Apptic 我只是随机定位。至于性能问题,你并没有维护那么大的数组,而且 RecyclerView 只维护一个小的视图持有者池,因此,我认为不会有性能损失。 - Cheticamp

0

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