viewpager tablayout showing not multiple fragments example android android-adapter fragmentpageradapter notifydatasetchanged

android - tablayout - FragmentPagerAdapter notifyDataSetChanged no funciona



viewpager adapter in fragment (4)

Lo que Nik Myers está diciendo es correcto. Sin embargo falta una pieza. Cuando se llama a notificationDataSetChanged, se llama al método getItemPosition. Debe anular esto para que los fragmentos se vuelvan a cargar.

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

Tengo un FragmentPagerAdapter. El método getItem puede devolver un fragmento de acuerdo con los datos que tiene del exterior. Después de actualizar los datos, se supone que debo mostrar que llamo notifyDataSetChanged y, sin embargo, no sucedió nada. getItemPosition anular el método getItemPosition 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 fuera está en un evento de clic que establece la var. fragmentDisplayInfo . Depuré y vi que fragmentDisplayInfo se inicializó y el método getItemPosition devuelve POSITION_NONE , pero el método getItem ni siquiera se llama. ¿Porqué es eso?

EDITAR:

Si no lo ha hecho también, tenga en cuenta que hay una parte superior del adaptador:

@Override public int getItemPosition(Object item) { return POSITION_NONE; }


Me enfrenté a un problema similar cuando estaba trabajando en mi último proyecto. Así que encontré pocas soluciones.

  1. al anular getItemPosition en el adaptador de buscapersonas, pero no es una buena idea.

    @Override public int getItemPosition(Object object) { // it will recreate all Fragments when // notifyDataSetChanged is called return POSITION_NONE; }

  2. La segunda solución es cabezas .

  3. La solución más estable anula getItemPosition de 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); }


Ninguna de las soluciones dadas arriba funciona para mí. Así que espero que la solución a continuación pueda ser útil para usted.

En mi código, tengo 2 fragmentos en viewPager. Uno se usa para 3 EditTexts y 1 botón y otro fragmento tiene RecyclerView. Al hacer clic en el botón, mi valor va a recyclerView, pero no se está actualizando. Así que ahora, he usado el siguiente código:

Llamé a notifyDataSetChanged () al hacer clic en el botón. Mi MainActivity tiene una clase de adaptador interno que extiende la clase FragmentStatePagerAdapter. Así que lo llamé utilizando mainActivity.mMainAdapter.notifyDataSetChanged () . Espero que ayude a alguien.


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