2012-10-04 30 views
26

He extendido la clase ViewPager e implementado en PAGEChangeListener. Uso este ViewPager junto con un CirclePageIndicator dentro de un SherlockFragment. ViewPager contiene ImageViews y TextViews, nada sofisticado.Android onPageScrollStateChanged de ViewPager nunca se llama

Necesito hacer algo debajo del ViewPager cada vez que se cambia la página. Entonces, pensé que necesitaba usar el onPageScrollStateChanged y verificar cuando el estado es IDLE, o algo así.

El problema es que a partir de los 3 métodos implementados (onPageScrollStateChanged, onPageSelected y onPageScrolled), solo se llama a onPageScrolled (lo comprobé con un mensaje de registro en cada método). Porqué es eso ? Código a continuación.

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

}

Respuesta

68

Cuando se utiliza PageIndicator en conjunto con el ViewPager entonces el onPageChangeListener del ViewPager no se llama. No sé la razón para esto, pero esto sucedió cuando estaba usando ambos. Puede ser porque el indicador de página consume el evento de cambio de página. En su lugar, debe establecer un oyente de cambio de página en el PageIndicator y se llamará cuando la página cambie. He aquí cómo usted puede hacer esto:

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

espero que esto ayudará. Siéntete libre de discutir

+0

Sí, creo que su suposición es correcta. Bueno, necesito verificarlo, pero tiene sentido. ¡Muchas gracias por esta respuesta perfecta! Voy a probar la solución mañana e informar mis conclusiones. –

+0

ok, espero su respuesta .. – karn

+0

Impresionante. Funciona perfectamente Muchas gracias ! –

0

setOnPageChangeListener está en desuso. usar 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) { 

     } 
    }); 
Cuestiones relacionadas