如何使ViewPager2看起来像带有“幻灯片”页面转换器的无限循环?

亚历山大·冈伯特

我正在寻找一个无限循环以在ViewPager2中显示图片。

在图片之间以及最后一项和第一项之间,以及第一项和最后一项之间使用“幻灯片”页面转换器(我认为是默认设置)。

我发现的困难是:

  • 没有Integer.maxValue物品,
  • 在第一个元素和最后一个元素之间有一个真正的过渡,而不是一个setCurrentItem(x, false)很难看到的过渡
亚历山大·冈伯特

我找到了一个解决方案:列表中有两个假项目(第一个和最后一个元素),当我们从第二个滚动到最后一个时,我们更改为n-2个项目(->真实项目的最后一个)。但是问题是看得很糟糕。

因此,我想一种对我的情况更可靠的解决方案:复制两个倒数第二项,并将它们放在数组的开头。

  • 之前列出:[A,B,C,D,E,F]
  • 转换后的列表:[E',F',A,B,C,D,E,F]

这个想法首先是显示项目A(位置2),当我们滚动到项目F(位置n-1)时,我们强制显示项目F'(位置1)。当我们滚动到项目E'(位置0)时,我们强制显示项目E(位置n-2)

因此,无论何时位置,我们总是在左边有一个项目,在右边有一个项目,而且我们总是可以使用漂亮的页面转换器进行滚动。

限制是至少要有两个项目。但是当然我们不必只滚动一项。

Java代码:

public class MyPagerActivity extends Activity {
    private ViewPager2 pager;
    private final MyPagerAdapter adapter = new MyPagerAdapter();
    private ViewPager2.OnPageChangeCallback pageChangeCallback = new ViewPager2.OnPageChangeCallback() {
        @Override
        public void onPageSelected(final int position) {
            super.onPageSelected(position);
            currentPosition = position;
            onFocusChange();
        }

        @Override
        public void onPageScrollStateChanged(final int state) {
            super.onPageScrollStateChanged(state);
            if (state == ViewPager2.SCROLL_STATE_IDLE) {
                if (currentPosition == 0) {
                    pager.setCurrentItem(fakeSize - 2, false);
                } else if (currentPosition == fakeSize - 1) {
                    pager.setCurrentItem(1, false);
                }
            } else if (state == ViewPager2.SCROLL_STATE_DRAGGING && currentPosition == fakeSize) {
                //we scroll too fast and miss the state SCROLL_STATE_IDLE for the previous item
                pager.setCurrentItem(2, false);
            }
        }
    };


    private ArrayList<String> itemList;
    private int fakeSize;
    private int realSize;
    private int currentPosition;

    @Override
    protected void onCreate(@Nullable final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.pager = findViewById(R.id.mypager_viewpager);
        this.pager.setAdapter(this.adapter);
        this.pager.registerOnPageChangeCallback(this.pageChangeCallback);
        this.pager.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL);
        final ArrayList<String> itemList = null;//your data
        this.realSize = itemList.size();
        this.fakeSize = this.realSize + 2;
        this.itemList = transformListAndAddTwo(itemList);
        this.adapter.*updateList*(this.itemList);
        final int item = 2; //number two because we have two elements before the chosen one
        this.pager.setCurrentItem(item, false);
    }

    private void onFocusChange() {
        //Do something
    }

    /**
     * add two lasts item at beginning on the new array
     * @param itemList
     * @return
     */
    public static ArrayList<String> transformListAndAddTwo(final ArrayList<String> itemList) {
        final int size = itemList.size();
        final ArrayList<String> listTemp = new ArrayList<>(size + 2);
        for (int iPL = 0; iPL <= size + 2; iPL++) {
            listTemp.add(itemList.get((iPL + size - 2) % size));
        }
        return listTemp;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在幻灯片后面放置背景图片?(看起来像相框)

来自分类Dev

如何使EditText看起来像Android中的页面

来自分类Dev

如何使按钮看起来像标签?

来自分类Dev

如何使UITableView看起来像这样?

来自分类Dev

如何使UITableView看起来像这样?

来自分类Dev

带有 owlcarousel2 的幻灯片,为每张幻灯片设置移动

来自分类Dev

问:控制器当前2秒钟,如何使其看起来像只有一个过渡?

来自分类Dev

如何制作带有div而不是图像的幻灯片?

来自分类Dev

chrome是否可能使浏览器看起来像打印页面

来自分类Dev

验证有麻烦:即使逻辑看起来不错,也会发生无限循环

来自分类Dev

如何使tinymce编辑窗口看起来像django夹层中的网站页面?

来自分类Dev

带有Movepy的图像幻灯片

来自分类Dev

带有随机照片的幻灯片

来自分类Dev

带有随机照片的幻灯片

来自分类Dev

带有按钮的 Javascript 幻灯片

来自分类Dev

如何循环setTimeout幻灯片javascript

来自分类Dev

字符串转换看起来像python列表

来自分类Dev

如何在tumblr标题上设置无限循环幻灯片放映

来自分类Dev

无限幻灯片功能

来自分类Dev

单击该如何使看起来像链接的文本运行控制器功能?

来自分类Dev

如何使注释看起来像当前位置指示器?

来自分类Dev

单击该如何使看起来像链接的文本运行控制器功能?

来自分类Dev

如何使注释看起来像当前位置指示器?

来自分类Dev

如何阻止网站使我的计算机看起来像代理服务器

来自分类Dev

如何创建一个看起来像计时器的圆形进度条?

来自分类Dev

获取看起来像选择器的祖先元素

来自分类Dev

Vimeo 播放器看起来像音频

来自分类Dev

ViewPager setCurrentItem幻灯片

来自分类Dev

有看起来像空间的符号,但不是空间。如何删除?

Related 相关文章

  1. 1

    如何在幻灯片后面放置背景图片?(看起来像相框)

  2. 2

    如何使EditText看起来像Android中的页面

  3. 3

    如何使按钮看起来像标签?

  4. 4

    如何使UITableView看起来像这样?

  5. 5

    如何使UITableView看起来像这样?

  6. 6

    带有 owlcarousel2 的幻灯片,为每张幻灯片设置移动

  7. 7

    问:控制器当前2秒钟,如何使其看起来像只有一个过渡?

  8. 8

    如何制作带有div而不是图像的幻灯片?

  9. 9

    chrome是否可能使浏览器看起来像打印页面

  10. 10

    验证有麻烦:即使逻辑看起来不错,也会发生无限循环

  11. 11

    如何使tinymce编辑窗口看起来像django夹层中的网站页面?

  12. 12

    带有Movepy的图像幻灯片

  13. 13

    带有随机照片的幻灯片

  14. 14

    带有随机照片的幻灯片

  15. 15

    带有按钮的 Javascript 幻灯片

  16. 16

    如何循环setTimeout幻灯片javascript

  17. 17

    字符串转换看起来像python列表

  18. 18

    如何在tumblr标题上设置无限循环幻灯片放映

  19. 19

    无限幻灯片功能

  20. 20

    单击该如何使看起来像链接的文本运行控制器功能?

  21. 21

    如何使注释看起来像当前位置指示器?

  22. 22

    单击该如何使看起来像链接的文本运行控制器功能?

  23. 23

    如何使注释看起来像当前位置指示器?

  24. 24

    如何阻止网站使我的计算机看起来像代理服务器

  25. 25

    如何创建一个看起来像计时器的圆形进度条?

  26. 26

    获取看起来像选择器的祖先元素

  27. 27

    Vimeo 播放器看起来像音频

  28. 28

    ViewPager setCurrentItem幻灯片

  29. 29

    有看起来像空间的符号,但不是空间。如何删除?

热门标签

归档