我不能够在FragmentPagerAdapter重用片段..使用destroyItem()方法,它是删除片段,但所以我用FragmentPagerAdapter相反FragmentStatePagerAdapter仍然没有所谓的getItem()again..There只是2-3图片..
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
破坏为未使用的片段。 FragmentPagerAdapter
没有。
使用FragmentStatePagerAdapter
没有完全解决我的问题这是一个类似的问题,即onCreateView
没有被要求在视图寻呼机子片段。 我其实筑巢我FragmentPagerAdapter
另一内部Fragment
因此FragmentManager
在整个所有的人共享,从而保留旧片段的实例。 此修复程序是不是喂的实例getChildFragmentManager
到的构造FragmentPagerAdapter
在我的主机片段。 就像是...
FragmentPagerAdapter adapter = new FragmentPagerAdapter(getChildFragmentManager());
该getChildFragmentManager()
方法是通过片段访问,这个工作对我来说,因为它返回一个私人FragmentManager
该片断专门为这是需要嵌套的片段的情况。 我希望这可以帮助别人谁可能有同样的问题我!
- 但是请记住使用
getChildFragmentManager()
您的最低API版本至少要包含17 (4.2)
所以这可能会在你扔的齿轮扳手。 当然,如果你使用的片段从支持库V4,你应该没问题。
我做了什么@kanika和@ Jraco11贴过,但我仍然有问题。
所以,很多的变化后,我发现一个很适合我,并加入到我的FragmentPagerAdapter接下来的代码:
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
根据我读,getItemPosition用来通知ViewPager是否要刷新的项目,并避免更新,如果在可见位置的项目并没有改变。
有两种不同的情况:1)你必须为每一个寻呼机相同的布局:在这种情况下,它会更好,如果你通过PagerAdapter扩展您的自定义适配器,并返回一个布局。
2)你必须为每一个寻呼机不同的布局:在这种情况下,它会更好,如果你通过FragmentStatePagerAdapter扩展您的自定义适配器,并为每一个寻呼机返回不同fragmets。
覆盖long getItemId (int position)
FragmentPagerAdapter
缓存它会用碎片getItem
。 我当时甚至要求后,面临着同样的发出─ notifyDataSetChanged()
getItem
没有被调用。
这实际上是一个功能,而不是一个错误。 你需要重写getItemId
,这样就可以正确地重复使用您的片段。 既然你要删除的片段,你的位置在变化。 由于在文档中提到:
long getItemId (int position)
在给定的位置返回该项目的唯一标识符。
默认实现返回给定位置。 子类应覆盖这个方法,如果项目的位置可以改变。
只需提供一个唯一的ID给每个片段,就大功告成了。
使用FragementStatePagerAdapter
或返回POSITION_NONE
在int getItemPosition (Object object)
是错误的。 你不会得到任何缓存。
方法getItem()
仅用于创建新项目。 一旦创建,此方法将不会被调用。 如果你需要得到的货币通过适配器使用项目,使用此方法:
pagerAdapter.instantiateItem(viewPager, TAB_POS)
我发现,设置在标签布局的监听器停止这个被称为,可能是因为他们只有空间,一个监听器tabLayout.setOnTabSelectedListener
而不是侦听器的数组。