Получение текущей позиции ViewPager


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

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

3 72

3 ответа:

создайте прослушиватель и установите его на свой viewpager:

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

вы можете использовать:

mViewPager.getCurrentItem()

ну, для всех, кто на самом деле обращал внимание... мое предыдущее решение на самом деле не работает. Поэтому я удалил его и придумал хак, который, кажется, отлично работает! ЛОЛ!

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

во-первых, немного информации. Если вы перебираете через все дочерние элементы a 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 или что решение? Ну, я был чертовски уверен, что есть прямой способ сделать это без необходимости включать слушателей, другие классы, неубедительный фокус и другое раздувание. К сожалению, это решение не совсем прямой. Но, это делает прочь с раздуванием, другими классами и слушателями. Если я смогу найти более прямой путь, я буду переписывать эту функцию. Или, может быть, это обеспечит понимание для кого-то еще, чтобы иметь прозрение.