Динамическое обновление заголовка 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 ()