FragmentPagerAdapter getItem不被调用
我不能在FragmentPagerAdapter中重用片段。使用destroyItem()方法,它正在删除片段,但仍然不会再调用getItem()..只有2-3图像,所以我使用FragmentPagerAdapter而不是FragmentStatePagerAdapter ..
public class ExamplePagerAdapter extends FragmentPagerAdapter { ArrayList < String > urls; int size = 0; public ExamplePagerAdapter(FragmentManager fm, ArrayList < String > res) { super(fm); urls = res; size = urls.size(); } @Override public int getCount() { if (urls == null) { return 0; } else { return size; } } @Override public void destroyItem(ViewGroup container, int position, Object object) { FragmentManager manager = ((Fragment) object).getFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); trans.remove((Fragment) object); trans.commit(); } @Override public Fragment getItem(int position) { Fragment fragment = new FloorPlanFragment(); Bundle b = new Bundle(); b.putInt("p", position); b.putString("image", urls.get(position)); Log.i("image", "" + urls.get(position)); fragment.setArguments(b); return fragment; } }
在FragmentActivity中,
pager.setAdapter(new ExamplePagerAdapter(getSupportFragmentManager(), res2));
KISS答案:
简单的使用FragmentStatePagerAdapter而不是FragmentPagerAdapter 。
我得到了答案。首先我想删除这个问题,因为我正在做一个非常愚蠢的错误,但这个答案将有助于面临同样的问题,而不是FragmentPagerAdapter
,使用FragmentStatePagerAdapter
。
正如@BlackHatSamurai在评论中提到的那样:
这个工作原因是因为
FragmentStatePagerAdapter
作为不被使用的FragmentStatePagerAdapter
销毁。FragmentPagerAdapter
没有。
使用FragmentStatePagerAdapter
没有完全解决我的问题,这是一个类似的问题,其中onCreateView
没有被视图寻呼机中的子片段调用。 实际上, 我将FragmentPagerAdapter
嵌套到另一个Fragment
因此FragmentManager
在所有这些FragmentManager
共享,从而保留了旧片段的实例。 解决的办法是将getChildFragmentManager
的实例提供给我的主机片段中的FragmentPagerAdapter
的构造函数。 就像是…
FragmentPagerAdapter adapter = new FragmentPagerAdapter(getChildFragmentManager());
getChildFragmentManager()
方法可以通过一个片段访问,这对我来说很有效,因为它为那个片段返回一个私有的FragmentManager
,专门用于需要嵌套片段的情况。 我希望这能帮助那些可能遇到同样问题的人!
- 请记住,要使用
getChildFragmentManager()
您的最小API版本必须至less为17 (4.2)
,所以这可能会在您的齿轮中引发一个扳手。 当然,如果你使用支持库v4的片段,你应该没问题。
有两种不同的情况:1.)每个寻呼机都有相同的布局:在这种情况下,如果您将通过PagerAdapter扩展您的自定义适配器并返回一个布局将会更好。
2.)每个寻呼机都有不同的布局:在这种情况下,如果通过FragmentStatePagerAdapter扩展自定义适配器,并为每个寻呼机返回不同的分片,将会更好。
我做了@ kanika和@ Jraco11发布了,但我仍然有问题。
所以经过很多的修改之后,我发现了一个为我工作,并被添加到我的FragmentPagerAdapter的下一个代码:
@Override public int getItemPosition(Object object) { return POSITION_NONE; }
根据我所读到的, getItemPosition用于通知ViewPager是否刷新一个项目,并避免更新如果可见位置的项目没有改变。
我发现在tab-layout上设置一个监听器可以阻止它被调用,这可能是因为它们只在tabLayout.setOnTabSelectedListener
上有一个监听器空间,而不是监听器数组。