我很难搞清楚下一件事。
我有什么:我有一个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;
}
}
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类中填充了我的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中,我有一个listview,每个列表项都有一些textview。加载工作完美:我创建ArrayLists
并使用外部数据库中的数据填充列表。加载完成后,我用这些数据填充列表视图。
在Fragment 2中,我单击按钮,我希望更新listview,以便在listview中创建一个新行,其中包含来自外部数据库的一些数据。 (当然写入数据库工作)
我的猜测,我可能不刷新ArrayLists或者我不重新实例化Fragment1,所以getDataFromSQL()方法永远不会在我退出并再次启动应用程序时转动,或者我在ViewPager中刷了那么多Fragment1被分离。所以我无法更新或刷新Fragment1。有人可以帮助解决这个问题吗?
修改
我设法通过向fragment2发送消息来更新自己。但我不确定它是否是一个好的解决方案,而且没有更好的方法,即只是以某种方式刷新整个片段。
解
好吧,我认为这一定是我的懒惰,但我现在解决了。对于仍然想要从另一个片段刷新片段或者只是在片段之间进行连接的每个人,我告诉你适当的方法:
您必须实现自己的侦听器,以帮助您通过持有者活动在片段之间进行通信。这可以在这里找到:http://developer.android.com/training/basics/fragments/communicating.html。非常简单实用。
你必须检索片段,这又简单了:Retrieve a Fragment from a ViewPager这些Q提供了几种可接受的方式,我使用了SpareArray
解决方案。
无论如何,谢谢你的帮助!
答案 0 :(得分: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调用fragment1上的公共方法,所以只需在你的onClick中使用它,并告诉fragment1更新它的listview。
现在makeFragmentName工作的原因是FragmentPagerAdapter为它所创建的片段创建标记的方式。