在最后一个屏幕上滑动时的Android ViewPager

时间:2014-03-26 22:07:59

标签: android android-viewpager

我无法弄清楚如何在视图寻呼机的最后一页捕捉滑动事件。

基本上要求是当用户在最后一页上,并且他们尝试滑动以进入下一页时,活动应该关闭。

我已尝试在PageScrolled上执行此操作,但我似乎无法在此处区分左或右滑动。在最后一页上,用户仍应保留移至上一页的功能。

所以基本上就是

When on last page
    if swipe prev (do normal behaviour)
    if swipe next (finish activity)

任何人都可以提供任何建议吗? 感谢

9 个答案:

答案 0 :(得分:14)

这是工作解决方案!!

必填变量

add or addAll

ViewPager的 onPageScrolled

remove, removeAll, retainAll, and clear operations.

答案 1 :(得分:10)

你应该在你的ViewPager中添加一个虚假的空白页面,当用户滑动你的实际最后一页时,它会出现在这个假页面上。当这个假的可见时完成Activity

你应该尝试这种方式,如果它不起作用,我可以给你一个示例代码。

答案 2 :(得分:8)

我可能已经很晚了,但这可能有助于其他人下线。我从stackoverflow上的一个问题得到了片段,我只是稍微调整了一下代码。

来自here的答案。

ViewPager.OnPageChangeListener pagerListener = new ViewPager.OnPageChangeListener() {
    boolean lastPageChange = false;

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels){
        int lastIdx = mPgScreenAdapter.getCount() - 1;

        Log.d(TAG, "pos:" + position);
        if(lastPageChange && position == lastIdx) {}

    }
    @Override
    public void onPageSelected( int i) {
        pgText.setCurrentItem(i/2);
    }
    @Override
    public void onPageScrollStateChanged(int state) {
        int lastIdx = mPgScreenAdapter.getCount() - 1;

        int curItem = pgScreen.getCurrentItem();
        if(curItem==lastIdx  && state==1){
            lastPageChange = true;

            // i put this here since onPageScroll gets called a couple of times.
            finish();
        }else  { 
            lastPageChange = false;
        }
    }
};

答案 3 :(得分:0)

希望你得到答案,我遇到了同样的问题,这就是我所做的: 如果您正在使用viewpager和扩展名为FragmentStatePagerAdapter的类的活动,则可以使用getItem(int position)方法检查是否到达了最后一页。如果您声明了NUM_PAGES,也可以使用它来检测用户是否已到达最后一页。

答案 4 :(得分:0)

我也试着找到解决方案。这是工作代码。希望它能帮助别人: -

private function validatePossibleConbinations($combinations)
  {
      $error = true;

      foreach($combinations as $set_id => $comb)
      {
          $nextArray = ++$set_id;

          foreach($comb as $key => $selections)
          {
              if(isset($combinations[$nextArray])){

                  foreach($combinations[$nextArray] as $nextComb){

                      if($comb[$key] === $nextComb){

                        $error = false;

                      }

                  }

              }

          }

      }
      return $error;
  }

我使用counter作为全局变量。

谢谢!

答案 5 :(得分:0)

我根据此处的解决方案创建了一个抽象侦听器。我想在最后一页上向右滑动或在第一页上向左滑动时做一些事情。

import android.support.v4.view.ViewPager;

abstract class PageChangeToUnavailablePageListener implements ViewPager.OnPageChangeListener {
    private int finalPageIndex;
    private boolean finalPageVisible = false;
    private boolean firstPageVisible = true;
    private int lastScrollState = 0;

    abstract void onUnavailablePageChangeOnLastPage();
    abstract void onUnavailablePageChangeOnFirstPage();

    public PageChangeToUnavailablePageListener(int finalPageIndex) {
        this.finalPageIndex = finalPageIndex;
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    }

    @Override
    public void onPageSelected(int i) {
        firstPageVisible = (i == 0);
        finalPageVisible = (i == finalPageIndex);
    }

    @Override
    public void onPageScrollStateChanged(int state) {
        // The normal state sequence for changing pages is
        // DRAGGING (user starts drag), SETTLING (next page is chosen), IDLE (animation is complete).
        // No next page is chosen when dragging right on last page, or left on first page.
        // In this case the SETTLING state is missing and the sequence is (DRAGGING, IDLE).
        if (lastScrollState == ViewPager.SCROLL_STATE_DRAGGING && state == ViewPager.SCROLL_STATE_IDLE) {
            // The user scrolled to an unavailable page.
            if (finalPageVisible) {
                onUnavailablePageChangeOnLastPage();
            } else if (firstPageVisible) {
                onUnavailablePageChangeOnFirstPage();
            }
        }
        lastScrollState = state;
    }
}

答案 6 :(得分:0)

活动中:

private static int MAX_LAYOUTS = 3;
private boolean isLastPageSwiped;
private int counterPageScroll;

在onCreate中:

ViewPager.OnPageChangeListener viewPagerPageChangeListener = new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
            }

            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                if (position == MAX_LAYOUTS - 1 && positionOffset == 0 && !isLastPageSwiped) {
                    if (counterPageScroll != 0) {
                        isLastPageSwiped = true;

                        Intent intent = new Intent(OldActivity.this, NewActivity.class);
                        startActivity(intent);
                    }
                    counterPageScroll++;
                } else {
                    counterPageScroll = 0;
                }
            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
            }
        };
        viewPager.addOnPageChangeListener(viewPagerPageChangeListener);

答案 7 :(得分:0)

charlist

答案 8 :(得分:0)

我也有解决方案(在 kotlin 中),

例如我的 tabview 有 3 页。

......

private var isLastPageSwiped = false
private var indexPageScroll = 0

......

    override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
        super.onPageScrolled(position, positionOffset, positionOffsetPixels)
        if (position == 2 && positionOffset == 0f && !isLastPageSwiped) {
            if (indexPageScroll != 0) {
                isLastPageSwiped = true
                //Next Activity here
                //You can perform your action on last page scroll.
            }
            indexPageScroll++
        } else {
            indexPageScroll = 0
        }
    }