Поддержка TabLayout с FragmentPagerAdapter имеет проблемы с отображением измененных вкладок, которые были добавлены программно.

РЕДАКТИРОВАТЬ: Вау, весь день не мог решить проблему, но через несколько мгновений после отправки и попытки найти еще код для размещения в вопросе я нашел проблему и исправил ее. Я изменю вопрос.

ИСПРАВИТЬ: viewPager.setAdapter(adapter); tabLayout.setupWithViewPager(viewPager);

Новый вопрос. Поскольку ViewPager правильно работает с вкладками, у меня возникают проблемы с отображением того же контента, который отображался раньше. Контент на вкладках A, B, C отображается на вкладках X, Y, Z, но я хочу, чтобы это был другой контент. Обратите внимание, что все вкладки используют новые экземпляры одного и того же фрагмента.

Старый вопрос:

У меня есть библиотека поддержки TabLayout, которая работает достаточно хорошо. При загрузке приложения он загрузит нужные мне вкладки, разрешит прокрутку и изменит правильный фрагмент.

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

При запуске Три вкладки (A, B, C) настроены на загрузку с новым экземпляром того же фрагмента (просто списком). Они отображаются, и все три вкладки прокручиваются и отображают правильную информацию.

Взаимодействие пользователя с вкладками переключения – ПРОБЛЕМА. Три вкладки удалены и заменены двумя вкладками (X, Y). Они устанавливаются на новые экземпляры того же фрагмента сверху. Их можно прокручивать, но здесь начинаются проблемы.

  1. По-прежнему отображаются 3 вкладки (A, B, C)
  2. Я могу прокручивать только первые две вкладки (A -> X, B -> Y).
  3. Если бы я добавил 4+ вкладки (W, X, Y, Z), то у меня отображалось бы 3 вкладки, но я получил бы сбой приложения при прокрутке до последней вкладки.

По щелчку пользователя поддержка библиотеки SearchView Это может произойти в любое время в моем приложении. Он добавит дополнительную вкладку к уже отображаемым вкладкам. Это всегда работает и добавляет новый экземпляр вышеуказанного фрагмента.

Обычный поток: 1. При щелчке SearchView будет добавлена ​​новая вкладка (Поиск) в конец текущих вкладок. Все предыдущие вкладки остаются прежними. 2. При закрытии SearchView он удалит все вкладки, а затем добавит только предыдущие вкладки. Это работает, как и ожидалось.

Если пользователь выполнил обмен вкладками, а затем щелкнул поток SearchView 1. Предыдущие вкладки (т. е. A, B, C) удаляются и заменяются новыми вкладками (т. е. X, Y) 2. Новая вкладка будет добавлена ​​в конец новых вкладок (Поиск). 3. При закрытии SearchView он удалит все вкладки, а затем добавит только новые вкладки (т.е. X, Y). Это работает, как и ожидалось.

ПРИМЕЧАНИЕ, только когда я нажимаю на SearchView, мои вкладки отображаются правильно. В противном случае при взаимодействии пользователя с вкладками подкачки отображаются неправильные вкладки.

При отладке я обнаружил, что это происходит потому, что ТОЛЬКО когда я нажимаю на SearchView, это каким-то образом запускает метод getPageTitle() моего адаптера. Когда пользователь выполняет обмен вкладками, метод getPageTitle() НЕ вызывается, и это приводит к проблемам.

Моя единственная проблема заключается в том, что я не могу найти решение этой проблемы. Здесь много вопросов о подобных проблемах, но ни один из них, похоже, не работает.

Что я пробовал

  1. adapter.notifyDataSetChanged(); после взаимодействия вкладок подкачки
  2. setAdapter(null); setAdapter(adapter);
  3. return POSITION_NONE;
  4. forceLayout(), invalidate() и т.д...

Кажется, сейчас ничего не работает, но решение, похоже, должно быть вызвано getgetPageTitle(). Сделай это, и я буду в порядке. Единственная проблема в том, что я терпел неудачу каждый раз до сих пор

Код

ФрагментПейджерАдаптер

public class ViewPagerFragmentAdapter extends FragmentPagerAdapter {

    private final List<Fragment> fragments = new ArrayList<>(App.getNumberOfApiCalls());
    private final List<String> tabTitles = new ArrayList<>(App.getNumberOfApiCalls());

    public ViewPagerFragmentAdapter(final FragmentManager manager) { super(manager); }

    public void addFragment(final Fragment fragment, final Downloadable tab) {

        fragments.add(fragment);
        tabTitles.add(tab.toString());

    }

    public void clearTabs() {

        fragments.clear();
        tabTitles.clear();

    }

    @Override
    public int getItemPosition(Object item) {

        int index = fragments.indexOf(item);

        if (index == -1) return POSITION_NONE;
        return index;

    }

    @Override
    public Fragment getItem(final int position) { return fragments.get(position); }

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

    @Override
    public CharSequence getPageTitle(final int position) {

        return tabTitles.get(position);

    }

}

person Christopher Rucinski    schedule 25.07.2015    source источник
comment
Хорошо, новый вопрос. Я отредактирую старый вопрос утром. я собираюсь спать   -  person Christopher Rucinski    schedule 25.07.2015
comment
Привет, Кристофер, надеюсь, у тебя все хорошо. Хотели бы вы взглянуть на мой вопрос stackoverflow. com/questions/37252391/ у меня такая же проблема.   -  person Zeeshan Shabbir    schedule 17.05.2016