更新FragmentPagerAdapter中的数据

时间:2014-04-02 12:59:40

标签: android android-fragments android-pageradapter

我的主片段和Viewpager在这个片段中有3页(1)。在主片段(1)中我选择城市并根据城市主片段的值(1)从服务器加载数据并传入FragmentPagerAdapter。第一次一切都好,但是如果我选择另一个城市(2),只有在将页面从一侧滑动到另一侧之后,viewpager中的数据才会更新。

因此,如果我首先选择另一个sity,我会看到空白页1,在向前滑动到第2页和第3页并返回到第1页后,数据在1页和3页上更新,但是2页是空的。

所以我不知道错误在哪里? 谢谢

这是我的FragmentStatePagerAdapter代码

 private class MyPagerAdapter extends FragmentStatePagerAdapter {

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

    @Override
    public int getItemPosition(Object object) {
        Log.d("getItemPosition","123");
        return POSITION_NONE;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        Resources res = getResources();
        String[] title = res.getStringArray(R.array.title_spa_viewpager_array);
        return title[position];
    }

    @Override
    public android.support.v4.app.Fragment getItem(int pos) {
        switch(pos) {
            case 0: return FirstFragment.newInstance(mSpa.getSpaName()+SpaInfoParserObject.MySpaInfo.getSpaInfoText());
            case 1: return SecondFragment.newInstance("",SpaInfoParserObject.MySpaInfo);
            case 2: return PhotoFragment.newInstance("", SpaInfoParserObject.MySpaInfo.getSpaInfoPic(), mSpa);
            default: return FirstFragment.newInstance(mSpa.getSpaPhone());
        }
    }

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

1 个答案:

答案 0 :(得分:2)

您的代码存在两个主要问题。

首先,我看了你之前的一个问题,我看到你使用了:

FragmentManager f = ((FragmentActivity) getActivity()).getSupportFragmentManager();

初始化ViewPager的适配器。这是不正确的,如果您在另一个ViewPager中嵌入Fragment(及其成为嵌套片段的片段),那么您必须使用FragmentManager方法返回的getChildFragmentManager()Fragment类)而不是上面的行。如果您已经使用getChildFragmentManager(),请忽略此部分,否则请更改代码以使用它。

其次,之前已经讨论过更新ViewPager的片段(尽管你使用嵌套片段的过程相同),你需要考虑两个ViewPager&#39的案例; s片段可能是:

  • 片段是当前可见片段或可见片段左/右侧最近的片段(例如,如果位置0是当前可见片段,则在内存中有两个片段:位置0和位置1)。这些片段构建了视图并准备好向用户显示,您需要直接更新其数据/视图(例如,通过调用某些setter方法)。访问此片段的最简单方法是使用this question中的代码(这是非常相关的,同时请注意您使用嵌套片段,因此getFragmentManager()将替换为getChildFragmentManager()

  • 除上述之外的任何其他位置。要处理这种情况,您应该使ViewPager中的每个片段检索onCreateView()中的数据(这将反映新的数据更改),如果用户向该片段滑动,将会调用这些数据。一些示例代码:

    // in the onCreateView()
    YourParentFragmentClass parent = (YourParentFragmentClass) getParentFragment();
    // parent is the Fragment holding the ViewPager and you can use further use it to
    // get data
    

    ViewPager中的每个片段都应该有这段代码来处理数据更新。例如,如果您滑动到第三个片段然后更新数据,则应直接更新片段2和3.然而,当ViewPager将重新创建其视图时(当用户从​​片段3滑动时),片段1将会更新片段2),在那一刻,上面的代码将从父片段中获取最新的数据。

您也不需要将数据作为newInstance()方法中的参数传递。