android – 使用FragmentStatePagerAdapter从ViewPager动态删除项目

前端之家收集整理的这篇文章主要介绍了android – 使用FragmentStatePagerAdapter从ViewPager动态删除项目前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
关于这个主题有很多讨论

> 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();
    }
}

有关从FragmentStatePagerAdapter中删除项目的更多详细信息,请参阅此完整的example.

猜你在找的Android相关文章