无法从 ViewPager 中的另一个片段刷新/更新片段中的列表视图

Posted

技术标签:

【中文标题】无法从 ViewPager 中的另一个片段刷新/更新片段中的列表视图【英文标题】:Cannot refresh/update listview in a fragment from another fragment in ViewPager 【发布时间】:2013-04-15 11:52:26 【问题描述】:

我很难弄清楚接下来的事情。

我有什么:我有一个浏览器和几个页面。在这个问题中,只有其中两个很重要,我们称它们为 Fragment1 和 Fragment2,它们彼此相邻。 Fragment1 包含一个列表视图,其中填充了来自互联网(外部数据库)的数据。 Fragment2 包含一个简单的按钮。

我的目标:如果我点击 Fragment2 中的按钮,我会在外部数据库中添加一个新项目。我想用这个新项目更新/刷新 Fragment1 中的列表视图。

notifyDataChanged() 在我的情况下不起作用,但到目前为止,我确信它会重新实例化每一页。我将以最清晰的方式介绍我的问题,所以让我们看看我的代码,这是我的ViewPager适配器:

class MyPagerAdapter extends FragmentStatePagerAdapter 
        public List<String> fragmentsA; 

        public MyPagerAdapter(FragmentManager fm) 
            super(fm);
            fragmentsA = fragments;
        

        @Override
        public Fragment getItem(int position) 
           return Fragment.instantiate(context, fragmentsA.get(position));

        

        @Override
        public CharSequence getPageTitle(int position) 
           return mEntries.get(position % CONTENT.length).toUpperCase();
        

        @Override
        public int getCount() 
          return mEntries.size();
        

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

Fragment1 onCreateView()(很快):

public View onCreateView(LayoutInflater inflater, final ViewGroup container,
            Bundle savedInstanceState) 

    getData();
    View view = inflater.inflate(R.layout.latestapps_tab, container, false);
    lw = (ListView) view.findViewById(R.id.lw);
    context = getActivity().getApplicationContext();
    act = this.getActivity();
    m_adapter = new ItemAdapter();
    lw.setAdapter(m_adapter);

return view;

我创建了ViewPager 和适配器,然后我为ViewPager 设置了适配器,然后我在我的主类中用我的片段填充了我的viewpager。在此之后,我将拥有一个带有 2 个片段的功能齐全的 ViewPager。

  pager = (ViewPager)findViewById( R.id.viewpager );
  adapter = new MyPagerAdapter(getSupportFragmentManager());
  indicator = (TabPageIndicator)findViewById( R.id.indicator );
  pager.setAdapter( adapter );
  indicator.setViewPager( pager );
  pager.setCurrentItem(INITIAL_PAGE);
  pager.setOffscreenPageLimit(3);

  //adding fragments to the pager
  fragments.add( Fragment1.class.getName());    
  fragments.add( Fragment2.class.getName()); 

在 Fragment1 中,我有一个列表视图,每个列表项中都有一些文本视图。加载工作完美:我创建了ArrayLists,并用来自外部数据库的数据填充了这些列表。加载完成后,我用这些大量数据填充列表视图。 在片段 2 中,我单击按钮,我希望更新该列表视图,因此应该在列表视图中创建一个新行,其中包含来自外部数据库的一些数据。 (当然写入数据库有效)

我的猜测是,我可能不会刷新 ArrayLists 或者我不会重新实例化 Fragment1,因此只有在我退出并再次启动应用程序或我在 ViewPager 中滑动太多以致 Fragment1 分离时,getDataFromSQL() 方法才不会转动.所以我无法更新或刷新 Fragment1。有人可以帮忙解答这个问题吗?

编辑

我设法通过向 fragment2 传递消息来更新自身来实现这一点。但我不确定这是否是一个好的解决方案并且没有更好的方法,即以某种方式刷新整个片段。

解决方案

好吧,我想这一定是我的懒惰,但我现在解决了。对于仍然想从另一个片段刷新片段或只是在片段之间建立连接的每个人,我告诉你适当的方法:

    您必须实现自己的侦听器,以帮助您通过持有者活动在片段之间进行通信。可以在这里找到:http://developer.android.com/training/basics/fragments/communicating.html。非常简单实用。

    您必须检索片段,这又很简单:Retrieve a Fragment from a ViewPager 这些 Q 提供了几种可接受的方式,我使用了SpareArray 解决方案。

还是谢谢你的帮助!

【问题讨论】:

谁能给我一个建议? 你可以为 Fragment1 发布你的 onCreateView() 吗? 我贴出来了。如果您需要我发布更多内容,请告诉我! ***.com/questions/15924146/…的可能重复 修改后端后,如果在 MyPagerAdapter 上调用 notifyDataSetChanged 会发生什么? 【参考方案1】:

您需要能够从您的活动中获取片段,为此您需要从适配器中获取片段,您需要向页面适配器添加几个方法

public Fragment getFragment(ViewPager container, int position, FragmentManager fm) 
    String name = makeFragmentName(container.getId(), position);
    return fm.findFragmentByTag(name);


private String makeFragmentName(int viewId, int index) 
    return "android:switcher:" + viewId + ":" + index;

然后从您的活动中制作以下方法

public Fragment getFragmentbyPosition(int position) 
    return adapter.getFragment(pager, position, getSupportFragmentManager());

现在在 fragment2 上调用以下内容:

Fragment1 fragment1 = (Fragment1) ((MyActivity)getActivity()).getFragmentbyPosition(0);

现在您将能够从片段 2 调用片段 1 上的公共方法,因此只需在您的 onClick 中使用它并告诉片段 1 更新它的列表视图。

现在 makeFragmentName 起作用的原因是 FragmentPagerAdapter 如何为它制作的片段创建标签。

【讨论】:

2 Fragments 之间的通信绝不能留给Fragments 自己。 Google 建议使用Activity 进行通信:developer.android.com/training/basics/fragments/… true 不建议这样做,我只是展示了用户如何从视图寻呼机获取片段的简单实现。 不建议像 Darwind 所说的那样。我可以进行回调并向 fragment2 传递消息以更新自身。但我不确定是否有更好的解决方案来刷新它。

以上是关于无法从 ViewPager 中的另一个片段刷新/更新片段中的列表视图的主要内容,如果未能解决你的问题,请参考以下文章

我在 viewpager 选项卡中的片段不刷新

刷新标签片段和 viewpager

无法更新 View Pager 中的中间片段。

Android:将“ViewPager”动画从片段更改为片段

listview 没有在带有 viewpager 选项卡的片段中刷新

在 ViewPager 中刷新 Fragment 视图