【问题标题】:Android ViewPager when swiping on last screen在最后一个屏幕上滑动时的Android ViewPager
【发布时间】:2014-03-26 22:07:59
【问题描述】:

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

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

我已经尝试在 onPageScrolled 上执行此操作,但在那里我似乎无法区分向左或向右滑动。在最后一页时,用户仍应保持移动到上一页的功能。

所以基本上是这样的

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

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

【问题讨论】:

    标签: android android-viewpager


    【解决方案1】:

    这是可行的解决方案!

    必需的变量

    ....
    private boolean isLastPageSwiped;
    private int counterPageScroll;
    ....
    

    ViewPager

    onPageScrolled
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        //Here 6 is last position 
        if (position == 6 && positionOffset == 0 && !isLastPageSwiped){
            if(counterPageScroll != 0){
                isLastPageSwiped=true;
                //Next Activity here
            }
            counterPageScroll++;
        }else{
            counterPageScroll=0;
        }
    }
    

    【讨论】:

    • :完美解决方案。
    【解决方案2】:

    您应该在您的ViewPager 中包含一个虚假的空白页,当用户滑动您的实际最后一页时,就会出现这个虚假的空白页。当这个假货可见时,完成Activity

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

    【讨论】:

    • 不是我正在寻找的那种解决方案,但我会给你打勾,因为没有其他人提供任何东西。
    • 如果您进一步解释,我可以编辑答案。你为什么不喜欢它?它简单有效。
    • 如果您使用任何类型的寻呼机指示器,它会显示为额外项目。此外,如果您在视图分页器中重写 onDraw 以显示视差图像,它会丢弃图像滚动的百分比。
    • 你可以给指标一个-1的假计数并自己处理onPageChange来改变指标。我确定在第一页的 onDraw 函数中可以忽略它。
    • 嘿,这个想法很棒,但我需要一点帮助,如果我有指标,可以删除最后一个指标吗?
    【解决方案3】:

    我可能真的迟到了,但这可能会帮助其他人。我从 stackoverflow 上的一个问题中得到了 sn-p,我只是稍微调整一下代码。

    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;
            }
        }
    };
    

    【讨论】:

    • 这是正确的,但是当我回到上一个索引时,它也会转到下一个活动。
    【解决方案4】:
    int lastPosition;
    int currentPosition;
    
    
    //View pager assign 
    ViewPager viewPager = findViewById(R.id.viewPager);
    //PageIndicatorView external https://github.com/romandanylyk
    PageIndicatorView pageIndicatorView = findViewById(R.id.pageIndicatorView);
    
    
    //customise pageIndicatorView design
    pageIndicatorView.setAnimationType(AnimationType.THIN_WORM);
    pageIndicatorView.setViewPager(viewPager);
    
    
    //BannerAdapter is an custom adapter for viewpage i made.
    //assign data here
    BannerAdapter pagerAdapter = new BannerAdapter(this, banner, new OnClickListener() {
                @Override
                public void onClick() {
    
                }
            });
    viewPager.setAdapter(pagerAdapter);
    
    //listener for View Pager
    //this is where process of making the infinite loop
    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                //assign position so that can be manipulated
                currentPosition = position;
            }
            @Override
            public void onPageSelected(int position) {
                //set pager indicator position here 
                pageIndicatorView.setSelection(position);
            }
            @Override
            public void onPageScrollStateChanged(int state) {
                //check state 0 mean no ongoing process
                if(state == 0){
                    //check currentPosition == lastPosition to detect that scroll cant scroll anymore
                    if(currentPosition == lastPosition){
                        int lastitem = banner.size() - 1;
                        //check position if either last item/first item
                        //and set viewpager current page as follow
                        if(currentPosition == lastitem){
                            viewPager.setCurrentItem(0);
                        }else if(currentPosition == 0){
                            viewPager.setCurrentItem(lastitem);
                        }
                    }else{
                        lastPosition = currentPosition;
                    }
                    Log.d("ScrollState", "currentPosition: " + currentPosition);
                }
                /*empty*/
            }
        });
    

    【讨论】:

      【解决方案5】:

      我也尝试了我的运气来找到解决方案。这是工作代码。希望对其他人有所帮助:-

      pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                  @Override
                  public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
      
                  }
      
                  @Override
                  public void onPageSelected(int position) {
      
      
                  }
      
                  @Override
                  public void onPageScrollStateChanged(int state) {
      
                      if (state == ViewPager.SCROLL_STATE_IDLE) {
                          int curr = pager.getCurrentItem();
                          int lastReal = pager.getAdapter().getCount() - 1;
      
                          if (curr < lastReal) {
                              counter = 0;
                          } else if (curr == lastReal) {
                              counter++;
      
                              if (counter == 2) {
      
                                  pager.setOffscreenPageLimit(0);
                                  pager.setCurrentItem(0, false);
                                  counter = 0;
                              }
      
      
                          }
                      }
      
                  }
              });
      
              pagerIndicator.setViewPager(pager);
      

      我使用计数器作为全局变量。

      谢谢!

      【讨论】:

        【解决方案6】:

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

        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;
            }
        }
        

        【讨论】:

        • 那么,如何在我的 viewPager 中使用它?
        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          在活动中:

          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);
          

          【讨论】:

            【解决方案9】:

            我也有这些(在 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
                    }
                }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-04-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多