[英]Remove all fragments from ViewPager populated by FragmentStatePagerAdapter
[英]Dynamically remove an item from a ViewPager with FragmentStatePagerAdapter
关于这个主题有很多讨论
我尝试了各种解决方案(包括使用POSITION_NONE
失效)。 但我仍然不知道如何正确删除项目。
会发生什么
instantiateItem
项目没有被调用替换) arraylist/sparsearray
保存它们的方式arraylist/sparsearray
这是我的适配器
private class DatePickerPagerAdapter extends FragmentStatePagerAdapter {
ArrayList<Fragment> registeredFragments = new ArrayList<Fragment>();
public DatePickerPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return CreateWishFormDatePaginationFragment.newInstance(position);
}
@Override
public int getItemPosition(Object object){ //doesnt change much..
return PagerAdapter.POSITION_NONE;
}
@Override
public int getCount() {
return iPageCount;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
registeredFragments.add(position, fragment);
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, registeredFragments.get(position));
}
public void removePage(ViewGroup pager, int position) {
destroyItem(pager, position, null);
registeredFragments.remove(position);
iPageCount--;
pagerIndicator.notifyDataSetChanged();
pagerAdapter.notifyDataSetChanged();
}
public void addPage() {
iPageCount++;
pagerIndicator.notifyDataSetChanged();
pagerAdapter.notifyDataSetChanged();
}
}
我正在使用ViewPagerIndicator的视图寻呼机,我希望能够删除其间的页面,例如。
因此,问题是,在ViewPager中处理片段的添加和删除的正确方法是什么?
谢谢!
如果要从ViewPager
删除项目,以下代码没有意义:
@Override
public Fragment getItem(int position) {
return CreateWishFormDatePaginationFragment.newInstance(position);
}
基本上,您可以根据position
创建Fragment
。 无论您移除哪个页面, position
范围都会从[0, iPageCount
]更改为[0, iPageCount-1
) ,这意味着它将始终摆脱最后一个Fragment
。
您需要的是或多或少以下内容:
public class DatePickerPagerAdapter extends FragmentStatePagerAdapter
{
private ArrayList<Integer> pageIndexes;
public DatePickerPagerAdapter(FragmentManager fm) {
super(fm);
pageIndexes = new ArrayList<>();
for (int i = 0; i < 10; i++) {
pageIndexes.add(new Integer(i));
}
}
@Override
public int getCount() {
return pageIndexes.size();
}
@Override
public Fragment getItem(int position) {
Integer index = pageIndexes.get(position);
return CreateWishFormDatePaginationFragment.newInstance(index.intValue());
}
// This is called when notifyDataSetChanged() is called
@Override
public int getItemPosition(Object object) {
// refresh all fragments when data set changed
return PagerAdapter.POSITION_NONE;
}
// Delete a page at a `position`
public void deletePage(int position)
{
// Remove the corresponding item in the data set
pageIndexes.remove(position);
// Notify the adapter that the data set is changed
notifyDataSetChanged();
}
}
有关从FragmentStatePagerAdapter中删除项目的更多详细信息,请参阅此完整示例 。
ViewPager不会使用上面的代码删除您的片段,因为它会将多个视图(或您的案例中的片段)加载到内存中。 除了可见视图外,它还将视图加载到可见视图的任一侧。 这提供了从视图到视图的平滑滚动,使ViewPager非常酷。
要达到您想要的效果,您需要做一些事情。
覆盖适配器方法getItemPosition(如下所示)。 当我们调用mAdapter.notifyDataSetChanged(); ViewPager询问适配器以确定在定位方面发生了哪些变化。 我们使用此方法表示所有内容都已更改,因此重新处理所有视图定位。 这是代码......
private class MyPagerAdapter extends FragmentStatePagerAdapter { //... your existing code @Override public int getItemPosition(Object object){ return PagerAdapter.POSITION_NONE; } }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.