Я кажу тобі зараз це хакерство, тому немає жодної причини, щоб голосувати проти цієї причини. Це означає, що це буде корисно для вас конкретно чи ні. У будь-якому випадку, наведений нижче опис надасть деяку інформацію та буде корисним для громади. Крім того, це рішення підходить для старих 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
чи інше рішення? Ну, я був засуджений у рішучості, що є прямий спосіб зробити це без необхідності включати слухачів, інші класи, безрезультатну увагу та інше роздуття. На жаль, це рішення не зовсім пряме. Але це позбавляє здуття, інших класів та слухачів. Якщо я зможу зрозуміти більш прямий шлях, я перепишу цю функцію. А може, це дасть зрозуміти комусь іншому прозріння.