expandible - listview expand android
Desplazamiento automático en ExpandableListView (8)
Me gustaría que mi ExpandableListView
se desplace automáticamente cuando el usuario expande un grupo, de modo que el encabezado del grupo expandido esté en la parte superior de la pantalla. He intentado smoothScrollToPosition
, pero esto simplemente garantiza que el grupo expandido esté visible en algún lugar de la pantalla. Me gustaría desplazarlo explícitamente para que el grupo expandido esté en la parte superior, como en este ejemplo:
Before expanding Group 3: After expanding Group 3:
+=================+ +=================+
| Group 1 | | Group 3 |
+-----------------+ +-----------------+
| Group 2 | | Grp 3 Child 1 |
+-----------------+ +-----------------+
| Group 3 | | Grp 3 Child 2 |
+-----------------+ +-----------------+
| Group 4 | | Group 4 |
+=================+ +=================+
Agregue este atributo android:transcriptMode="disabled"
a su etiqueta ExpandibleListView desde xml. Esto debería funcionar.
Configurar android:transcriptMode="disabled"
en mi ExpandibleListView
funcionó para mí. Con el parámetro establecido en "normal", ningún método funciona ( setSelectedGroup
, setSelectionFromTop
, etc.).
Solo funciona setSmoothScroll
, pero no me gusta el efecto.
El código de abajo funciona para mí. Espero que ayude. Implementa el OnGroupExpandListener dentro de onGroupExpand usa el código de abajo
public void onGroupExpand(final int groupPosition) {
super.onGroupExpand(groupPosition);
expandableListView.post(new Runnable() {
@Override
public void run() {
expandableListView.setSelection(groupPosition);
if(expandableListView.getChildAt(groupPosition)!=null)
expandableListView.requestChildRectangleOnScreen(expandableListView.getChildAt(groupPosition),
new Rect(0, 0, expandableListView.getChildAt(groupPosition).getRight(), expandableListView.getChildAt(groupPosition).getHeight()), false);
}
});
}
El siguiente código es una solución que me funcionó.
public boolean onGroupClick(ExpandableListView parent, View v,int groupPosition, long id) {
// TODO Auto-generated method stub
//mExpandableList.setSelectionFromTop(groupPosition, 0);
Boolean shouldExpand = (!mExpandableList.isGroupExpanded(groupPosition));
mExpandableList.collapseGroup(lastClickedPosition);
if (shouldExpand){
//generateExpandableList();
mExpandableList.expandGroup(groupPosition);
mExpandableList.setSelectionFromTop(groupPosition, 0);
}
lastClickedPosition = groupPosition;
return true;
}
Este esta trabajando para mi
expandList.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
if (!parent.isGroupExpanded(groupPosition)) {
parent.expandGroup(groupPosition);
} else {
parent.collapseGroup(groupPosition);
}
parent.setSelectedGroup(groupPosition);
return true;
}
});
Como la parte principal de trabajo para el desplazamiento es
parent.setSelectedGroup(groupPosition);
Esto funcionó para mí. Ponlo en tu adaptador:
public void onGroupExpanded(final int groupPosition) {
super.onGroupExpanded(groupPosition);
listView.setSelectedGroup(groupPosition);
}
setSelectedGroup
funciona, pero si desea tener un efecto de desplazamiento suave, use smoothScrollToPositionFromTop
como se indica a continuación:
expandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
parent.smoothScrollToPositionFromTop(groupPosition,0);
if (expandableListView.isGroupExpanded(groupPosition))
expandableListView.collapseGroupWithAnimation(groupPosition);
else expandableListView.expandGroupWithAnimation(groupPosition);
return true;
}
});
ListView.setSelection(position)
esto se desplazará al elemento seleccionado, llámelo cuando haga clic en el elemento del grupo.