Android FragmentPagerAdapter notifyDataSetChanged不工作

Android FragmentPagerAdapter notifyDataSetChanged不工作,android,android-adapter,fragmentpageradapter,notifydatasetchanged,Android,Android Adapter,Fragmentpageradapter,Notifydatasetchanged,我有一个碎纸机。它的getItem方法可以根据从外部获得的数据返回片段。在我更新了数据之后,我调用了notifyDataSetChanged,但是什么也没有发生。我确实重写了getItemPosition方法以返回POSITION\u NONE: public static class TabsAdapter extends FragmentPagerAdapter implements TabHost.OnTabChangeListener, ViewPager.OnPageC

我有一个碎纸机。它的
getItem
方法可以根据从外部获得的数据返回片段。在我更新了数据之后,我调用了notifyDataSetChanged,但是什么也没有发生。我确实重写了
getItemPosition
方法以返回
POSITION\u 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;
    }
...

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

尼克·迈尔斯所说的是正确的。然而,有一块丢失了。调用notifyDataSetChanged时,将调用方法getItemPosition。您需要重写此命令以重新加载片段

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

我在上一个项目中也遇到过类似的问题。 所以我没找到什么解决办法

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

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

  • 最稳定的解决方案以以下方式覆盖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中有两个片段。一个用于3个EditText和1个按钮,另一个片段具有RecyclerView。单击按钮,我的值将返回recyclerView,但不会更新。现在,我使用了以下代码:


    我在单击按钮时调用了notifyDataSetChanged()。我的MainActivity具有内部适配器类扩展FragmentStatePagerAdapter类。因此我使用MainActivity.mMainAdapter.notifyDataSetChanged()调用它。。希望它能帮助别人。

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

    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);
        }
    
    }
    
    public final类SomeFragment扩展了FragmentStatePagerAdapter{
    私人最终名单碎片;
    private Fragment removeFragment;//要在下一个notifydatasetchanged中删除的片段
    @凌驾
    public int getItemPosition(最终对象){
    返回object.equals(this.removeFragment)?FragmentStatePagerAdapter.POSITION\u NONE:this.fragments.indexOf(object);
    }
    }
    

    仅针对要从viewpager中删除的片段返回位置\u NONE。其他片段仍然在片段列表中。在调用notifyDataSetChanged()之前,不要忘记从列表中删除“removeFragment”

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


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

    您最终找到解决方案了吗?您救了我一天!正如天行者所说,用
    POSITION\u NONE
    返回值覆盖
    getItemPosition
    方法,太棒了!谢谢你发布这个。这是唯一对我有效的解决方案
    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);
        }
    
    }