Отримання поточної позиції ViewPager


84

Я знаю, що з віджетом Gallery я зміг використовувати getSelectedItemPosition (); щоб отримати поточну позицію, проте, здається, ViewPager цього не має.

Я знаю, що можу налаштувати слухача і отримати позицію, коли сторінка перемикається. Але я хочу поточну позицію перегляду.

Відповіді:


94

Створіть слухач і встановіть його на свій переглядач:

/**
 * Get the current view position from the ViewPager by
 * extending SimpleOnPageChangeListener class and adding your method
 */
public class DetailOnPageChangeListener extends ViewPager.SimpleOnPageChangeListener {

    private int currentPage;

    @Override
    public void onPageSelected(int position) {
        currentPage = position;
    }

    public final int getCurrentPage() {
        return currentPage;
    }
}

4
Тільки пам’ятайте, використовуючи це: getCurrentPage () завжди повертає 0, коли вигляд ніколи не змінювався. З якоїсь причини, якщо ви вводите ViewPager в якомусь поданні, відмінному від першого, значення, яке ви очікували, не повинно бути 0 ... Я просто зіткнувся з проблемою з цим, оскільки не завжди входив у подання на першому вид.
Брендон Романо,

1
@Adam може, будь ласка, підкажіть мені, як викликати цю функцію getCurrentPage
user3233280

Це дуже просто. Дякую u androidu.
whdals0

193

Ви можете використовувати:

mViewPager.getCurrentItem()

У ViewPager не існує методу getCurrentItem
Дмитро Гусельников


3
Вибачте, я помилився. Щойно оновив мою бібліотеку підтримки, і цей метод існує в новій версії
Дмитро Гусельников,

4

Оновлення 2019

Тепер ви можете встановити addOnPageChangeListenerна Перегляд пейджера спостерігати за зміною положення сторінки.

Оскільки ви хотіли налаштувати прослуховувач і отримати позицію при перемиканні сторінки

mViewPager.addOnPageChangeListener(object : OnPageChangeListener {
            override fun onPageScrollStateChanged(state: Int) {}
            override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}

            override fun onPageSelected(position: Int) {
                pagePosition.setText("" + position + "/" + galleryAdapter!!.count)
            }
        })

0

Я кажу тобі зараз це хакерство, тому немає жодної причини, щоб голосувати проти цієї причини. Це означає, що це буде корисно для вас конкретно чи ні. У будь-якому випадку, наведений нижче опис надасть деяку інформацію та буде корисним для громади. Крім того, це рішення підходить для старих API, яких немає ViewPager.getCurrentItem().


Спочатку трохи інформації. Якщо виконати ітерацію всіх дочірніх елементів ViewPager із ViewPager.getChildAt(x);і роздрукувати за допомогою toString()(або getLeft()) кожного дочірнього представлення (сторінки), а потім робити це кожного разу, коли ви змінюєте сторінки, ви помітите, що діти не будуть в логічному порядку, як вони відображаються , коли ви починаєте повертати сторінки назад (перейти назад на початок). Очевидно, це видалить непотрібну дочірню систему з масиву, а потім додасть до масиву найновішу дочірню організацію. Наприклад, скажімо, ви дивитесь на сторінку 2, а потім змінили її на сторінку 3, ваш список дітей буде в такому порядку, що page 2, page 3, page 4означає ViewPager.getChildAt(1);повернення поточної сторінки. Але якщо ви повернетесь на сторінку 2 (зі сторінки 3), ваш список дітей буде в такому порядку, page 2, page 3, page 1що означає цеViewPager.getChildAt(1);не повертає поточну сторінку. Я ще не зміг знайти просту логіку, щоб відсіяти поточну сторінку, використовуючи цю інформацію. Оскільки порядок сторінок у масиві позаду getChildAtзнаходиться у довільному порядку, заснованому на тому, як користувач переглядав сторінки.

З огляду на це, я розробив хак-навколо. Я не знаю, чи ця функція буде працювати у всіх середовищах, але вона працює для мого поточного проекту. Я підозрюю, що якщо це не для вас, то це проблема іншого рівня API. Але я насправді не підозрюю про будь-які проблеми в інших середовищах.

Тепер на м’ясо. Що я помітив, так це те, що результат ViewPager.getChildAt(x).getLeft()буде мати якийсь тип горизонтальних піксельних координат щодо батьківського. Отже, я використав цю інформацію, щоб відсіяти, який погляд є поточним.

private int getCurrentPageIndex(ViewPager vp){
    int first,second,id1,id2,left;
    id1 = first = second = 99999999;
    View v;
    for ( int i = 0, k = vp.getChildCount() ; i < k ; ++i ) {
        left = vp.getChildAt(i).getLeft();
        if ( left < second ) {
            if ( left < first ) {
                second = first;
                id2 = id1;
                first = left;
                id1 = i;
            } else {
                second = left;
                id2 = i;
            }
        }
    }
    return id2;
}

Ця функція, мабуть, сумнівний хак, оскільки вона покладається на цінність, getLeft()щоб зрозуміти все це. Але я захоплюю ліву координату кожної дитини. Потім я порівнюю це з іншими значеннями і зберігаю першу та другу сторінки, повертаючи другу сторінку (поточну сторінку) поза функцією. Здається, це працює чудово.

Чому (можете запитати) я просто не використовував onClickListenterчи інше рішення? Ну, я був засуджений у рішучості, що є прямий спосіб зробити це без необхідності включати слухачів, інші класи, безрезультатну увагу та інше роздуття. На жаль, це рішення не зовсім пряме. Але це позбавляє здуття, інших класів та слухачів. Якщо я зможу зрозуміти більш прямий шлях, я перепишу цю функцію. А може, це дасть зрозуміти комусь іншому прозріння.


1
ти врятував мене! мав якусь огидну помилку. не міг знайти, що пішло не так. Ви, сер, заслуговуєте на мільйон прихильників!
Нурсултан Талапбеков

Дякую вам, панове! Думаю, громада не поділяє вашого ентузіазму.
Pimp Trizkit
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.