我有什么:我有一个看门人和几页.在这个问题中,只有两个是重要的,可以称之为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设置了适配器,之后我在Main类中填充了我的碎片.之后,我goint有一个功能齐全的ViewPager与2片段.
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中,我有一个列表视图,每个列表项中都有一些textview.加载工作完美:我创建了ArrayLists,我从外部数据库的数据填充列表.加载完成后,我将使用这些吨数据填充列表.
在片段2中,单击按钮,我希望更新该列表视图,以便在列表视图中创建一个新行,并从外部数据库中提供一些数据. (当然写入数据库的作品)
我的猜测是,我不能刷新ArrayLists或者我不会重新启动Fragment1,所以只有当我退出并再次启动应用程序时,getDataFromsql()方法才会转换,或者我在ViewPager中滑动Fragment1被分离.所以我无法更新或刷新Fragment1.有人可以帮助这个问题吗?
编辑
我设法通过向fragment2发送消息来更新自身,从而实现这一点.但我不知道这是否是一个很好的解决方案,没有一个更好的方法,即只是刷新整个片段.
解
好的,我认为这一定是我的懒惰,但我现在解决了.对于仍然想要从另一个更新片段的人,或者只是在片段之间进行连接,我会告诉你适当的方法:
>您必须实现自己的监听器,通过持有人的活动来帮助您在片段之间进行沟通.这可以在这里找到:http://developer.android.com/training/basics/fragments/communicating.html.非常简单有用.
>您必须检索片段,这又是简单的:Retrieve a Fragment from a ViewPager这些Q提供了几种可接受的方式,我使用了SpareArray解决方案.
感谢您的帮助反正!
解决方法
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()); }
现在在片段2上调用如下:
Fragment1 fragment1 = (Fragment1) ((MyActivity)getActivity()).getFragmentbyPosition(0);
现在您将能够从片段2调用fragment1上的公共方法,因此只需在您的onClick中使用该方法,并告诉fragment1来更新它的列表.
现在makeFragmentName起作用的原因就是FragmentPagerAdapter如何创建它所生成片段的标签.