Re-index / Refresh un SectionIndexer

¿Hay alguna forma de volver a indexar un SectionIndexer después de agregar nuevos elementos a un ListView?

He encontrado esta solución , pero la superposición es la posición en la esquina superior izquierda después de que SectionIndexer se actualiza.

¿Alguien tiene alguna idea?

Una vez que el FastScroller obtiene sus secciones llamando a SectionIndexer#getSections() , nunca las vuelve a obtener a menos que habilite / desactive el desplazamiento rápido como se menciona en el enlace que mencionó. Para obtener el valor que se mostrará en la pantalla, FastScroller llama al método toString de la sección.

Una solución potencial es tener un SectionIndexer personalizado que tenga las siguientes características:

  • La matriz de secciones es de longitud fija (longitud máxima del número esperado de secciones, por ejemplo, si las secciones representan el alfabeto inglés será 26)
  • Tener un objeto personalizado para representar secciones, en lugar de utilizar cadenas
  • Sobrescriba el método toString del objeto de sección personalizado para mostrar lo que desea en función de los valores de sección actuales.

por ejemplo, en su SectionIndexer personalizado

 private int mLastPosition; public int getPositionForSection(int sectionIndex) { if (sectionIndex < 0) sectionIndex = 0; // myCurrentSectionLength is the number of sections you want to have after // re-indexing the items in your ListView // NOTE: myCurrentSectionLength must be less than getSections().length if (sectionIndex >= myCurrentSectionLength) sectionIndex = myCurrentSectionLength - 1; int position = 0; // --- your logic to find the position goes in here // --- eg see the AlphabeticIndexer source in Android repo for an example mLastPosition = position; return mLastPosition; } public Object[] getSections() { // Assume you only have at most 3 section for this example return new MySection[]{new MySection(), new MySection(), new MySection()}; } // inner class within your CustomSectionIndexer public class MySection { MySection() {} public String toString() { // Get the value to displayed based on mLastPosition and the list item within that position return "some value"; } } 

Encontré que la mejor manera de hacer esto es llamar a setContentView(R.layout.whatever) y rellenar el ListView con su nuevo adaptador / nuevos elementos de datos. Esto volverá a dibujar el ListView con sus nuevos elementos y la superposición FastScroll aparecerá en el lugar correcto.

He encontrado notifyDataSetInvalidated trabajando bien, notifyDataSetInvalidated aquí la idea:

 public class MyAdapter extends XXXAdapter implements SectionIndexer { ... public void updateDataAndIndex(List data, Map index) { // update sections // update date set notifyDataSetInvalidated(); } } 

actualizar su conjunto de datos e índice (secciones) de alguna manera, y luego notifyDataSetInvalidated , el índice se actualizará.

Puede forzar la recarga de la lista de secciones a ListView por listView.setAdapter(yourAdapter)

  • ListSelector de Android todavía parcialmente visible cuando el elemento se desplaza hacia fuera
  • Cómo expandir una fila de la lista cuando la toquemos en listview
  • Conversación por SMS
  • Android ListView setSelectionFromTop no funciona
  • SetEmptyView en ListView no mostrar su vista en una aplicación para Android
  • ¿Por qué (ListView) findViewById devuelve nulo?
  • Android change listview item color del texto
  • SetOnItemClickListener en ListView personalizado
  • Seleccione sólo un botón de radio a la vez en la vista de lista personalizada, android
  • Cómo agregar un elemento secundario en Android ListView?
  • Android - Animación al eliminar elementos de ListView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.