2013-05-16 15 views
14

Jest jeden przypadek użycia z ViewPager Nigdy nie widziałem ładnie zrealizowane.Nieograniczona/dynamiczna ViewPager w obu kierunkach

ViewPager jest mniej lub bardziej statyczną strukturą. Nie jest tak trudno dodawać strony po prawej stronie (dodawanie do modelu i wyświetlanie go), jednak powinno być dobre rozwiązanie do rozbudowy PagerAdaptera (lub niektórych jego podklas), aby mógł on rozwijać się w obu kierunkach.

mogę sobie wyobrazić, jak interfejs sieciowy tego

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) 

podobny do Kolekcji Iterator, ale oba kierunkach.

Gdzie indeks/pozycja nie jest ograniczona od dołu na 0, ale może używać całego zakresu typu Integer.
Może nie opierać implementacji na tablicy (która jest od 0 do nieskończoności).

Znalazłem ten „hack”: dynamically add and remove view to viewpager
Ale jak już wspomniano wcześniej, staram się dostać pracy w sposób naturalny, a nie utrzymanie pozycji 3,5, ... i zmusić ViewPager zmienić aktualną pozycję w oparciu na jakiejś skręconej logice:

Czy istnieje obecnie wystarczająca implementacja lub czy konieczne jest jej wdrożenie?
Jestem gotów nagrodzić nagrodę, jeśli będzie to zupełnie nowa implementacja.

+0

możemy dodać dowolną liczbę widoków w ViewPager .. I wprowadziły takie same w jednej z moich aplikacji. Rzuć okiem na @FoamyGuy Proste demo ViewPagera, w którym możemy mieć nieograniczoną liczbę stron https://github.com/FoamyGuy/MathFactCards – Pragnani

+0

@Pagagnani, ale rozwijasz się tylko we właściwym kierunku, staram się poruszaj się w obu kierunkach dynamicznie, bez hacków. –

+0

@Pagagnani możesz dodać nieograniczoną liczbę stron, ale tylko w jednym kierunku. Myślę, że jego pytanie jest inne. – TheFlash

Odpowiedz

7

Pomoże to,

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(); 
     } 
    } 
} 

a następnie

mPager.setCurrentItem((int)(Integer.MAX_VALUE/2)); // zakładając mPager to ViewPager

+1

Pomoże to jakoś, dzięki, ale nadal wydaje mi się dziwnym rozwiązaniem. –

+3

Nie będzie działać z FragmentStatePagerAdapter, ponieważ będzie musiał obliczyć każdy fragment. i powoduje przepełnienie pamięci – Hrk

2

Użycie wartości pozycji ujemnych oznacza bardzo daleko od naturalnego porządku użycia ViewPager i nie jest w ogóle problemem z adapterem. Zajrzyj do kodu źródłowego ViewPager w źródle pakietu pomocy technicznej w pakiecie Android SDK. Na przykład o to setCurrentItemInternal prywatny realizacja:

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); 
} 

Jak widać, ViewPager wyraźnie zakłada żadnych negatywnych wartości pozycji.

+0

A co to jest wniosek? Nie chciałem używać ujemnych indeksów. Muszę przejrzeć kolekcję w obu kierunkach bez ograniczeń, w oparciu o mój własny model. Powiedziałem wprost, że rozwiązanie prawdopodobnie nie powinno być oparte na macierzy, ponieważ musielibyśmy poradzić sobie z indeksami ujemnymi. –

+0

Napisałeś: "Gdzie indeks/pozycja nie jest ograniczona od dołu na 0, ale może używać całego zakresu typu Integer." Gdzie chcesz korzystać z tych indeksów? Jeśli w get/set bieżącej stronie lub w module obsługi Change, pojawia się powyższy problem. Jeśli negatywne indeksy nie są widoczne dla ViewPagera, jakie jest znaczenie * posiadania * takiego indeksu? Proszę opracować ... –

+0

Mówiłem o zakresie możliwych elementów, w zarysie interfejsu nie potrzebuję indeksów, ale muszę dynamicznie rozszerzać kolekcję w obu kierunkach. Tak więc wywoływanie getPreviousItem nie kończy się na Element (0), ale zależy od jakiegoś innego warunku, zaimplementowanego w niestandardowym Modelu. –