我对FragmentPagerAdapter
不熟悉,所以这将是那些需要(你)批判性阅读说明的问题之一。
结构:我有一个FragmentPagerAdapter
(下面是代码),它将同时持有两个片段。第一个显示书摘,第二个显示书名列表。
目标:我想实现标题中描述的功能:用户可以导航到页面器中的第二个片段,点击标题,然后将用户移回到第一个片段并告诉第一个片段更新文本。第一个片段有一个triggerRefresh
方法来实现此目的。
代码:我认为我的问题发生在FragmentPagerAdapter
重用/创建片段的方式上(我不理解这种方式)。这是我的类:
static class MyFragmentPagerAdapter extends FragmentPagerAdapter {
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
switch(position) {
case 0:
return new ExcerptsFragment();
case 1:
return new BookListFragment();
default:
throw new IllegalArgumentException("not this many fragments: " + position);
}
}
}
这是我创建相关成员的方法:
ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
MyFragmentPagerAdapter mFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mFragmentPagerAdapter);
当我从书标题片段收到所选标题的回调时,这是我在我的活动中尝试过的另一种方法:
mViewPager.setCurrentItem(0); // back to excerpts screen page. It's OK.
// Here's the problem! How to identify the fragment 0
// to ExcerptsFragment and call its triggerRefresh()?!?
问题系列:
调用适配器的 getView()
方法不起作用,因为它将返回一个新的 ExcerptsFragment
实例,而这个实例并没有被当前附加(如预期的那样,会抛出异常)。
我在这里看到很多人(示例)只是在 getView()
中存储片段。这样做对吗?因为从官方示例来看,似乎是一种反模式(通过持有项目来打败自动引用)。这也是这里和这里的观点(并且在我看来是正确的)。
有什么建议吗?如果我一点都不理解这个问题,我也不会感到惊讶...
instantiateItem
的解决方案可能不足够) - morgwai