代码之家  ›  专栏  ›  技术社区  ›  SERG

正在更新FragmentPagerAdapter中的数据

  •  0
  • SERG  · 技术社区  · 12 年前

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

    因此,如果我一开始选择另一所大学,我会看到空白的第1页,在向前滑动到第2页和第3页并返回到第1页后,数据会在第1页和第2页更新,但第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 回复  |  直到 12 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    代码有两个主要问题。

    首先,我看了一下您之前的一个问题,我发现您使用了:

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

    初始化 ViewPager 。如果嵌入 查看寻呼机 (连同成为嵌套片段的片段) Fragment 那么您必须使用 FragmentManager 由返回 getChildFragmentManager() 方法 碎片 class)而不是上面的行。如果您已经使用 getChildFragmentManager() 忽略此部分,否则更改代码以使用它。

    其次,更新 查看寻呼机 前面已经讨论过(尽管您使用嵌套片段,但其过程相同),您需要考虑两种情况,即 查看寻呼机 的片段可能是:

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

    • 除上述位置外的任何其他位置。要处理这种情况,您应该从 查看寻呼机 检索其 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
      

      来自 查看寻呼机 应该有这段代码来处理数据更新。例如,如果您滑动到第三个片段,然后更新数据,则应该直接更新片段2和3。然而,片段1将在 查看寻呼机 将重新创建其视图(当用户从片段3滑动到片段2时),此时,上述代码片段将从父片段中获取新数据,这将是最新的数据片段。

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

    推荐文章