Подтвердить что ты не робот

FragmentPagerAdapter notifyDataSetChanged не работает

Я получил FragmentPagerAdapter. Метод getItem может возвращать фрагмент в соответствии с данными, которые он имеет извне. После того, как я обновляю данные, их можно отобразить, я вызываю notifyDataSetChanged, но ничего не произошло. Я отклонил метод 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;
    }
...

И обновление снаружи находится в событии click, которое устанавливает fragmentDisplayInfo var. Я отлаживал и видел, что fragmentDisplayInfo действительно инициализирован, а метод getItemPosition возвращает POSITION_NONE, но метод getItem даже не вызван. Почему это?

EDIT:

Если вы еще этого не сделали, обратите внимание на то, что чрезмерная часть адаптера:

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

Ответ 1

Я не уверен в этом, но вы можете использовать FragmentStatePagerAdapter вместо FragmentPagerAdapter. Дело в том, что я тоже столкнулся с этой проблемой, и это помогло мне

Ответ 2

То, что говорит Ник Майерс, верно. Однако есть недостающая часть. Когда вызывается notifyDataSetChanged, вызывается метод getItemPosition. Вам нужно переопределить это, чтобы перезагрузить фрагменты.

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

Ответ 3

Я столкнулся с подобной проблемой, когда работал над моим последним проектом. Поэтому я нашел несколько решений.

  • переопределяя getItemPosition в адаптере пейджера, но это не очень хорошая идея.

    @Override
    public int getItemPosition(Object object) {
        // it will recreate all Fragments when
        // notifyDataSetChanged is called
        return POSITION_NONE;
    }
    
  • Второй вариант cabezas.

  • Наиболее устойчивое решение переопределяет 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);
        }
    

Ответ 4

ни одно из приведенных выше решений не работает для меня. Поэтому надежда ниже решения может быть полезна для вас.

В моем коде у меня есть 2 фрагмента в viewPager. Один используется для 3 EditTexts и 1 кнопки, а другой - RecyclerView. При нажатии кнопки, мое значение будет recyclerView, но оно не обновляется. Итак, теперь я использовал приведенный ниже код:

enter image description here

Я вызвал кнопку notifyDataSetChanged() нажатием кнопки. My MainActivity имеет внутренний класс адаптера, расширяющий класс FragmentStatePagerAdapter. Поэтому я назвал его с помощью mainActivity.mMainAdapter.notifyDataSetChanged(). Надеюсь, это поможет кому-то.