Неограниченный/Динамический ViewPager в обоих направлениях
Существует один прецедент ViewPager
, который я никогда не видел.
ViewPager
- более или менее статическая структура. Не так сложно добавлять страницы в нужную сторону (добавление к модели и ее отображение), однако должно быть приятное в использовании решение для расширения PagerAdapter (или некоторых из его подклассов), чтобы оно могло расширяться в обоих направлениях.
Я могу представить себе интерфейс для адаптера
boolean isEmpty()
boolean hasNext()
boolean hasPrevious()
Object getNext()
Object getPrevious()
Object getItem(int position)
// or if using generics
T getNext()
T getPrevious()
T getItem(int position)
Подобно сборнику Iterator, но в обоих направлениях.
Если индекс/позиция не ограничена снизу на 0, но может использовать весь диапазон типа Integer.
Возможно, не основывается реализация на массиве (от 0 до бесконечного).
Я нашел этот "хак": динамически добавлять и удалять вид на просмотрщик
Но, как я уже говорил, я пытаюсь заставить его работать нормально, не поддерживая 3,5,... элементы и заставляя ViewPager менять текущую позицию на основе некоторой витой логики
Есть ли в настоящее время достаточная реализация или необходимо ее реализовать?
Я готов вознаградить вознаграждение, если это будет совершенно новая реализация.
Ответы
Ответ 1
Будет ли это помогать,
public static class MyAdapter extends FragmentPagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public Fragment getItem(int position) {
return getFragmentBasedOnPosition(position);
}
private Fragment getFragmentBasedOnPosition(int position) {
int fragmentPos = position % 3; // Assuming you have 3 fragments
switch(fragmentPos) {
case 1:
return Fragment1.newInstance();
case 2:
return Fragment2.newInstance();
case 3:
return Fragment3.newInstance();
}
}
}
а затем
mPager.setCurrentItem((int)(Integer.MAX_VALUE/2));
//Предполагая, что mPager - это ваш ViewPager
Ответ 2
Использование отрицательных значений позиции стоит очень вдали от естественного порядка использования ViewPager и вовсе не является проблемой адаптера. Пожалуйста, ознакомьтесь с исходным кодом ViewPager в источнике пакета поддержки в Android SDK. Например, вот частная реализация setCurrentItemInternal:
void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) {
if (mAdapter == null || mAdapter.getCount() <= 0) {
setScrollingCacheEnabled(false);
return;
}
if (!always && mCurItem == item && mItems.size() != 0) {
setScrollingCacheEnabled(false);
return;
}
if (item < 0) {
item = 0;
} else if (item >= mAdapter.getCount()) {
item = mAdapter.getCount() - 1;
}
final int pageLimit = mOffscreenPageLimit;
if (item > (mCurItem + pageLimit) || item < (mCurItem - pageLimit)) {
// We are doing a jump by more than one page. To avoid
// glitches, we want to keep all current pages in the view
// until the scroll ends.
for (int i=0; i<mItems.size(); i++) {
mItems.get(i).scrolling = true;
}
}
final boolean dispatchSelected = mCurItem != item;
populate(item);
scrollToItem(item, smoothScroll, velocity, dispatchSelected);
}
Как вы можете видеть, ViewPager явно не принимает отрицательных значений позиции.