РЕДАКТИРОВАТЬ: Вау, весь день не мог решить проблему, но через несколько мгновений после отправки и попытки найти еще код для размещения в вопросе я нашел проблему и исправил ее. Я изменю вопрос.
ИСПРАВИТЬ: viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
Новый вопрос. Поскольку ViewPager правильно работает с вкладками, у меня возникают проблемы с отображением того же контента, который отображался раньше. Контент на вкладках A, B, C отображается на вкладках X, Y, Z, но я хочу, чтобы это был другой контент. Обратите внимание, что все вкладки используют новые экземпляры одного и того же фрагмента.
Старый вопрос:
У меня есть библиотека поддержки TabLayout
, которая работает достаточно хорошо. При загрузке приложения он загрузит нужные мне вкладки, разрешит прокрутку и изменит правильный фрагмент.
На меня наложили ограничение, и мне нужно изменить текущую реализацию, чтобы отключить вкладки и заменить их новыми вкладками в зависимости от взаимодействия с пользователем. Когда я это сделал, я начал сталкиваться с проблемами.
При запуске Три вкладки (A, B, C) настроены на загрузку с новым экземпляром того же фрагмента (просто списком). Они отображаются, и все три вкладки прокручиваются и отображают правильную информацию.
Взаимодействие пользователя с вкладками переключения – ПРОБЛЕМА. Три вкладки удалены и заменены двумя вкладками (X, Y). Они устанавливаются на новые экземпляры того же фрагмента сверху. Их можно прокручивать, но здесь начинаются проблемы.
- По-прежнему отображаются 3 вкладки (A, B, C)
- Я могу прокручивать только первые две вкладки (A -> X, B -> Y).
- Если бы я добавил 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()
НЕ вызывается, и это приводит к проблемам.
Моя единственная проблема заключается в том, что я не могу найти решение этой проблемы. Здесь много вопросов о подобных проблемах, но ни один из них, похоже, не работает.
Что я пробовал
adapter.notifyDataSetChanged();
после взаимодействия вкладок подкачкиsetAdapter(null); setAdapter(adapter);
return POSITION_NONE;
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);
}
}