Tengo un FragmentPagerAdapter. Es getItem método puede devolver un fragmento de acuerdo a los datos que se tiene desde el exterior. Después de actualizar los datos de su suponga para mostrar que yo llamo notifyDataSetChanged y, sin embargo, no pasó nada. Me HIZO anular el getItemPosition método para devolver POSITION_NONE:

public static class TabsAdapter extends FragmentPagerAdapter implements TabHost.OnTabChangeListener,
ViewPager.OnPageChangeListener
{
private final Context mContext;
private final TabHost mTabHost;
private final ViewPager mViewPager;
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
private PagerTabsFragments fragmentDisplayInfo = null; //for now only a
//single size
//back
//stack
static class PagerTabsFragments
{
public int tabPosition;
public Fragment fragmentToDisplay;
public Object fragmentInfo;
public PagerTabsFragments(int tab, Fragment frag, Object info)
{
tabPosition = tab;
fragmentToDisplay = frag;
fragmentInfo = info;
}
}
public void SetFragmentToDisplay(int tabPosition, Fragment frag, Object info)
{
fragmentDisplayInfo = new PagerTabsFragments(tabPosition, frag, info);
notifyDataSetChanged();
}
public void CancelFragmentToDisplay()
{
fragmentDisplayInfo = null;
}
...
@Override
public Fragment getItem(final int position)
{
if ((fragmentDisplayInfo != null) && (fragmentDisplayInfo.tabPosition == position))
{
return fragmentDisplayInfo.fragmentToDisplay;
}
final TabInfo info = mTabs.get(position);
return Fragment.instantiate(mContext, info.clss.getName(), info.args);
}
@Override
public int getItemPosition(Object item)
{
if (fragmentDisplayInfo == null)
{
return super.getItemPosition(item);
}
return POSITION_NONE;
}
...

Y la actualización desde el exterior es en un evento click que establece el fragmentDisplayInfo var.
Yo debuged y vio que el fragmentDisplayInfo es, de hecho, se ha inicializado y el getItemPosition método no volver POSITION_NONE, pero el método getItem no es llamado. ¿Por qué es eso?

EDICIÓN:

Si no lo hubiera hecho así, por favor, observe que overiden parte del adaptador:

 @Override
public int getItemPosition(Object item)
{
return POSITION_NONE;
}
  • encontraste una solución en la final?
InformationsquelleAutor Yonatan Nir | 2015-05-06

5 Comentarios

  1. 48

    No estoy seguro acerca de esto, pero puedes probar a utilizar FragmentStatePagerAdapter en lugar de FragmentPagerAdapter . La cosa es que también me he topado con este problema, y me ayudó a

  2. 66

    Lo Nik Myers está diciendo es correcto. Sin embargo, hay una pieza que falta. Cuando notifyDataSetChanged se llama, el método getItemPosition se llama. Usted necesita para reemplazar este para obtener los fragmentos para recargar.

     @Override
    public int getItemPosition(Object object) {
    //Causes adapter to reload all Fragments when
    //notifyDataSetChanged is called
    return POSITION_NONE;
    }
  3. 3

    Me he encontrado con el problema similar cuando yo estaba trabajando en mi último proyecto.
    Por lo que he encontrado unos Solución.

    1. reemplazando getItemPosition en el adaptador buscapersonas, pero esto no es una buena idea.

      @Override
      public int getItemPosition(Object object) {
      //it will recreate all Fragments when
      //notifyDataSetChanged is called
      return POSITION_NONE;
      }
    2. El segundo es cabezas Solución.

    3. Más Estable de soluciones reemplazar getItemPosition en la siguiente manera:

          @Override
      public int getItemPosition(Object object) {
      if (object instanceof MyFragment) {
      //Create a new method notifyUpdate() in your fragment 
      //it will get call when you invoke 
      //notifyDatasetChaged();
      ((MyFragment) object).notifyUpdate();
      }
      //don't return POSITION_NONE, avoid fragment recreation.
      return super.getItemPosition(object);
      }
  4. 1

    ninguna de las soluciones anteriores funciona para mí. Así que espero que por debajo de solución pueden ser útiles para usted.

    En mi código, tengo 2 Fragmentos en viewPager. Uno se utiliza para el 3 EditTexts y 1 botón y otro fragmento tiene RecyclerView. En el botón haga clic en, mi valor va a recyclerView, pero no la actualización. Así que ahora, he utilizado el siguiente código:

    FragmentPagerAdapter notifyDataSetChanged no funciona

    Me llamó la notifyDataSetChanged() en el botón haga clic en. Mi MainActivity tiene interior del adaptador de la clase se extiende FragmentStatePagerAdapter clase. Así que me llamó utilizando mainActivity.mMainAdapter.notifyDataSetChanged(). Espero que ayude a alguien.

    • Genial!!! Gracias por publicar esto. Esta es la única solución que funcionó para mí
  5. 1

    Cada respuesta que aquí no funciona a la perfección para mí, pero la combinación de múltiples respuestas en uno es la elección correcta.

    public final class SomeFragment extends FragmentStatePagerAdapter{
    private final List<Fragment> fragments;
    private Fragment removeFragment; //Fragment to be removed in the next notifydatasetchanged
    @Override
    public int getItemPosition(final Object object) {
    return object.equals(this.removeFragment) ? FragmentStatePagerAdapter.POSITION_NONE : this.fragments.indexOf(object);
    }
    }

    Volver POSITION_NONE sólo el fragmento que te gustaría eliminar de la viewpager. Todos los otros fragmento está todavía en su fragmento de la lista. No te olvides de quitar el «removeFragment» de la lista antes de llamar a notifyDataSetChanged();

Dejar respuesta

Please enter your comment!
Please enter your name here