Я знаю, что с помощью виджета "Галерея" я смог использовать getSelectedItemPosition (); чтобы получить текущую позицию, но, похоже, ViewPager не имеет ее.
Я знаю, что могу настроить слушателя и получить позицию при переключении страницы. Но мне нужна текущая позиция просмотра.
Вы можете использовать:
mViewPager.getCurrentItem()
источник
Обновление 2019
Теперь вы можете настроить
addOnPageChangeListener
View Pager для наблюдения за изменением положения страницы.Поскольку вы хотели настроить слушателя и получить позицию при переключении страницы
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) } })
источник
Я говорю вам, что это взлом, так что нет причин понижать голос по этой причине. То есть будет либо полезно конкретно вам, либо нет. В любом случае приведенное ниже описание даст некоторое представление и будет полезно сообществу. Кроме того, это решение подходит для старых API, которых нет
ViewPager.getCurrentItem()
.Для начала немного информации. Если вы перебираете всех дочерних элементов ViewPager
ViewPager.getChildAt(x);
и распечатываете сtoString()
(илиgetLeft()
) каждым дочерним View (страницей), а затем делаете это каждый раз, когда вы меняете страницы, вы заметите, что дочерние элементы не будут находиться в том логическом порядке, в котором они отображаются в, когда вы начинаете переходить на предыдущие страницы (перелистывание назад к началу). Очевидно, он удалит ненужный дочерний элемент из массива, а затем добавит в массив самый новый дочерний элемент. Так, например, предположим, что вы смотрите на страницу 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
или какое-то другое решение? Что ж, я был чертовски уверен, что есть простой способ сделать это без необходимости включать слушателей, другие классы, неубедительную фокусировку и другие раздувания. К сожалению, это решение не совсем простое. Но это избавляет от раздувания, других классов и слушателей. Если я смогу найти более простой способ, я перепишу эту функцию. Или, может быть, это даст возможность кому-то еще увидеть прозрение.источник