2010-12-16 8 views
18

Tengo una clase que implementa expandable list activity.
En el código XML (o puedo hacerlo en java), establezco fastScrollEnabled en true. Esto permite habilitar el desplazamiento rápido. PERO el desplazamiento rápido solo funciona en la parte superior de la lista. Al igual que puedo usar la barra de desplazamiento de desplazamiento rápido para desplazarme por toda la lista, pero solo funciona en la sección superior de la barra de desplazamiento. No es proporcional a toda la lista. Puedo arrastrar la barra con el pulgar hacia la parte inferior de la lista, pero no se desplaza, ya que el listview ya se desplazó hacia abajo debido al comportamiento extraño de que solo funciona en la parte superior de la lista.
La confusión que sé, puedo tratar de aclarar más si es necesario ....android fastScroll solo cubre parte de la lista

me hacen poner en práctica una costumbre BaseExpandableListAdapter.

+0

¿Las filas de la lista son de diferentes tamaños? –

+6

puedes ... por favor ... publicar tu XML – Rockin

+5

Publica tu código/xml –

Respuesta

1

Esto es un error en la barra de desplazamiento rápido. No funciona bien con ExpandableListView.

Ver my code.

(que también incluye una solución para algunos casos)

+0

He descargado tu FastScroller.java, pero no sé cómo implementarlo. ¿Puede orientarme sobre cómo implementarlo en mi aplicación ExpandableListView? Muchas gracias por el código. – Dante

5

Acabo de encontrar una solución para evitar que el sistema para mostrar este comportamiento equivocado.

Hay dos escenarios que usan código diferente para el SectionIndexer para funcionar.

El primer caso es que utiliza FastScrollbar-Thumb para navegar a la siguiente sección. Suponiendo que los grupos son sus secciones de los métodos anulado para la aplicación del SectionIndexer se vería así:

@Override 
public int getPositionForSection(int section) { 
    return section; 
} 

// Gets called when scrolling the list manually 
@Override 
public int getSectionForPosition(int position) { 
    return ExpandableListView.getPackedPositionGroup(
       expandableListView 
        .getExpandableListPosition(position)); 
} 

El segundo escenario es el caso de que el desplazamiento por la lista de forma manual y las barras de desplazamiento rápido se mueven de acuerdo a las secciones, no todos los artículos. Por tanto, el código es el que:

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

// Gets called when scrolling the list manually 
@Override 
public int getSectionForPosition(int position) { 
    return ExpandableListView.getPackedPositionGroup(
       expandableListView 
        .getExpandableListPosition(position)); 
} 

Como se puede ver estos dos comportamientos no pueden jugar juntos sin mayor adopción.

La solución para que ambos funcionen es captar el caso cuando alguien está desplazándose por mano (es decir, desplazándose mediante el tacto). Esto se puede hacer con la implementación de la interfaz OnScrollListener con la clase adaptador y la puso sobre la ExpandableListView:

public class MyExpandableListAdapter extends BaseExpandableListAdapter 
       implements SectionIndexer, AbsListView.OnScrollListener { 

    // Your fields here 
    // ... 
    private final ExpandableListView expandableListView; 
    private boolean manualScroll; 

    public MyExpandableListAdapter(ExpandableListView expandableListView 
            /* Your other arguments */) { 
     this.expandableListView = expandableListView; 
     this.expandableListView.setOnScrollListener(this); 
     // Other initializations 
    } 

    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
     this.manualScroll = scrollState == SCROLL_STATE_TOUCH_SCROLL; 
    } 

    @Override 
    public void onScroll(AbsListView view, 
         int firstVisibleItem, 
         int visibleItemCount, 
         int totalItemCount) {} 

    @Override 
    public int getPositionForSection(int section) { 
     if (manualScroll) { 
      return section; 
     } else {    
      return expandableListView.getFlatListPosition(
         ExpandableListView.getPackedPositionForGroup(section)); 
     } 
    } 

    // Gets called when scrolling the list manually 
    @Override 
    public int getSectionForPosition(int position) { 
     return ExpandableListView.getPackedPositionGroup(
        expandableListView 
         .getExpandableListPosition(position)); 
    } 

    // Your other methods 
    // ... 
} 

que corrigió el problema para mí.

+0

Guau, esto solucionó un error que hemos tenido durante 3 años. ¡Gracias! –

+0

@ mitch000001, puse su código en mi aplicación ExpandableListView, pero me dio un error de cierre de fuerza NullPointerException cada vez que expandí cualquier grupo. ¿Necesito el SectionIndexer.java para que funcione? Gracias – Dante

Cuestiones relacionadas