Android ViewPager при считывании на последнем экране

У меня возникли проблемы с тем, как захватить событие салфетки на последней странице пейджера просмотра.

в основном требование заключается в том, что, когда пользователь находится на последней странице, и они пытаются провести, чтобы добраться до следующей страницы, действие должно закрыться.

Я пробовал делать это onPageScrolled, но я не могу различать левый или правый свайп, когда там. Когда на последней странице пользователь должен сохранить функциональность для перехода к предыдущей страница.

таким образом, в основном дело в

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

может ли кто - нибудь предоставить какие-либо предложения? Спасибо

6 ответов


вы должны включить поддельную пустую страницу в свой ViewPager, когда пользователь проводит фактическую последнюю страницу, дело доходит до этого поддельного. Когда этот поддельный виден, закончите Activity.

вы должны попробовать этот способ, если он не работает, я могу дать вам пример кода.


вот рабочее решение!!

переменные

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

внутри 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;
    }
}

Я, вероятно, действительно опаздываю, но тогда это может помочь кому-то другому. Я получил фрагмент из вопроса о stackoverflow, где я просто немного настраиваю код.

ответ здесь.

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

надеюсь, вы получили ответ, я столкнулся с той же проблемой, и это то, что я сделал: Если вы используете viewpager и activity с расширением класса FragmentStatePagerAdapter можно использовать getItem(int position) метод для проверки, если вы достигли последней страницы. Это также, если вы объявили NUM_PAGES и вы можете использовать его, чтобы обнаружить, что пользователь достиг последней страницы.


Я также попытался найти решение. Вот рабочий код.Надеюсь, это поможет кому-то еще: -

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

я использовал счетчик как глобальную переменную.

спасибо!


Я создал абстрактный слушатель, основанный на решениях здесь. Я хотел что-то сделать, когда проводил прямо на последней странице или слева на первой странице.

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