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
中使用一个方法来更新 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
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));
首先,您需要使用TabLayout
的getTabAt
方法来更改选项卡的模型。然后调用 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
}
}
我有一个带有 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
中使用一个方法来更新 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
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));
首先,您需要使用TabLayout
的getTabAt
方法来更改选项卡的模型。然后调用 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
}
}