Динамическое удаление элемента из ViewPager с помощью FragmentStatePagerAdapter
Существует довольно много дискуссий вокруг этой темы
ViewPager PagerAdapter не обновляет представление
динамически обновлять 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, и я хочу иметь возможность удалить страницу между ними, например.
Отсюда остается вопрос, каков правильный способ обработки сложения и удаления фрагментов в видоискателе?
Спасибо!
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 таким классным.
Чтобы достичь желаемого эффекта, вам нужно сделать несколько вещей.
- измените FragmentPagerAdapter на FragmentStatePagerAdapter. Причина для это означает, что FragmentPagerAdapter будет хранить все представления, которые он загружает в память навсегда. Где FragmentStatePagerAdapter избавляется от представлений, которые выходят за пределы текущих и проходимых представлений.
Переопределите метод адаптера getItemPosition (показано ниже). Когда мы называем mAdapter.notifyDataSetChanged (); ViewPager опрашивает адаптер, чтобы определить, что изменилось с точки зрения позиционирования. Мы используем этот метод, чтобы сказать, что все изменилось, поэтому переработайте все ваши вид позиционирования. А вот и код...
private class MyPagerAdapter extends FragmentStatePagerAdapter { //... your existing code @Override public int getItemPosition(Object object){ return PagerAdapter.POSITION_NONE; } }
Comments