我曾经见过的做法是将要显示的项目数定义为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. AbdiRecyclerView
只维护一个小的视图持有者池,因此,我认为不会有性能损失。 - Cheticamp