Actualizar datos en el Fragmento ViewPager

Esta es mi situación:

Tengo ViewPager en mi Actividad que aloja 6 Fragmentos. Desactivé la búsqueda al deslizar con el dedo, por lo tanto, cada vez que quiero deslizar el dedo, utilizo el botón relacionado y:

viewPager.setCurrentItem(viewPager.getCurrentItem() + 1, true); 

En cada fragmento que se desliza (después de finalizar el deslizamiento) deseo enviar una solicitud GET a mi servidor y buscar algunos datos y mostrarlos en ese fragmento. para hacer eso:

Primer enfoque : utilicé este código en mis fragmentos, que se ejecuta tan pronto como el fragmento se hace visible:

 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if(isVisibleToUser) { sendGetRequest(); } } 

Pero, aquí había un problema: que setUserVisibleHint ejecuta exactamente el fragmento visible, y debido a eso la animación de deslizar venía con un retraso (no era lo suficientemente suave).

Entonces usé Second Approach : agregué un OnPageChangeListener () a ViewPager en una actividad alojada como esta:

 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { int CurrentPossition = 0; @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { CurrentPossition = position; } @Override public void onPageScrollStateChanged(int state) { if(state == ViewPager.SCROLL_STATE_IDLE && CurrentPossition != 0){ Toast.makeText(getBaseContext(),"finished" , Toast.LENGTH_SHORT).show(); try{ new fragment_two().sendGetRequest();; }catch(Exception ex){ ex.printStackTrace(); } } } }); 

Funciona de maravilla, y los brindis se muestran apenas finaliza el deslizamiento, pero a diferencia del fragmento que se ve completamente, cuando se ejecuta sendGetRequest () obtengo NullPointerException.

aquí está StackTrace:

 04-08 20:15:37.840 12848-12848/com.example.mohamad.travelagency W/System.err: java.lang.NullPointerException 04-08 20:15:37.850 12848-12848/com.example.mohamad.travelagency W/System.err: at android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:152) 04-08 20:15:37.850 12848-12848/com.example.mohamad.travelagency W/System.err: at android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:103) 04-08 20:15:37.850 12848-12848/com.example.mohamad.travelagency W/System.err: at android.app.AlertDialog.resolveDialogTheme(AlertDialog.java:143) 04-08 20:15:37.850 12848-12848/com.example.mohamad.travelagency W/System.err: at android.app.AlertDialog.(AlertDialog.java:98) 04-08 20:15:37.850 12848-12848/com.example.mohamad.travelagency W/System.err: at android.app.ProgressDialog.(ProgressDialog.java:77) 04-08 20:15:37.850 12848-12848/com.example.mohamad.travelagency W/System.err: at com.example.mohamad.travelagency.fragment_two.GetServetData_L1(fragment_two.java:458) 04-08 20:15:37.850 12848-12848/com.example.mohamad.travelagency W/System.err: at com.example.mohamad.travelagency.MainActivity$1.onPageScrollStateChanged(MainActivity.java:124) 04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err: at android.support.v4.view.ViewPager.dispatchOnScrollStateChanged(ViewPager.java:1811) 04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err: at android.support.v4.view.ViewPager.setScrollState(ViewPager.java:404) 04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err: at android.support.v4.view.ViewPager.access$000(ViewPager.java:91) 04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err: at android.support.v4.view.ViewPager$3.run(ViewPager.java:250) 04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err: at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err: at android.view.Choreographer.doCallbacks(Choreographer.java:574) 04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err: at android.view.Choreographer.doFrame(Choreographer.java:543) 04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err: at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err: at android.os.Handler.handleCallback(Handler.java:733) 04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95) 04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err: at android.os.Looper.loop(Looper.java:136) 04-08 20:15:37.870 12848-12848/com.example.mohamad.travelagency W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5271) 04-08 20:15:37.870 12848-12848/com.example.mohamad.travelagency W/System.err: at java.lang.reflect.Method.invokeNative(Native Method) 04-08 20:15:37.870 12848-12848/com.example.mohamad.travelagency W/System.err: at java.lang.reflect.Method.invoke(Method.java:515) 04-08 20:15:37.870 12848-12848/com.example.mohamad.travelagency W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:851) 04-08 20:15:37.870 12848-12848/com.example.mohamad.travelagency W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:667) 04-08 20:15:37.870 12848-12848/com.example.mohamad.travelagency W/System.err: at dalvik.system.NativeStart.main(Native Method) 

cualquier idea sería genial atentamente

Respuesta : El código de Daniel Nugent funcionó bien, además de mostrar ProgressDialog durante el envío de la solicitud GET que utilicé:

 final ProgressDialog dialog = new ProgressDialog(new MainActivity()); 

este código también devolvió NullPointerException, lo eliminé y ahora funciona bien.

Usar ViewPager.OnPageChangeListener es la forma correcta de hacerlo, pero necesitará refactorizar su adaptador un poco para mantener una referencia a cada Fragmento contenido en FragmentPagerAdapter.

Usted hace eso usando el método instantiateItem() anula en el adaptador, aquí hay un ejemplo simplificado:

  class PagerAdapter extends FragmentPagerAdapter { String tabTitles[] = new String[] { "One", "Two", "Three", "Four"}; Context context; //This will contain your Fragment references: public Fragment[] fragments = new Fragment[tabTitles.length]; public PagerAdapter(FragmentManager fm, Context context) { super(fm); this.context = context; } @Override public int getCount() { return tabTitles.length; } @Override public Fragment getItem(int position) { switch (position) { case 0: return new FragmentOne(); case 1: return new FragmentTwo(); case 2: return new FragmentThree(); case 3: return new FragmentFour(); } return null; } //This populates your Fragment reference array: @Override public Object instantiateItem(ViewGroup container, int position) { Fragment createdFragment = (Fragment) super.instantiateItem(container, position); fragments[position] = createdFragment; return createdFragment; } @Override public CharSequence getPageTitle(int position) { // Generate title based on item position return tabTitles[position]; } } 

Luego, en lugar de crear un nuevo Fragmento, use el contenido en el adaptador:

 mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { // do this instead, assuming your adapter reference // is named mAdapter: Fragment frag = mAdapter.fragments[position]; if (frag != null && frag instanceof FragmentTwo) { ((FragmentTwo)frag).sendGetRequest(); } } @Override public void onPageScrollStateChanged(int state) { } }); 

Tenga en cuenta que si usa diferentes clases de Fragmentos en su adaptador, puede implementar una interfaz que defina sendGetRequest() , y en cada una de las clases de Fragment implemente el método sendGetRequest ().

Si no utiliza el enfoque de interfaz, deberá convertir el Fragmento a su propio tipo de Fragmento como se muestra en el ejemplo anterior, es decir:

 if (frag instanceof FragmentTwo) { ((FragmentTwo)frag).sendGetRequest(); } 

En lugar de llamar al método sendGetRequest () en el detector de buscapersonas, llame a su solicitud GET en el método onCreateView en su clase fragment_two fragment. La razón para hacer esto es porque se asegura de que todas sus vistas en fragment_two se hayan inicializado correctamente a través de los eventos del ciclo de vida del fragmento.