【问题标题】:Updating data in FragmentPagerAdapter在 FragmentPagerAdapter 中更新数据
【发布时间】:2014-04-14 18:24:19
【问题描述】:

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

因此,如果我首先选择另一个站点,我会看到空白页 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;
    }
}

【问题讨论】:

  • 尝试使用 FragmentStatePagerAdapter 而不是 fragmentpageradapter

标签: android android-fragments android-pageradapter


【解决方案1】:

您的代码有两个主要问题。

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

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

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

其次,之前已经讨论过更新ViewPager 的片段(尽管您使用嵌套片段的过程相同),您需要考虑ViewPager 的片段可能是以下两种情况:

  • 片段要么是当前可见片段,要么是可见片段左侧/右侧最近的片段(例如,如果位置 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() 方法中将数据作为参数传递。

【讨论】:

  • 感谢您的回答。我正在尝试使用此变体stackoverflow.com/a/17855730/563047,但它不起作用。我什至开始另一个关于 getItemPosition() 的问题。好像完全看不懂。
  • 我给你发一份存档。谢谢
  • 我通过 gmail 将其发送到您的电子邮件
  • 或者你已经有一个例子了?将它发送到我的电子邮件benderlio@gmail.com 谢谢
  • @SERG 我已经向您发送了一封电子邮件,地址是您向我发送项目的地址。不要忘记对该 bat 文件进行更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多