FragmentPagerAdapter динамически обновлять заголовок

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

enter image description here

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

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

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

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

Ответ 1

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

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
}

Ответ 2

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

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

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.)
}

Ответ 3

Я не думаю, что reset 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));

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

Ответ 4

Хорошо. Таким образом, вы можете иметь метод в 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();
 }

Ответ 5

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

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

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

Ответ 6

у вас есть 3 фрагмента, поэтому вы будете использовать 3 вкладки (первая вкладка hav index 0, вторая 1, третья 2). получить вкладку с помощью индекса и установить ее текст в качестве заголовка. Пусть это поможет тебе, братан

Пример:

TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
tabLayout .getTabAt(index).setText("");

Ответ 7

TabLayout.OnTabSelectedListener будет запущен при переустановке с помощью ViewPager, поэтому я рекомендую обновить заголовок самостоятельно.

viewPager.adapter?.apply {
    for (p in 0..count) {
        tabLayout.getTabAt(p)?.text = getPageTitle(p) ?: break
    }
}