如何动态更新视图翻页器的项目标题

11

我有一个简单的消息应用程序模块,其中有两个可滑动的选项卡:已接收和已发送。假设我有20条消息,其中10条未读。所以我将选项卡显示为已接收 - (10)。当我阅读这条消息时,它会将该消息标记为已读。因此,我想将标题从“已接收 - (10)”更改为“已接收 - (9)”。

请告诉我如何实现?

以下是我正在使用的代码。

@Override
public int getCount() {
    return 2;
}

@Override
public CharSequence getPageTitle(int position) {

    if (position == 0) {
        // if position is zero, set the title to RECEIVED.
        return "Received" + " (" + String.valueOf(intUnreadReceivedMessagesCount) + ")";
    } else {
        // if position is 1, set the title to SENT.
        return "Sent";
    }
}

我正在使用Pager Sliding Tab Strip作为Pager Tab库。https://github.com/astuetz/PagerSlidingTabStrip

我已尝试使用notifyDataSetChanged(),但由于明显的原因,它没有被调用。有没有解决这个问题的方法?欢迎任何更好的替代方法来显示和更新计数。

谢谢。

3个回答

15

没有看到您代码的其余部分,这只是一个猜测。

notifyDataSetChanged()应该可以正常工作,但有一个诀窍。您必须覆盖适配器中的一个方法:

public int getItemPosition(Object item) {
    return POSITION_NONE;
}

这样调用 notifyDataSetChanged() 将会更新当前可见的页面及其相邻页面。

如果没有调用,则只会更新新的页面。

更新

我查看了链接库。它有一个公共方法 notifyDataSetChanged(),就像适配器一样。所以只需要在 XML 中为那个 PagerSlidingTabStrip 分配一个 ID 并在代码中获取引用,然后调用:

adapter.notifyDataSetChanged();
tabStrip.notifyDataSetChanged();

我也尝试了这个选项。但它只会进入getCount()方法,而不会进入getPageTitle()方法。并且我想要更新PagerTabStrip中的页面和页面标题,这些页面和页面标题是基于索引位置从getPageTitle(int)方法中获取的。我也尝试了使视图分页器无效,但它没有起作用。 - Bhargav Jhaveri
你尝试过默认的PagerTitleStrip吗?只是为了确保这个第三方库不会引起问题。保留getItemPosition()进行测试。 - Damian Petla
你能告诉我你正在使用哪种ViewPager适配器实现吗? - Damian Petla
我正在扩展FragmentStatePagerAdapter以使用PagerAdapter。是的,我也尝试过getItemPosition()。但是不行,它确实会重新调用getPageTitle方法。 - Bhargav Jhaveri

7

对于我来说,被接受的答案并没有起作用,我使用了自定义的PagerAdapterandroid.support.design.widget.TabLayout来制作选项卡。

以下方法适用于我:

private void refreshTabTitles() {
    for (int i = 0; i < adapter.getCount(); i++) {
        Tab tab = tabs.getTabAt(i);
        if (tab != null) {
            tab.setText(adapter.getPageTitle(i));
        }
    }
}

另一种方法是每次需要刷新文本时调用tabLayout.setupWithViewPager(viewPager)。 - Jonas
@Jonas 这将重置选项卡到第一个选项卡,在这种情况下,如果您不在第0个位置,这将会创建问题。 - Akhil Dad

0

使用PagerTabStrip

我只是在适配器的InstantiateItem方法内部简单调用了它。

this.GetPageTitleFormatted(position);

然后,它就奏效了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接