FragmentPagerAdapter notifyDataSetChanged不起作用

我有一个FragmentPagerAdapter。 它的getItem方法可以根据它从外部获得的数据返回一个片段。 我更新数据后,假设显示我调用notifyDataSetChanged但没有任何反应。 我DID覆盖getItemPosition方法以返回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 mTabs = new ArrayList(); 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; } ... 

来自外部的更新是在click事件中设置fragmentDisplayInfo var。 我进行了调试,发现fragmentDisplayInfo确实已经初始化,而getItemPosition方法确实返回了POSITION_NONE ,但是getItem方法甚至都没有被调用。 这是为什么?

编辑:

如果您还没有这样做,请注意适配器的overiden部分:

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

Related of "FragmentPagerAdapter notifyDataSetChanged不起作用"

我不确定这一点,但您可以尝试使用FragmentStatePagerAdapter而不是FragmentPagerAdapter 。 问题是,我也遇到了这个问题,它帮助了我

Nik Myers所说的是正确的。 然而,有一块遗失。 调用notifyDataSetChanged时,将调用方法getItemPosition。 您需要覆盖它以使片段重新加载。

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

我在上一个项目工作时遇到了类似的问题。 所以我发现很少解决方案。

  1. 通过覆盖寻呼机适配器中的getItemPosition,但这不是一个好主意。

     @Override public int getItemPosition(Object object) { // it will recreate all Fragments when // notifyDataSetChanged is called return POSITION_NONE; } 
  2. 第二个是cabezas解决方案。

  3. 最稳定的解决方案以下面的方式覆盖getItemPosition:

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

上面给出的解决方案都不适合我。 所以希望以下解决方案可能对您有所帮助。

在我的代码中,我在viewPager中有2个片段。 一个用于3个EditTexts和一个按钮,另一个片段具有RecyclerView。 单击按钮,我的值将转到recyclerView,但它不会更新。 所以现在,我使用下面的代码:

在此处输入图像描述

我在按钮点击时调用了notifyDataSetChanged() 。 我的MainActivity有内部适配器类扩展FragmentStatePagerAdapter类。 所以我使用mainActivity.mMainAdapter.notifyDataSetChanged()调用它。 希望它可以帮到某人。