Android FastScroll solo cubre parte de la lista
expandablelistview (2)
Acabo de encontrar una solución alternativa para evitar que el sistema muestre este comportamiento incorrecto.
Hay dos escenarios que utilizan un código diferente para que SectionIndexer
el SectionIndexer
de SectionIndexer
.
El primer escenario es el caso de que use FastScrollbar-Thumb para navegar a la siguiente sección. Asumiendo que los grupos son sus secciones, los métodos anulados para implementar el SectionIndexer
verían 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 desplace la lista manualmente y las barras de desplazamiento rápido se muevan de acuerdo con las secciones, no con todos los elementos. El código por lo tanto se ve así:
@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 más adopción.
La solución para hacer que ambos funcionen es detectar el caso cuando alguien se desplaza por mano (es decir, se desplaza a través del tacto). Esto se puede hacer implementando la interfaz OnScrollListener
con la clase de adaptador y configurándola en 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
// ...
}
Eso arregló el error para mí.
Tengo una clase que implementa expandable list activity
.
En el código XML (o puedo hacerlo en java), establezco fastScrollEnabled
en true
. Esto de hecho permite 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 pulgar de fastscroll para desplazarse por toda la lista, pero solo funciona en la sección superior de la barra de desplazamiento. No es proporcional a la lista completa. Puedo arrastrar la barra de control hasta la parte inferior de la lista, pero no se desplaza, ya que la vista de la lista ya se ha desplazado hacia la parte inferior debido al extraño comportamiento de la misma, que solo funciona en la parte superior de la lista.
Confuso, lo sé, puedo intentar aclarar más si es necesario ...
Yo implemento un BaseExpandableListAdapter.
personalizado BaseExpandableListAdapter.
Este es un error en el desplazamiento rápido. No juega bien con ExpandableListView
.
Ver mi codigo
(También incluye una solución para algunos casos)