2011-06-06 29 views
8

¿Alguien ha tenido suerte al adaptar PinnedHeaderListView para que se pueda usar con un ExpandableListView en lugar de solo un simple ListView con secciones indexadas? Básicamente, quiero un ExpandableListView donde la vista de cada elemento de grupo permanezca fijada en la parte superior hasta que la próxima vista de grupo la levante.¿Cómo obtener Encabezados fijos/fijados en una ExpandableListView?

He estudiado el código para intentar averiguar cómo funciona PinnedHeaderListView y parece que será difícil adaptarse a un ExpandableListView. El principal problema parece estar en el uso de un tipo diferente de adaptador y metodología de dibujo. A PinnedHeaderListView hace uso de SectionIndexer para realizar un seguimiento de las posiciones de la sección. Como dibuja cada artículo con getView(), comprueba si el artículo es el comienzo de una nueva sección. Si el artículo es el comienzo de una nueva sección, hace que un encabezado de sección sea visible dentro de la vista de list_item del artículo. Un ExpandableListAdapter tiene un getChildView() y un getGroupView() para dibujar los artículos y las secciones por separado como diferentes elementos de la lista.

Estoy seguro de que debe haber alguna forma de utilizar la metodología en PinnedHeaderListView para obtener un comportamiento similar en un ExpandableListView, pero no estoy seguro de por dónde empezar.

+0

Dado que @joecan no publicó el código completo, entonces lo haré.[Mi solución] (http://stackoverflow.com/q/10613552/1376402) –

Respuesta

4

Pude obtener encabezados anclados trabajando en el ExpandableList1 APIdemo.

El problema más difícil al que me enfrenté fue averiguar cómo hacer para que SectionIndexer funcione bien con listas en expansión. Como se evidenció en mi pregunta, estaba pensando en todo esto mal. En mi intento original de resolver este problema, creé un objeto SectionIndexer dentro de MyExpandableAdapter y lo correlacioné con mis datos, de forma similar a cómo se hace en la aplicación Contacts y en el ejemplo de Peter. Esto funciona en la aplicación Contactos porque las posiciones de la lista plana coinciden estáticamente con el conjunto de datos. En una vista de lista ampliable, las posiciones de la lista plana cambian a medida que los grupos se expanden hacia adentro y hacia afuera.

Por lo tanto, la solución es no asignar el indexador de sección a los datos, sino a la instancia de su ExpandableListView. Con esta solución, ni siquiera necesita un objeto SectionIndexer como se usa en los ejemplos. Sólo tiene que envolver los métodos de implementación SectionIndexer en torno a los métodos ExpandableListView como este:

@Override 
    public int getPositionForSection(int section) { 
     return mView.getFlatListPosition(ExpandableListView 
       .getPackedPositionForGroup(section)); 
    } 

    @Override 
    public int getSectionForPosition(int position) { 
     return ExpandableListView.getPackedPositionGroup(mView 
       .getExpandableListPosition(position)); 
    } 

Por supuesto, hay otros cambios que tienen que hacer para conseguir todo esto de trabajo, pero los métodos anteriores son la clave. Publicaré el código completo en google code o github y lo vincularé pronto. ¡Las listas ampliables con encabezados fijados se ven geniales!

+0

¡increíble! ¡muchas gracias! – rekaszeru

+1

Sería bueno si puedes hacer un proyecto de biblioteca y ponerlo a disposición en github. Si necesita un modelo, consulte https://github.com/triposo/barone – aleb

+0

@joecan puede publicar el enlace github para su código – sankar

2

Bueno, yo he hecho en tan sólo 3 pasos:

1. Añadir compile 'com.diegocarloslima:fgelv:[email protected]' en build.gradle

2. Añadir ExpandableListView en XML.

<com.diegocarloslima.fgelv.lib.FloatingGroupExpandableListView 
     android:id="@+id/expandableListView" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@android:color/transparent" 
     android:groupIndicator="@null" /> 

3. código Java:

FloatingGroupExpandableListView expandableListView = (FloatingGroupExpandableListView) findViewById(R.id.expandableListView); 
MyexpandableListAdapter adapter = new MyexpandableListAdapter(context, mList); 
WrapperExpandableListAdapter wrapperAdapter = new WrapperExpandableListAdapter(adapter); 
expandableListView.setAdapter(wrapperAdapter); 

Hope esto le ayudará.

Cuestiones relacionadas