FragmentPagerAdapter 动态更新标题

FragmentPagerAdapter update title dynamically

我有一个带有 FragmentPagerAdapter 的 ViewPager,它有 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 上发现了几个类似的问题,但我需要更新 title,而不仅仅是片段本身。

好的。因此,您可以在 FragmentPagerAdapter 中使用一个方法来更新 notFoundItemsfoundItemsitemsForReview 的计数。更新它们后,调用 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 class 的实施中。所以每当你有一个新的数据计数并想更新标题时,调用这个方法。

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

最后,我通过简单地重新设置寻呼机解决了这个问题。

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
}

我不认为重置 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));

首先,您需要使用TabLayoutgetTabAt方法来更改选项卡的模型。然后调用 setTabTextColors 更新视图。因为从TabLayout的源码来看,setTabTextColors会一个一个的更新所有tab

正如它下面的评论之一所暗示的那样,接受的答案对我来说有点过分了。

基于,这是我所做的:

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() 中设置初始标题

您有 3 个片段,因此您将使用 3 个选项卡(第一个选项卡的索引为 0,第二个为 1,第三个为 2)。 使用索引获取您的标签并将她的文本设置为标题。 希望这对你有帮助兄弟

示例:

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

TabLayout.OnTabSelectedListener会在re-setup时触发ViewPager,所以我建议自己更新标题。

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