studio expandible example acordeon android scroll expandablelistview

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.