Intereting Posts
Диалог прогресса по открытой деятельности PHP HTTP POST на Android-устройстве с использованием HttpURLConnection Android: порядок заявлений в методе onDestroy () Android make custom layout shape Ошибка (1,1) illegalcharacter '\ ufeff' при компиляции на студии android Изменить клавиатуру Android по умолчанию с использованием кода ADB или Java Android – открытие приложения gmail с моим приложением Ошибка при ожидании устройства: тайм-аут после 300 секунд, ожидающий выхода эмулятора ПРЕДУПРЕЖДЕНИЕ: невозможно записать файл кэша jarlist Ошибка: не удалось выполнить целевое «андроид-2» PopupWindow перекрывает программные кнопки на Android 5.0 Каков правильный способ справиться с изменением ориентации, когда пользовательский alertdialog имеет открытый счетчик? Исходящее сообщение не отправляется Как открыть страницу разработчика в Google Play Store (рынок: //) Приложение Android не запрашивает разрешения при установке

Динамическое обновление заголовка FragmentPagerAdapter

У меня есть ViewPager с FragmentPagerAdapter, у которого есть 3 фрагмента. Теперь у меня есть ряд элементов как часть названия фрагмента:

Введите описание изображения здесь

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

Как можно вспомнить этот метод для обновления названий FragmentPagerAdapter?

@Override public CharSequence getPageTitle(int position) { switch (position) { case 0: return items + " (" + notFoundItems + ")"; case 1: return found; case 2: return review; } return ""; } 

Я нашел пару подобных вопросов на SO, но мне нужно обновить заголовок , а не только сам фрагмент.

Solutions Collecting From Web of "Динамическое обновление заголовка FragmentPagerAdapter"

Наконец, я решил это, просто переустановив пейджер.

 private OrdersTabsAdapter tabsAdapter; @InjectView(R.id.tabs_orders) SlidingTabLayout ordersTabs; @InjectView(R.id.pager) ViewPager pager; public void update() { tabsAdapter.updateFragments(productId, status); ordersTabs.setViewPager(pager); //this helped with the titles } 

Хорошо. Таким образом, вы можете иметь метод в FragmentPagerAdapter который будет обновлять счетчик для notFoundItems , foundItems , itemsForReview . После их обновления вызовите notifyDataSetChanged() .

  @Override public CharSequence getPageTitle(int position) { switch (position) { case 0: return items + " (" + notFoundItems + ")"; case 1: return found + " (" + foundItems + ")"; case 2: return review + " (" + itemsForReview + ")"; } return ""; } 

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

  public void updateTitleData(int notFoundItems, int foundItems, int itemsForReview) { this.notFoundItems = notFoundItems; this.foundItems = foundItems; this.itemsForReview = itemsForReview; notifyDataSetChanged(); } 

Я не думаю, что сброс ViewPager и notifyDataSetChange – хорошая идея. Потому что это приведет к воссозданию представления в ViewPager. Это не нужно.

И я нашел другой способ решить проблему.

  List<OrderListResult.TradeStatusVOsEntity> tradeStatusVOs = updateTitleEvent.getTradeStatusVOs(); for (int i = 0; i < tradeStatusVOs.size(); i++) { OrderListResult.TradeStatusVOsEntity tradeStatusVOsEntity = tradeStatusVOs.get(i); int num = tradeStatusVOsEntity.getNum(); String text = mAdapter.getPageTitle(i).toString(); if (num > 0) { text = text + "(" + num + ")"; } mButterTabs.getTabAt(i).setText(text); } mButterTabs.setTabTextColors(getResources().getColor(android.R.color.darker_gray), getResources().getColor(R.color.yellow)); 

Во-первых, вам нужно использовать метод TabLayout для изменения модели вкладки. Затем вызовите setTabTextColors для обновления вида. Поскольку из исходного кода TabLayout, setTabTextColors будет обновлять все вкладки один за другим.

Как следует из одного из комментариев к нему, принятый ответ выглядит немного излишним для меня.

Основываясь на ответе Фрэнка , это то, что я сделал:

 public void myUpdatePageTitle(int pagePosition, int numItems) { TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); TabLayout.Tab tab = tabLayout.getTabAt(pagePosition); if (tab != null) { tab.setText(myCalcTabTitle(pagePosition, numItems)); } } private String myCalcTabTitle(int pagePosition, int numItems) { //TODO - For this page, return whatever title string you like, including the numItems value. (The best way to do this is using a string resource that accepts a decimal parameter.) } 

Нет никакого смысла в настройке вашего пейджера каждый раз.
У вас уже отключен getPageTitle (), и вам просто не удалось отслеживать, когда ваши страницы были изменены, и когда настало время обновить заголовок.
Таким образом, вы можете легко сделать это:

 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int position) { // your tite is: mAdapter.getPageTitle(position)); // TODO: update title } }); 

Также вам нужно будет установить начальный заголовок в onCreate ()