Как узнать номер текущей страницы ViewPager для Android?

84

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

Я использовал viewPager.setCurrentItem(1);для настройки первого пункта.

Есть ли аналогичный способ получения текущей страницы?

sam_k
источник

Ответы:

180

в последних пакетах вы также можете использовать

vp.getCurrentItem()

или же

vp - это viewPager,

pageListener = new PageListener();
vp.setOnPageChangeListener(pageListener);

вам нужно установить прослушиватель смены страницы для вашего viewPager. В viewPager нет метода для получения текущей страницы.

private int currentPage;

    private static class PageListener extends SimpleOnPageChangeListener{
            public void onPageSelected(int position) {
                Log.i(TAG, "page selected " + position);
                   currentPage = position;
        }
    }
Яшвант Кумар
источник
Большое спасибо, чувак .. это работает .. Вы работали раньше над ViewPager?
sam_k
@Necronet нет, не должно. Класс PageListener должен быть внутренним, а не вложенным классом.
dcow
Иногда я получал исключение нулевого указателя в начале изображений пейджера, для более надежных решений я предлагаю это, он отлично работает для меня. stackoverflow.com/a/13831450/2296787
MBH
setOnPageChangeListener()устарело, используйте addOnPageChangeListener()вместо него.
ZzZombo
47

Существует метод, object_of_ViewPager.getCurrentItem()который возвращает позицию просматриваемой в данный момент страницы пейджера просмотра.

Кришна Шрестха
источник
На самом деле я сначала опубликовал этот ответ @ChuckBoris, но он, похоже, набрал больше голосов и, по-видимому, одобрил.
Странны
17

Если вам нужна только позиция, вам vp.getCurrentItem()ее предоставят, не нужно применять onPageChangeListener () только для этой цели.

devanshu_kaushik
источник
8

Вы поймете, что setOnPageChangeListener устарел, используйте addOnPageChangeListener, как показано ниже:

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

    }

    @Override
    public void onPageSelected(int position) {
       if(position == 1){  // if you want the second page, for example
           //Your code here
       }
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
});
Джеральдо Нето
источник
7

Для этой проблемы лучше всего подходит прослушиватель Onpagechange. Но у него также будет одна небольшая ошибка, заключающаяся в том, что он не будет определять время начала 0-й позиции. После того, как вы измените страницу, он начнет определять выбранную позицию страницы ... Для этого проблема я нашел самое простое решение

1. Вы должны сохранить выбранное значение позиции, а затем использовать его ....
2. Случай 1: В начале позиции всегда находится ноль ....
Случай 2: Предположим, что если вы установите текущий элемент, вы установите это значение в позицию сохранения
3. Затем выполните свое действие с использованием этой поддержки в своей деятельности ...

Public int maintain=0;
myViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int i, float v, int i2) {
             //Toast.makeText(MyActivity.this, i+"  Is Selected  "+data.size(), Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onPageSelected( int i) {
          // here you will get the position of selected page
            maintain = i;


        }

        @Override
        public void onPageScrollStateChanged(int i) {

        }
    });


updateButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            Toast.makeText(MyActivity.this, i+"  Is Selected  "+data.size(), Toast.LENGTH_SHORT).show();
            data.set(maintain, "Replaced "+maintain);         
            myViewPager.getAdapter().notifyDataSetChanged();
        }
    });
Навин Кумар
источник
1
setOnPageChangeListener устарел. Используйте addOnPageChangeListener вместо setOnPageChangeListener.
Селин
6

getCurrentItem(), на самом деле не дает правильной позиции для первой и последней страницы, которую я исправил, добавив этот код:

public void CalcPostion() {    
    current = viewPager.getCurrentItem();

    if ((last == current) && (current != 1) && (current != 0)) {
        current = current + 1;
        viewPager.setCurrentItem(current);
    }
    if ((last == 1) && (current == 1)) {
        last = 0;
        current = 0;
    }
    display();
    last = current;
}
Да-монах
источник
5

В viewpager нет никакого метода getCurrentItem (). Я уже проверил API

раман
источник
3
Вам нужно обновить пакет совместимости в Android SDK Manager, и только тогда вы получите этот метод.
krisDrOid
5

Метод setOnPageChangeListener () устарел. Вместо этого используйте addOnPageChangeListener (OnPageChangeListener) .

Вы можете использовать OnPageChangeListener и получить позицию внутри onPageSelected()метода, это пример:

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

        }

        @Override
        public void onPageSelected(int position) {
            Log.d(TAG, "my position is : " + position); 
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

Или просто используйте getCurrentItem (), чтобы получить реальную позицию:

viewPager.getCurrentItem();
Jorgesys
источник