内容未更新FragmentPagerAdapter

时间:2015-04-09 09:25:44

标签: android android-fragments android-viewpager

我正在使用FragmentPagerAdapter,我需要在用户操作后刷新内容。

要做到这一点,我在适配器上调用notifyDataSetChanged()但似乎没有任何事情发生。我想避免使用FragmentStatePagerAdapter,因为它只包含3页。

以下是适配器的覆盖方法:

@Override
public int getCount() {
    return 3;
}

@Override
public Fragment getItem(int position) {
    Fragment fragment;
    switch (position) {
        case PAGE_HOME:
            fragment = HomeFragment.newInstance();
            break;
        case PAGE_CATEGORIES:
            fragment = CategoriesFragment.newInstance();
            break;
        case PAGE_ACCOUNT:
            if (account == null) {
                fragment = AccountFragment.newInstance();
            } else {
                fragment = MyAccountFragment.newInstance();
            }
            break;
        default:
            fragment = null;
    }
    pageReferenceMap.put(position, fragment);
    return fragment;
}

@Override
public CharSequence getPageTitle(int position) {
    return null;
}

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

@Override
public Object instantiateItem(ViewGroup container, int position) {
    Fragment fragment = (Fragment) super.instantiateItem(container, position);
    pageReferenceMap.put(position, fragment);
    return fragment;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    super.destroyItem(container, position, object);
    pageReferenceMap.remove(position);
}

感谢。

2 个答案:

答案 0 :(得分:1)

我发现我必须为该页面位置返回不同的ID。所以这是我如何基于我想要显示的片段而不是基于页面位置返回唯一ID:

@Override
public long getItemId(int position) {
    long id;
    switch (position) {
        case HOME_PAGE_POSITION:
            //fall through
        case CATEGORIES_PAGE_POSITION:
            id = position;
            break;
        case ACCOUNT_PAGE_POSITION:
            if (account == null) {
                id = position;
            } else {
                id = position + PAGE_COUNT;
            }
            break;
        default:
            id = -1;
    }
    return id;
}

如果您一次只能显示每页2个片段,则可以返回position+PAGE_COUNT*n。很简单。

希望得到这个帮助。

答案 1 :(得分:0)

notifyDataSetChanged方法会将调用发送回适配器,并在此调用之后检查getCount方法,调用getItem方法。仅当内容反映当前所选片段中的任何更改时,屏幕中的内容才会刷新。此处需要注意的是,此回调不会选择您的第一个片段。它将保留在当前选定的片段中。

例如: -

当前选择的片段是2,您已经更改了片段编号1的内容并进行了notifyDataSetChanged回调,因此在这种情况下,您将看不到任何更改,因为片段2当前存在于屏幕中。