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上有一个监听器空间,而不是监听器数组。