FragmentPagerAdapter динамически обновлять заголовок
У меня есть ViewPager с FragmentPagerAdapter, который имеет 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, но мне нужно обновить title, а не только сам фрагмент.
Ответы
Ответ 1
Наконец, я решил это, просто переустановив пейджер.
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
}
Ответ 2
Как говорится в одном из комментариев ниже, принятый ответ выглядит немного излишним для меня.
Основываясь на Ответ Frank, это то, что я сделал:
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.)
}
Ответ 3
Я не думаю, что reset 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
TabLayout
, чтобы изменить модель вкладки. Затем вызовите setTabTextColors
, чтобы обновить представление. Поскольку из исходного кода TabLayout setTabTextColors
будет обновлять все вкладки один за другим.
Ответ 4
Хорошо. Таким образом, вы можете иметь метод в 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
Нет никакого смысла в настройке вашего пейджера каждый раз.
У вас уже отключен getPageTitle(), и вам просто не удается отслеживать, когда ваши страницы изменены, и когда настало время обновить заголовок.
Таким образом, вы можете легко сделать это:
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// your tite is: mAdapter.getPageTitle(position));
// TODO: update title
}
});
Также вам нужно будет установить начальный заголовок в onCreate()
Ответ 6
у вас есть 3 фрагмента, поэтому вы будете использовать 3 вкладки (первая вкладка hav index 0, вторая 1, третья 2). получить вкладку с помощью индекса и установить ее текст в качестве заголовка. Пусть это поможет тебе, братан
Пример:
TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
tabLayout .getTabAt(index).setText("");
Ответ 7
TabLayout.OnTabSelectedListener
будет запущен при переустановке с помощью ViewPager
, поэтому я рекомендую обновить заголовок самостоятельно.
viewPager.adapter?.apply {
for (p in 0..count) {
tabLayout.getTabAt(p)?.text = getPageTitle(p) ?: break
}
}