Удалить элемент viewpager без перезагрузки других элементов

#android #android-viewpager

#Android #android-viewpager

Вопрос:

Я использовал FragmentPagerAdapter.Когда я удаляю элемент из списка элементов и notifyDataSetChanged .Перезагрузка фрагментов.В этом случае я теряю данные в других фрагментах.Как добиться этого без потери данных в других фрагментах

 public class BasicViewPagerAdapter extends FragmentPagerAdapter {

private final List<Fragment> mFragments;

public BasicViewPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
    super(fm);
    this.mFragments = fragments;
}

@Override
public Fragment getItem(int i) {
    return mFragments.get(i);
}


@Override
public int getCount() {
    return mFragments.size();
}


public void remove(int cashBoxPosition) {
    mFragments.remove(cashBoxPosition);
    notifyDataSetChanged();
}
  

}

fragmentList.remove(event.getCashBoxPosition()); mAdapterViewPager.remove(event.getCashBoxPosition());

Ответ №1:

сохраните и восстановите состояние через onSaveInstanceState/onViewStateRestored в ваших фрагментах, где вы хотите сохранить данные, это единственный способ сделать это

Комментарии:

1. теперь я использую viewpager 2. Но он удаляет последний элемент, не выбранный мной :). Вы знаете, как исправить?

2. пытался ли вызвать notifyItemChanged(position) вместо notifyDataSetChanged() ?

3. это не помогает. Сбой приложения. Следует использовать notifyDataSetChanged после notifyItemChanged(позиция). Если я использую notifyDataSetChanged после этого ничего не произойдет. Снова удаление последнего элемента

Ответ №2:

Наконец-то решено с помощью viewpager2

 public class BasicViewPager2Adapter extends FragmentStateAdapter {

private List<Fragment> mFragments;

public BasicViewPager2Adapter(FragmentActivity fa, List<Fragment> fragments) {
    super(fa);
    this.mFragments = fragments;
}

@NonNull
@Override
public Fragment createFragment(int i) {
    return mFragments.get(i);
}

@Override
public int getItemCount() {
    return mFragments.size();
}

@Override
public long getItemId(int position) {
    return mFragments.get(position).hashCode();
}

@Override
public boolean containsItem(long itemId) {
    return super.containsItem(itemId);
}

public void remove(int cashBoxPosition) {
    mFragments.remove(cashBoxPosition);
    notifyDataSetChanged();
}
  

}