FragmentPagerAdapter actualización de título dinámicamente
Tengo un ViewPager con FragmentPagerAdapter, que tiene 3 Fragments. Ahora, tengo un número de artículos como parte del título del fragmento:
- Android.support.v4.app.Fragment.setUserVisibleHint puntero nulo en la reanudación de la aplicación
- Viewpager + FragmentpagerAdapet + Fragmentos + ListView = aplicación insanamente lenta
- ViewPager con múltiples PageTransformer (PageTransformers en Runtime)
- Diseñe una HorizontalScrollView dentro de ViewPager o use fragmentos:
- Fragmento en ViewPager devuelve objeto vacío onResume
Así que el usuario puede añadir o eliminar esos elementos, y el título debe actualizar en consecuencia. Sin embargo, este título parece estático.
¿Cómo se puede recordar este método para actualizar los títulos de FragmentPagerAdapter?
@Override public CharSequence getPageTitle(int position) { switch (position) { case 0: return items + " (" + notFoundItems + ")"; case 1: return found; case 2: return review; } return ""; }
He encontrado un par de preguntas similares sobre SO, pero tengo que actualizar título , no sólo el fragmento en sí.
- android: ¿Actualizar los elementos de ActionBar dependiendo de cada Fragmento en un ViewPager?
- Actividad con pestañas de Android Abajo de la pantalla
- Android actualiza un ViewPager dentro de un fragmento
- ANDROID: ViewPager con diferentes fragmentos en el método instantiateItem
- ListView dentro de un fragmento utilizado en un ViewPager no se comporta como se esperaba
- Cambiar el estilo de animación de ViewPager
- ViewPager parece reenable clipChildren al desplazarse si se configura PageTransformer
- ViewPager permite obtener una excepción de IndexOutOfBoundsException
Finalmente, lo resolví simplemente restableciendo el buscapersonas.
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 }
Bueno. Así que puede tener un método en FragmentPagerAdapter
que actualizará el recuento de notFoundItems
, foundItems
, itemsForReview
. Después de actualizarlos, llame a 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 ""; }
Además, agregue esto a la implementación de la clase FragmentPagerAdapter
. Por lo tanto, siempre que tenga un nuevo recuento de datos y desee actualizar el título, llame a este método.
public void updateTitleData(int notFoundItems, int foundItems, int itemsForReview) { this.notFoundItems = notFoundItems; this.foundItems = foundItems; this.itemsForReview = itemsForReview; notifyDataSetChanged(); }
No creo que restablecer ViewPager y notifyDataSetChange es una buena idea. Porque hará que la vista en ViewPager recree. Es innecesario.
Y encontré otra manera de resolver el problema.
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));
En primer lugar, es necesario utilizar el método TabLayout
de TabLayout
para cambiar el modelo de ficha. A continuación, llame a setTabTextColors
para actualizar la vista. Debido a que desde el código fuente de TabLayout, setTabTextColors
actualizará todas las pestañas una por una.
Como uno de los comentarios debajo de él sugiere, la respuesta aceptada parece un poco excesiva para mí.
Basado en la respuesta de Frank , esto es lo que he hecho:
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.) }
No tiene sentido volver a configurar el buscapersonas cada vez.
Ya tienes getPageTitle () sobreescrito y solo te falta la pista cuando cambias tus páginas y cuando es el momento de actualizar el título.
Así que usted puede hacer esto fácilmente:
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int position) { // your tite is: mAdapter.getPageTitle(position)); // TODO: update title } });
También tendrá que establecer el título inicial en onCreate ()
- Lengüetas verticales en Android
- Múltiples aplicaciones de Android dependiendo de la biblioteca de Android con gradle