FragmentPagerAdapter动态更新标题

时间:2015-04-30 15:45:55

标签: android android-fragments android-viewpager

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

7 个答案:

答案 0 :(得分:7)

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

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
}

答案 1 :(得分:6)

正如其中的一条评论所暗示的那样,接受的答案对我来说有点过分了。

基于Frank's answer,这就是我所做的:

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

答案 2 :(得分:2)

我不认为重置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的{​​{1}}方法来更改标签的模型。然后调用TabLayout更新视图。因为从TabLayout的源代码,setTabTextColors将逐个更新所有选项卡。

答案 3 :(得分:2)

你有3个片段,所以你将使用3个标签(第一个标签hav index 0,second 1,third 2)。 使用索引获取选项卡并将其文本设置为标题。 愿这对你有所帮助

示例:

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

答案 4 :(得分:1)

好。因此,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类的实现中。因此,每当您有新的数据计数并想要更新标题时,请调用此方法。

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

答案 5 :(得分:1)

每次重新设置寻呼机都没有意义 您已经覆盖了getPageTitle(),并且您只是缺少跟踪何时更改页面以及何时更新标题。
所以你可以轻松地做到这一点:

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

此外,您还必须在onCreate()

中设置初始标题

答案 6 :(得分:0)

TabLayout.OnTabSelectedListener重新设置时会触发

ViewPager,所以我建议自行更新标题。

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