无法刷新/更新ViewPager中另一个片段的片段中的listview

Jan*_*ela 10 android fragment android-listview android-viewpager fragmentpageradapter

我很难搞清楚下一件事.

我拥有:我有一个viewpager和几页.在这个问题中,只有两个是重要的,我们称之为Fragment1和Fragment2,它们彼此相邻.Fragment1包含一个列表视图,其中填充了来自Internet(外部数据库)的数据.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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

我创建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()); 
Run Code Online (Sandbox Code Playgroud)

在Fragment1中,我有一个listview,每个列表项都有一些textview.加载工作完美:我创建了ArrayLists我用外部数据库中的数据填充列表.加载完成后,我用这些数据填充列表视图.在Fragment 2中,我单击按钮,我希望更新listview,以便在listview中创建一个新行,其中包含来自外部数据库的一些数据.(当然写入数据库工作)

我的猜测是,我可能不刷新ArrayLists或者我不重新实现Fragment1,所以getDataFromSQL()方法永远不会在我退出并再次启动应用程序时转动,或者我在ViewPager中刷了很多,以致Fragment1被分离.所以我无法更新或刷新Fragment1.有人可以帮助解决这个问题吗?

编辑

我设法通过向fragment2发送消息来更新自己.但我不确定它是否是一个好的解决方案,并没有更好的方法,即只是刷新整个片段.

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

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

  2. 你必须检索片段,这也很简单:从ViewPager中检索片段这些Q提供了几种可接受的方式,我使用了SpareArray解决方案.

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

Elu*_*tar 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;
}
Run Code Online (Sandbox Code Playgroud)

然后从您的活动中执行以下方法

public Fragment getFragmentbyPosition(int position) {
    return adapter.getFragment(pager, position, getSupportFragmentManager());
}
Run Code Online (Sandbox Code Playgroud)

现在在fragment2上调用以下命令:

Fragment1 fragment1 = (Fragment1) ((MyActivity)getActivity()).getFragmentbyPosition(0);
Run Code Online (Sandbox Code Playgroud)

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

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