10

我很难搞清楚下一件事情。无法在ViewPager中的另一个片段中刷新/更新列表视图

我有什么:我有一个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; 
     } 
    } 

片段1 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,我用来自外部数据库的数据填充了列表。加载完成后,我用这些吨数据填充列表视图。 在Fragment 2中,我点击按钮,我希望listview被更新,以便在列表视图中创建一个新行,并使用来自外部数据库的一些数据。 (当然写入数据库的作品)

我的猜测是,我可能不会刷新ArrayLists,或者我不重新实例化Fragment1,所以getDataFromSQL()方法永远不会转动,只有当我退出并重新启动应用程序或我刷卡在ViewPager中这么多,Fragment1被分离。所以我无法更新或刷新Fragment1。有人可以帮助解决这个问题吗?

编辑

我设法使其与传递消息到fragment2自我更新发生。但我不确定它是否是一个好的解决方案,并且没有更好的方法,即只是刷新整个片段。

SOLUTION

好吧,我想这一定是我的懒惰,但现在我解决它。大家谁还想从另一个刷新片段或只是让片段之间的连接如,我告诉你相应的处理方法:

  1. 你必须实现自己的监听器,可以帮助你通过支架上的片段之间的沟通活动。这可以在这里找到:http://developer.android.com/training/basics/fragments/communicating.html。非常简单而有用。

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

谢谢你的帮助!

+0

任何人都可以给我一个建议吗? – 2013-04-26 14:30:13

+0

你可以发布你的onCreateView()为Fragment1吗? – Ethan 2013-04-26 21:35:24

+0

我发布了它。如果您需要我发布更多内容,请告诉我! – 2013-04-26 21:49:48

回答

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

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

现在makeFragmentName工作的原因就是FragmentPagerAdapter如何为它所创建的片段创建标记。

+0

2'Fragments'之间的通信不应该留给自己的'Fragments'。谷歌建议'Activity'进行通信:http://developer.android.com/training/basics/fragments/communicating.html – Darwind 2013-04-26 22:11:08

+0

这是不推荐的,我只是展示了一个简单的用户可能如何获得的实现来自视图寻呼机的片段。 – Eluvatar 2013-04-26 22:16:40

+0

这不建议像Darwind说的那样。我可以进行回调并将消息传递给fragment2以自行更新。但我不确定是否没有更好的解决方案来刷新它。 – 2013-04-26 22:23:30