Динамическое удаление элемента из ViewPager с помощью FragmentStatePagerAdapter



Существует довольно много дискуссий вокруг этой темы




Я пробовал различные решения (в том числе недействительность с POSITION_NONE)
. Но я все еще не знаю, как правильно удалить элемент.



Что происходит-это




  • либо я получаю пустую страницу (имеется в виду фрагмент разрушен, но
    instantiateItem не был вызван для замены)

  • или все это рушится, вероятно, потому, что способ, которым Андроид управляет
    фрагментные экземпляры не соответствуют тому, как я их храню в своем
    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, и я хочу иметь возможность удалить страницу между ними, например.



Отсюда остается вопрос, каков правильный способ обработки сложения и удаления фрагментов в видоискателе?



Спасибо!

659   2  

2 ответов:

Если вы хотите удалить элементы из ViewPager, Этот следующий код не имеет смысла:

@Override
public Fragment getItem(int position) {
    return CreateWishFormDatePaginationFragment.newInstance(position);
}
По существу, вы создаете Fragment на основе position. Независимо от того, какую страницу вы удалите, диапазон 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;
        }
    }
    

Comments

    Ничего не найдено.