Получение текущей позиции ViewPager
Я знаю, что с помощью виджета галереи я смог использовать getSelectedItemPosition (); чтобы получить текущую позицию, однако это не похоже на ViewPager.
Я знаю, что могу настроить прослушиватель и получить позицию, когда страница переключается. Но я хочу текущее положение зрения.
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; } }
ну, для всех, кто на самом деле обращал внимание... мое предыдущее решение на самом деле не работает. Поэтому я удалил его и придумал хак, который, кажется, отлично работает! ЛОЛ!
нет причин понижать это я говорю вам сейчас его Хак. Это означает, что это либо будет полезно для вас конкретно или нет. В любом случае приведенное ниже описание даст некоторое представление. И быть полезным для общества.
во-первых, немного информации. Если вы перебираете через все дочерние элементы 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
или что решение? Ну, я был чертовски уверен, что есть прямой способ сделать это без необходимости включать слушателей, другие классы, неубедительный фокус и другое раздувание. К сожалению, это решение не совсем прямой. Но, это делает прочь с раздуванием, другими классами и слушателями. Если я смогу найти более прямой путь, я буду переписывать эту функцию. Или, может быть, это обеспечит понимание для кого-то еще, чтобы иметь прозрение.