我有一个带有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上发现了几个类似的问题,但我需要更新标题,而不仅仅是片段本身。
答案 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
中的方法可以更新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 :(得分: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
}
}