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.
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; }
La segunda solución es cabezas .
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ó.