Android ViewPager when swiping on last screen

久未见 提交于 2019-12-20 10:37:17

问题


Im having trouble figuring out how to capture a swipe event on the last page of a view pager.

Basically the requirement is that when the user is on the last page, and they try to swipe to get to the next page, the activity should close.

I've tried doing this onPageScrolled but I cant seem to differentiate a left or right swipe when in there. When on the last page, the user should still maintain the functionality to move to the previous page.

So basically the case is

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

Can anyone provide any suggestions? Thanks


回答1:


You should include an fake blank page to your ViewPager, when user swipes your actual last page, it comes to this fake one. When this fake one is visible finish the Activity.

You should try this way, if it does not work, I can give you an example code.




回答2:


Here is working solution!!

Required variables

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

Inside onPageScrolled of ViewPager

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



回答3:


I am probably really late, but then this might help someone else down the line. I got the snippet from a question on stackoverflow, where in i am just tweaking the code a little bit.

Answer from 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:


I also tried my luck to find solution. Here is working code.Hope it will help someone else:-

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

I used counter as global variable.

Thanks!




回答6:


I created an abstract listener based on the solutions here. I wanted to do something when swiping right on the last page, or left on the first page.

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



回答7:


Hope you got an answer, i came across the same issue and this is what i did: Incase you are using a viewpager and an activity with a class extending FragmentStatePagerAdapter you can use the getItem(int position) method to check if you reached the last page. This is also if you declared the NUM_PAGES and you can use it to detect the user has reached the last page.




回答8:


in Activity:

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

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


来源:https://stackoverflow.com/questions/22674060/android-viewpager-when-swiping-on-last-screen

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!