FragmentPagerAdapter notifyDataSetChanged无法正常工作 [英] FragmentPagerAdapter notifyDataSetChanged not working

查看:222
本文介绍了FragmentPagerAdapter notifyDataSetChanged无法正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个FragmentPagerAdapter.它的getItem方法可以根据其从外部获得的数据返回一个片段.更新数据后,假设要显示的数据我调用了notifyDataSetChanged,但是什么也没有发生.我DID覆盖了getItemPosition方法以返回POSITION_NONE:

I got a FragmentPagerAdapter. It's getItem method can return a fragment according to data it has from the outside. After I update the data its suppose to display I call notifyDataSetChanged and yet nothing happened. I DID override the getItemPosition method to return 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方法.为什么会这样?

And the update from outside is in a click event which sets the fragmentDisplayInfo var. I debuged and saw that the fragmentDisplayInfo is indeed initialized and the getItemPosition method does return POSITION_NONE, but the getItem method is not even called. Why is that?

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

If you hadn't done so as well, please notice that overiden part of the adapter:

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

推荐答案

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

I'm not sure about this, but you can try to use FragmentStatePagerAdapter instead of FragmentPagerAdapter . The thing is, i've also run into this issue, and it helped me

这篇关于FragmentPagerAdapter notifyDataSetChanged无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆