关于这个主题有很多讨论
> ViewPager PagerAdapter not updating the View
> Update ViewPager dynamically?
> Removing fragments from FragmentStatePagerAdapter
我尝试了各种解决方案(包括使用POSITION_NONE失效)
.但我仍然不知道如何正确删除项目.
会发生什么
>要么我得到一个空白页面(意味着片段被破坏,但是
没有为替换调用instantiateItem)
>或整个事情崩溃可能是因为Android管理的方式
片段实例与我将它们保存在我的中的方式不匹配
数组列表/ 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,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); }
基本上,您可以根据位置创建片段.无论您移除哪个页面,位置范围都会从[0,iPageCount]更改为[0,iPageCount-1),这意味着它将始终摆脱最后一个片段.
您需要的是或多或少以下内容:
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(); } }