Несоответствие номера ребенка в ViewPager - PullRequest
0 голосов
/ 08 октября 2018

У меня есть ViewPager, чьи getCount(); изменяются в зависимости от списка объектов, переданных через конструктор.Используя adapter.notifyDataSetChanged();, я ожидаю увидеть еще одну страницу.Кажется, это работает правильно, но когда я удаляю элемент из упомянутого списка (используемый для вычисления getCount()), ViewPager удаляет страницу только успешно, если она находится вне offsetLimit.

Пример : у меня есть две страницы, и через кнопку я удаляю элемент из списка.Затем я звоню notifyDataSetChanged() и ожидаю, что у меня останется только одна страница, но ... вторая "Страница" все еще там, даже если я не могу провести по ней !!!!

Как я могу обойти это? Я хочу избежать повторного создания всего ViewPager с фрагментами.

КОД (упрощение)

public class Adapter extends FragmentStatePagerAdapter {

    private final List<String> list;

    public Adapter(FragmentManager fragmentManager, List<String> list) {
        super(fragmentManager);
        this.list = list;
    }

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

}

И это внутри Задания:

        adapter = new Adapter(getSupportFragmentManager(), items);

        final ViewPager pager = findViewById(R.id.pager);
        pager.setAdapter(adapter);

        findViewById(R.id.add).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                items.add("test");
                adapter.notifyDataSetChanged();
            }
        });

        findViewById(R.id.remove).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                items.remove(items.size() - 1);
                adapter.notifyDataSetChanged();
            }
        });

С этим я могу добавлять предметыот Activity и обновить де адаптер (он работает) и удалить ... его не работает.Что я могу сделать?

1 Ответ

0 голосов
/ 08 октября 2018

Вы можете переопределить getItemPosition() и вернуть POSITION_NONE в нем.


getItemPosition () :

Вызывается, когда представление хоста пытается определить, изменилась ли позиция элемента.Возвращает POSITION_UNCHANGED , если позиция данного элемента не изменилась, или POSITION_NONE , если элемент больше не присутствует в адаптере.

Реализация по умолчанию предполагает, что элементы будутникогда не менять позицию и всегда возвращает POSITION_UNCHANGED .

...