簡體   English   中英

使用FragmentStatePagerAdapter從ViewPager動態刪除項目

[英]Dynamically remove an item from a ViewPager with FragmentStatePagerAdapter

關於這個主題有很多討論

我嘗試了各種解決方案(包括使用POSITION_NONE失效)。 但我仍然不知道如何正確刪除項目。

會發生什么

  • 要么我得到一個空白頁面(意味着片段被銷毀,但是instantiateItem項目沒有被調用替換)
  • 或整個事情崩潰可能是因為Android管理片段實例的方式與我在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非常酷。

要達到您想要的效果,您需要做一些事情。

  1. 將FragmentPagerAdapter更改為FragmentStatePagerAdapter。 這樣做的原因是FragmentPagerAdapter會將它加載的所有視圖永久保存到內存中。 FragmentStatePagerAdapter處理位於當前和可遍歷視圖之外的視圖。
  2. 覆蓋適配器方法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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM