2013-08-27 12 views
12

Mam ViewPager z niestandardowym PagerAdapter, który nadpisuje metodę getPageWidth, aby zwrócić 0.3f, więc mogę pokazać wiele stron na ekranie, zgodnie z sugestią na poniższym blogu :Problem z wyświetlaniem przewijania w Android ViewPager z tylko jednym elementem podczas korzystania z getPageWidth z PagerAdaptera

http://commonsware.com/blog/2012/08/20/multiple-view-viewpager-options.html

w tym przypadku ViewPager zaczyna pusty i użytkownik rozpoczyna wypełnianie stron (obrazów) na żądanie. Obrazy są wypełniane od lewej do prawej. Wszystko działa poprawnie, a strony są tworzone dinamicznie i łatwo jest przesuwać między nimi, gdy jest wiele obrazów.

Jednak występuje problem z utworzeniem mniej niż trzech stron. Gest przesuwania palcem od prawej (brak zawartości) do lewej powoduje migotanie ze stronami przesuwającymi się od lewej do prawej alternatywnie, tak jakby ViewPager próbował przesuwać pierwsze strony w prawo, ale później zwracając się do swojej pierwotnej pozycji. Dzieje się to podczas całego gestu i zatrzymuje się po opuszczeniu gestu. Jak już powiedziałem, tak się nie dzieje, gdy jest wystarczająco dużo stron, aby pokryć całą szerokość ekranu i potrzebny jest prawdziwy zwój.

Jakieś pomysły?

Odpowiedz

10

Wiem, że to stare pytanie, ale ja po prostu szukałem rozwiązania i natknąłem się na this link (co dziwnie odnosi się do tego pytania). W każdym razie, udało mi się znaleźć rozwiązanie oparte na ich komentarzach. Podstawową ideą jest zezwolenie na zdarzenia dotykowe w zależności od ustawionego stanu flagi binarnej.

  1. Extend ViewPager na ręcznym onInterceptTouchEvent & onTouchEvent tylko wywołanie super jeśli masz ustawioną flagę. Moja klasa wygląda następująco:

    public class MyViewPager extends ViewPager { 
    
        private boolean isPagingEnabled = false; 
    
        public MyViewPager(Context context, AttributeSet attrs) { 
         super(context, attrs); 
        } 
    
        public MyViewPager(Context context) { 
         super(context); 
        } 
    
        @Override 
        public boolean onInterceptTouchEvent(MotionEvent event) { 
         if (isPagingEnabled) { 
          return super.onInterceptTouchEvent(event); 
         } 
         return false; 
        } 
    
        @Override 
        public boolean onTouchEvent(MotionEvent event) { 
         if (isPagingEnabled) { 
          return super.onTouchEvent(event); 
         } 
         return false; 
        } 
    
        public void setPagingEnabled(boolean pagingEnabled) { 
         isPagingEnabled = pagingEnabled; 
        } 
    } 
    
  2. W swojej xml układ, wymienić swoje elementy com.android.support.v4.ViewPager z elementami com.yourpackage.MyViewPager.

  3. Ponieważ zwracasz 0,3f od getPageWidth() w adapterze stronicowania, chcesz włączyć przewijanie po dodaniu czwartego elementu. Najtrudniejszą częścią jest posiadanie tego wiersza kodu wszędzie, kiedy definiujesz swój adapter pagerów oraz dodawanie lub usuwanie dowolnych obiektów z listy zabezpieczeń adaptera.

    mPager.setPagingEnabled(items.size() > 3); 
    
6

rozwiązanie Rahuls działa, ale jeśli chcesz auto włączanie stronicowania według treści, które można modyfikować ViewPager tak:

public class MyViewPager extends ViewPager { 

public MyViewPager(Context context, 
         AttributeSet attrs) { 
    super(context, attrs); 
} 

public MyViewPager(Context context) { 
    super(context); 
} 

@Override 
public boolean onInterceptTouchEvent(MotionEvent event) { 
    if (canScrollHorizontally(1)||canScrollHorizontally(-1)) { 
     return super.onInterceptTouchEvent(event); 
    } 

    return false; 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    if (canScrollHorizontally(1)||canScrollHorizontally(-1)) { 
     return super.onTouchEvent(event); 
    } 

    return false; 
} 

}

Teraz, jeśli ViewPager jest przewijany, pozwoli na dotknięcia, w przeciwnym razie zostanie wyłączony.

0

Udało mi się go rozwiązać w ten sposób, w metodzie getPageWidth(), jeśli istnieje tylko jeden obraz [można poznać, sprawdzając rozmiar tablicy lub listy] zwracając 1, jeśli wielkość wejściowa jest większa niż 1 zwraca dziesiętny. Oto kod, aby to osiągnąć.

@override 
public float getPageWidth(int position){ 
    if(inpputsize==1){ 
     return 1.0; 
    } 
    return 0.9; 
}