实例化后如何在viewpager中替换片段?

时间:2014-07-23 00:56:47

标签: android android-fragments android-viewpager

据我所知,viewpager的屏幕外页面限制必须至少为1.我正在尝试动态更改浏览器中的片段,因为我不断从服务器获取信息。 例如,当我查看片段B时,我有片段A,B,C实例化。 我想更改Fragment A的信息,所以我更新它并调用notifyDataSetChanged()。我没有创建一个新的片段并将其插入其位置,但更改了与原始片段关联的imageview。

然而,一旦我尝试导航到A,我遇到一个错误,说“片段当前不在FragmentManager中”

有人可以向我解释我是如何在浏览器中的直接页面之间来回跳转,同时允许这些页面改变他们的观点吗?

2 个答案:

答案 0 :(得分:1)

我没有这样做,但我的建议是不要尝试。 Android在幕后引入了很多魔力,你很可能会在尝试实现你想要的东西时遇到很多问题。当我尝试为每个列表项保存contentView时,我有使用ListView的经验,因此Android只会渲染一次,因为每次我放弃了这个想法,因为我每次都更改了默认行为,出现了新的问题(例如视图中有两个父母的例外情况)。我设法实现了这一点,但代码非常糟糕。

为什么不尝试,例如,保存您已下载到光盘上的图像,并检索片段是否实际出现在屏幕上?在这种情况下,毕加索图书馆可以提供帮助

答案 1 :(得分:0)

为此,您应创建一个FragmentPagerAdapter,以便在创建页面时保存对其的引用。像这样:

public class MyPagerAdapter extends FragmentPagerAdapter {
    SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();

    public MyPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position)
        {
        case 0:
            return MyListFragment.newInstance(TAB_NAME_A);  
        case 1:
            return MyListFragment.newInstance(TAB_NAME_B);
        case 2:
            return MyListFragment.newInstance(TAB_NAME_C);
        default:
            return null;
        }           
    }

    @Override
    public int getCount() {
        // Show 3 total pages.
        return TOTAL_PAGES;
    }       

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

        registeredFragments.put(position, fragment);

        return fragment;
    }

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

        super.destroyItem(container, position, object);
    }

    public Fragment getRegisteredFragment(int position) {
        return registeredFragments.get(position);
    }   
} 

您可以访问这样的特定页面:

((MyListFragment) myPagerAdapter.getRegisteredFragment(0)).updateUI();

其中updateUI()是一种自定义方法,用于更新该页面上的列表并调用notifyDataSetChanged()