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

В этой теме обсуждается довольно много дискуссий

  • ViewPager PagerAdapter не обновляет вид
  • Обновлять ViewPager динамически?
  • Удаление фрагментов из FragmentStatePagerAdapter

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

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

  • Либо я получаю пустую страницу (это означает, что фрагмент уничтожен, но instantiateItem не был вызван для замены)
  • Или все это происходит, вероятно, из-за того, что способ управления экземплярами фрагмента Android не соответствует тому, как я храню их в своем 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(); } } 

Я использую view pager с ViewPagerIndicator, и я хочу, например, удалить страницу между ними.

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

Благодаря!

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

 @Override public Fragment getItem(int position) { return CreateWishFormDatePaginationFragment.newInstance(position); } 

По существу, то, что приведенный выше код означает, что вы создаете Fragment основанный на position . Поэтому, независимо от того, какую страницу вы удаляете, диапазон позиции изменится с [0, iPageCount ] на [0, iPageCount-1 ) , что указывает на то, что он всегда будет избавляться от последнего.


Вам нужно более или менее следующее:

 public class DatePickerPagerAdapter extends FragmentStatePagerAdapter { private ArrayList<Integer> page_indexes; public DatePickerPagerAdapter(FragmentManager fm) { super(fm); page_indexes = new ArrayList<>(); for (int i = 0; i < 10; i++) { page_indexes.add(new Integer(i)); } } @Override public int getCount() { return page_indexes.size(); } @Override public Fragment getItem(int position) { Integer index = page_indexes.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 page_indexes.remove(position); // Notify the adapter that the data set is changed notifyDataSetChanged(); } } 

Подробные сведения об удалении элемента из FragmentStatePagerAdapter см. В этом полном примере .

Intereting Posts
Анализ ASP.NET MVC с датой использования библиотеки Jackson JSON в Java Как вы помещаете границу вокруг ListView? Сброс общих данных: размер карты не равен 0 после сброса Может PackageManager.getInstallerPackageName () сказать мне, что мое приложение было установлено из магазина приложений Amazon? Использование генератора стиля Action bar с генератором голографических цветов Есть ли способ запустить приложение сразу после установки с помощью некоторого «вспомогательного приложения»? Длительное нажатие кнопки GestureDetector также срабатывает при нажатии API Android Google Maps v2: не удалось загрузить карту. Не удалось связаться с серверами Google. Результаты запроса sqlite для сортировки Android игнорируются Несовместимые типы: не может лизать зрителя в держатель изображения Программно свернуть группу в ExpandableListView Проверьте пример примера приложения subbr pro, но для моего приложения проверьте mp3 Текст уведомления слишком длинный и не отображается полный текст Обходное сопоставление между NetworkInfo и NetworkInterface Как использовать getlinecount () в textview android