2012-10-04 12 views
26

Rozszerzyłem klasę ViewPager i zaimplementowałem onPageChangeListener. Używam tej ViewPager w połączeniu z CirclePageIndicator wewnątrz SherlockFragment. ViewPager zawiera ImageViews i TextViews, nic nadzwyczajnego.Android ViewPager's onPageScrollStateChanged nigdy nie zostanie wywołany

Potrzebuję zrobić coś poniżej ViewPagera za każdym razem, gdy strona jest zmieniana. Tak, pomyślałem, że muszę użyć onPageScrollStateChanged i sprawdzić, czy stan jest IDLE, czy coś.

Problem polega na tym, że z trzech zaimplementowanych metod (onPageScrollStateChanged, onPageSelected i onPageScrolled) wywoływane jest tylko onPageScrolled (sprawdziłem z komunikatem dziennika w każdej metodzie). Dlaczego ? Kod poniżej.

public class UninterceptableViewPager extends ViewPager implements OnPageChangeListener{ 

private ArrayList<TwoRowListViewAdapter> mAdaptersList = null; 
private ListView mListView = null; 
private ProgressBar mProgressBar = null; 


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

public boolean onInterceptTouchEvent(MotionEvent event) 
{ 
    getParent().requestDisallowInterceptTouchEvent(true); 
    return super.onInterceptTouchEvent(event); 
} 


public void setAdaptersList(ArrayList<TwoRowListViewAdapter> adaptersList) 
{ 
    mAdaptersList = adaptersList; 
} 

@Override 
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) 
{ 
    super.onPageScrolled(position++, positionOffset, positionOffsetPixels); 
    if (positionOffset == 0) // FIXME 
     loadHistoryPage(position); 
} 

@Override 
public void onPageSelected(int position) {} 

@Override 
public void onPageScrollStateChanged(int state) {} 


// ------------------------------------------------------------------------------------------- 
// -------------- Helper Methods 
// ------------------------------------------------------------------------------------------- 


public void setListView(ListView listview) 
{ 
    mListView = listview; 
} 

public void setProgressBar(ProgressBar progressBar) 
{ 
    mProgressBar = progressBar; 
} 

private void loadHistoryPage(int position) 
{ 
    mListView.setVisibility(View.INVISIBLE); 
    mProgressBar.setVisibility(View.VISIBLE); 
    mListView.setAdapter(null); 
    mListView.setAdapter(mAdaptersList.get(position-1)); 
    mProgressBar.setVisibility(View.INVISIBLE); 
    mListView.setVisibility(View.VISIBLE); 
} 

}

Odpowiedz

68

Podczas korzystania PageIndicator w połączeniu z Viewpager wtedy onPageChangeListener z ViewPager nie nazywa. Nie wiem, dlaczego tak się stało, ale stało się tak, gdy używałem obu. Może być, ponieważ wskaźnik strony pochłania zdarzenie zmiany strony. Zamiast tego powinieneś ustawić detektor zmiany strony na PageIndicator i zostanie on wywołany, gdy strona się zmieni. Oto w jaki sposób można to zrobić:

indicator.setOnPageChangeListener(new OnPageChangeListener() { 

     @Override 
     public void onPageSelected (int page) 
     { 
      //page changed 
     } 

     @Override 
     public void onPageScrolled (int arg0, float arg1, int arg2) 
     { 
     } 

     @Override 
     public void onPageScrollStateChanged (int arg0) 
     { 
     } 
    }); 

Mam nadzieję, że to pomoże. Zapraszam do dyskusji.

+0

Tak, myślę, że założenie jest prawidłowe. Muszę to zweryfikować, ale ma to sens. Dziękuję bardzo za tę idealną odpowiedź! Przetestuję to rozwiązanie jutro i przedstawię moje wyniki. –

+0

ok Czekam na Twoją opinię .. – karn

+0

Awesome. Działa idealnie. Wielkie dzięki ! –

0

setOnPageChangeListener jest przestarzałe. używać addOnPageChangeListener

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

     } 

     @Override 
     public void onPageSelected(int position) { 

     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 

     } 
    }); 
Powiązane problemy