comportamiento extraño en Expandablelistview - Android
-
30-09-2019 - |
Pregunta
Estoy tratando de poner en práctica una actividad que utiliza ExpandableListView y he conseguido hasta ahora, pero ahora he encontrado un comportamiento extraño.
Mi actividad está destinado a la ingesta de alimentos sin precedentes según lo especificado por el usuario. tienen una selección de menús (desayuno, almuerzo y cena - el grupo externo) que se expanden para mostrar su contenido.
cuando un usuario hace clic en un elemento del menú interno un cuadro de diálogo que aparece pidiendo la cant. una vez que entran en una cant y cerrar el diálogo del texto en las opción de menú cambia para reflejar la cantidad de ese elemento que se ha consumido
La imagen de arriba muestra la lista en un estado cerrado.
a continuación es la lista después de haber abierto el menú de almuerzo y hecho clic en 'papas fritas' y que indica una cantidad de 1. Como puede ver la 'patata' itemText ahora se ha cambiado para reflejar el Cant de 1.
Lo extraño sucede ahora. si hago clic en y 'almuerzo' y cerca de la lista a continuación, haga clic en él de nuevo volver a abrirlo, el 'Cant X 1' texto ha saltado a otro elemento (leche)
cada vez que abren y cierran la lista salta hacia atrás y adelante entre los dos elementos. Además, si abro otros elementos, como el desayuno, me parece que ellos también tienen elementos ya conseguido con 'Cant X 1' a pesar de que no he hecho clic ellas.
Los bits de código que son relevantes son como tal:
El XML para un elemento secundario:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView android:id="@+id/childname"
android:paddingLeft="50dip"
android:textSize="14dip"
android:textStyle="italic"
android:layout_width="200dip"
android:textColor="@color/black"
android:layout_height="40dip"/>
<TextView android:id="@+id/qty_display"
android:text="-"
android:textSize="14dip"
android:textStyle="italic"
android:layout_width="50dip"
android:textColor="@color/black"
android:layout_height="wrap_content"/>
</LinearLayout>
Los códigos activados eso al hacer clic en un elemento secundario:
public boolean onChildClick(
ExpandableListView parent,
View v,
int groupPosition,
int childPosition,
long id) {
// open the dialog and inflate the buttons
myDialog = new Dialog(this);
myDialog.setTitle("Food Item Qty");
myDialog.setContentView(R.layout.food_intake_dialog);
final Button ok = (Button)myDialog.findViewById(R.id.fi_ok_but);
Button cancel = (Button)myDialog.findViewById(R.id.fi_cancel_but);
//the id for this item is stored as a hash key in a map (say, item_id01)
String key = "item_id"+groupPosition+""+childPosition;
current_selected_food_item_id = Integer.parseInt(itemMap.get(key));
// inflate the textview that shows the qty for this item on the expandablelist
barQty = (TextView) v.findViewById(R.id.qty_display);
// set the ok button to record teh quantity on press
ok.setOnClickListener(new OnClickListener() {
public void onClick(View viewParam) {
//inflate the input box that receives quantity from user
EditText fiQty = (EditText) myDialog.findViewById(R.id.fiQty);
// get the quantity and append the text on hte list item
String qty = fiQty.getText().toString();
barQty.setText("Qty X "+qty);
//open the database and save state
FoodIntake.this.application.getFoodIntakeHelper().open();
FoodIntake.this.application.getFoodIntakeHelper().storeFoodIntakeLog(current_selected_food_item_id,qty,visit_id,remote_visit_id);
String log = FoodIntake.this.application.getFoodIntakeHelper().getFoodIntakeLog(visit_id);
FoodIntake.this.application.getFoodIntakeHelper().close();
// append the main food intake list and close the dialog
list.setText("Food Intake Log:\n\n"+log);
myDialog.cancel();
}
});
El código anterior se abre un cuadro de diálogo, acepta un valor de cantidad, añade el elemento de la lista para reflejar esto, también se guarda en la base de datos y establece un TextView con el artículo y cantidad seleccionada.
Lo sentimos simplemente volcar toda una carga de código, pero esto me tiene perplejo y es de esperar que alguien pueda ayudar.
Gracias
Kevin
Solución
No creo que el problema está en los cuadros de diálogo. Yo tenía el mismo problema en mi proyecto y no podía solucionarlo. Creo que el ExpandableListView
tiene un error al abrir los niños. Yo tenía un solo hijo por grupo y cuando amplío un grupo, el niño se mueve a otro grupo. Después de las pruebas, descubrí que cuando se expanden los niños se vuelven a cargar.
Otros consejos
Android vuelve a utilizar los cuadros de diálogo. Por lo que el comportamiento que está viendo podría ser el resultado de ello. Se puede usar un diálogo de gestión y el uso onPrepareDialog () para actualizar el contenido de diálogo.