Viewpager检测第一个和最后一个位置

时间:2018-02-14 08:33:36

标签: android android-layout android-viewpager

我有一个左右箭头viewpager。我希望在ViewPager的第一个位置时隐藏左箭头,并在ViewPager的最后位置可见时隐藏右箭头。

我已经提到了这个解决方案:How to get position of first and last position of viewpager?

在我的视图寻呼机中,我一次有3个可见页面。为此,我使用了getPageWidth到0.33f

enter image description here

但它对我没有预期的效果。

我的代码:

vpPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override
                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

                }

                @Override
                public void onPageSelected(int position) {

                    if (position == (vpPager.getAdapter().getCount())-1) {
                        right.setVisibility(View.INVISIBLE);
                    } else {
                        right.setVisibility(View.VISIBLE);
                    }

                    if (position == 0) {
                        left.setVisibility(View.INVISIBLE);
                    } else {
                        left.setVisibility(View.VISIBLE);
                    }
                }

                @Override
                public void onPageScrollStateChanged(int state) {

                }
            });

在XML中,我已经为两个箭头设置了可见性。

任何帮助都将是值得赞赏的。谢谢!

4 个答案:

答案 0 :(得分:2)

以下解决方案与我合作正常。

为了知道最后的位置:

对于你的情况,你不能从onPageSelected(int position)获得最后一个位置'6'。如果您的位置 totalNumberofPages - numberOfVisiblePagesAtATime ,则屏幕上已显示最后一页。 例如,7-3 = 4(如果你得到位置4,则表示最后一页位置6已经在屏幕上。)

为了知道第一个位置:

您无法登记onPageChangeListener()。因为这不会在第一次启动时调用。 在viewPager设置后,您需要隐藏左箭头。然后在onPageChangeListener来电,再次见到。

答案 1 :(得分:2)

为了使其有效,我会使用onPageScrolled而不是onPageSelected,因为在ViewPager初始化之后不会立即调用后者,并且可以保持按钮可见xml文件。它看起来像这样:

mViewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        super.onPageScrolled(position, positionOffset, positionOffsetPixels);
        if (position == 0) {
            left.setVisibility(View.INVISIBLE);
        } else {
            left.setVisibility(View.VISIBLE);
        }
        if (position == adapter.getCount() - 1) {
            right.setVisibility(View.INVISIBLE);
        } else {
            right.setVisibility(View.VISIBLE);
        }
    }
});

下一个和上一个按钮设置为这样:

left.setOnClickListener((v) -> mViewPager.setCurrentItem(mViewPager.getCurrentItem() - 1, true));
right.setOnClickListener((v) -> mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1, true));

此外,使用onPageScrolled您可以为按钮创建一个漂亮的淡入/淡出动画,以阻止它们突然出现在屏幕上。

答案 2 :(得分:1)

要查找ViewPager的当前页面,请使用ViewPager.getCurrentItem()

这是一个代码示例

mViewPager.addOnPageChangeListener(new CustomViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {

            int currentItem = vpPager.getCurrentItem();

            if (currentItem == (vpPager.getAdapter().getCount()-1)) {
                right.setVisibility(View.INVISIBLE);
            } else {
                right.setVisibility(View.VISIBLE);
            }

            if (currentItem == 0) {
                left.setVisibility(View.INVISIBLE);
            } else {
                left.setVisibility(View.VISIBLE);
            }
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

答案 3 :(得分:1)

private int myImagePosition = -1; // class level variable with default value -1.
  

在用户点击下一个或上一个时设置imageView的可见性   的按钮。

        myImageViewViewPagerPrevious.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (myImagePosition > 0) {
                   myImagePosition = myImagePosition - 3;
                    setNextPreviousArrowVisibility();
                }
                myViewPagerPlanDetailBroucher.setCurrentItem(myImagePosition);
            }
        });

        myImageViewViewPagerNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (myImagePosition < myBroucherDataArrayList.size() - 1) {
                    myImagePosition = myImagePosition + 3;
                    setNextPreviousArrowVisibility();
                }
                myViewPagerPlanDetailBroucher.setCurrentItem(myImagePosition);
            }
        });

        private void setNextPreviousArrowVisibility() {
        if (myImagePosition > 3) {
            myImageViewViewPagerPrevious.setVisibility(View.VISIBLE);
        } else {
            myImageViewViewPagerPrevious.setVisibility(View.INVISIBLE);
        }

        if (myImagePosition > -1 && myImagePosition < myArrayList.size() - 1) {
            myImageViewViewPagerNext.setVisibility(View.VISIBLE);
        } else {
            myImageViewViewPagerNext.setVisibility(View.INVISIBLE);
        }
    }