无法从ViewPager中的另一个Fragment刷新/更新片段中的ListView

10

我正在努力找出下一步该做什么。

我的现状:我有一个ViewPager,并且其中包含几个页面。在这个问题中,只有两个页面是重要的,我们称它们为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 中,在主类中用碎片填充我的视图页。完成后,我将拥有一个具有 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 并用来自外部数据库的数据填充这些列表。加载完成后,我使用这些大量数据填充列表视图。 在 Fragment 2 中,我点击按钮,希望更新该列表视图,以便在列表视图中创建一个新行,并从外部数据库获取一些数据。(当然,写入到数据库是有效的)

我的猜测是,我可能没有刷新 ArrayLists,或者我没有重新实例化 Fragment1,所以 getDataFromSQL() 方法从不返回,除非我退出并重新启动应用程序,或者我在 ViewPager 中滑动太多次,使 Fragment1 被分离。因此,我无法更新或刷新 Fragment1。有人能在这个问题上提供帮助吗?

编辑

我设法通过向 Fragment2 传递消息来更新它自己。但我不确定这是否是一个好的解决方案,是否有更好的方法,例如只是在某种方式下刷新整个 Fragment。

解决方案

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

  1. 您必须实现自己的监听器,该监听器通过 holder activity 帮助您在片段之间通信。这可以在此处找到:http://developer.android.com/training/basics/fragments/communicating.html非常简单和有用。

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

无论如何,谢谢您的帮助!


有人能给我提个建议吗? - Jani Bela
你能发一下Fragment1的onCreateView()吗? - Ethan
我已经发布了。如果您需要我发布更多内容,请告诉我! - Jani Bela
可能是 http://stackoverflow.com/questions/15924146/update-listview-in-from-other-fragment/ 的重复问题。 - Darwind
如果在对后端进行修改后调用MyPagerAdapter上的notifyDataSetChanged会发生什么? - Ethan
1个回答

3

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

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);

现在你可以从fragment2调用fragment1的公共方法,所以只需在onClick中使用它并告诉fragment1更新它的listview。
现在makeFragmentName之所以有效是因为这是FragmentPagerAdapter创建其制作的片段标签的方式。

两个 Fragments 之间的通讯永远不应该让它们自行处理。Google 建议由 Activity 来处理通讯:http://developer.android.com/training/basics/fragments/communicating.html - Darwind
真实这并不被推荐,我只是展示了一个简单的实现方式,用户可以从视图翻页器中获取片段。 - Eluvatar
这并不被推荐,就像Darwind所说的那样。我可以创建一个回调函数,并向Fragment2传递消息以更新它自己。但是我不确定是否有更好的解决方案来刷新它。 - Jani Bela

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接