草庐IT

android - FragmentPagerAdapter notifyDataSetChanged 不起作用

coder 2023-06-06 原文

我有一个 FragmentPagerAdapter。它的 getItem 方法可以根据它从外部获得的数据返回一个 fragment 。在我更新它假设显示的数据后,我调用 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;
    }
...

并且来自外部的更新是在设置 fragmentDisplayInfo 变量的单击事件中。 我调试并看到 fragmentDisplayInfo 确实已初始化,并且 getItemPosition 方法确实返回 POSITION_NONE,但甚至没有调用 getItem 方法。这是为什么呢?

编辑:

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

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

最佳答案

尼克迈尔斯所说的是正确的。然而少了一 block 。当调用 notifyDataSetChanged 时,会调用 getItemPosition 方法。您需要覆盖它以重新加载 fragment 。

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

关于android - FragmentPagerAdapter notifyDataSetChanged 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30080045/

有关android - FragmentPagerAdapter notifyDataSetChanged 不起作用的更多相关文章

随机推荐