FragmentPagerAdapter notifyDataSetChanged不起作用

时间:2015-05-06 14:43:51

标签: android android-adapter 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<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;
    }
...

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

编辑:

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

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

6 个答案:

答案 0 :(得分:66)

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

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

答案 1 :(得分:46)

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

答案 2 :(得分:3)

我在上一个项目工作时遇到过类似的问题。 所以我找到了一些解决方案。

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

答案 3 :(得分:1)

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

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

enter image description here

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

答案 4 :(得分:1)

这里的每个答案对我来说都不完美,但是将多个答案组合成一个答案是正确的选择。

receive

仅对您要从Viewpager中删除的片段返回POSITION_NONE。其他所有片段仍在您的片段列表中。在调用notifyDataSetChanged();之前不要忘记从列表中删除“ removeFragment”。

答案 5 :(得分:0)

对于尝试了上述方法后仍面临刷新问题的人:

使viewPager无效,然后调用notifyDatatSetChanged()