Seltsames Verhalten in Expandablelistview - Android

Im Versuch, eine Aktivität zu implementieren, die ExpandableListView verwendet, und ich bin so weit gekommen, aber jetzt habe ich ein merkwürdiges Verhalten festgestellt.

Meine Aktivität dient dazu, die vom Benutzer angegebene Nahrungsaufnahme aufzuzeichnen. Sie haben eine Auswahl an Menüs (Frühstück, Mittag- und Abendessen - die äußere Gruppe), die erweitert werden, um ihren Inhalt zu zeigen. Wenn ein Benutzer auf einen inneren Menüpunkt klickt, wird ein Dialogfeld angezeigt, in dem er nach der Menge gefragt wird. Sobald sie eine Menge eingegeben und das Dialogfeld geschlossen haben, ändert sich der Text im Menüelement, um die Menge des verbrauchten Elements wiederzugeben.

Das obige Bild zeigt die Liste in einem geschlossenen Zustand.

unten ist die Liste, nachdem ich das Mittagsmenü geöffnet und auf "Kartoffelchips" geklickt und eine Menge von 1 angezeigt habe. Wie Sie sehen können, wurde der Elementtext "Kartoffel" geändert, um die Menge von 1 widerzuspiegeln.

Der seltsame Teil passiert jetzt. Wenn ich auf "Mittagessen" klicke und die Liste schließe und dann erneut darauf klicke, um sie wieder zu öffnen, ist der Text "Menge X 1" zu einem anderen Element gesprungen (Milch)

Jedes Mal, wenn ich die Liste öffne und schließe, springt sie zwischen den beiden Elementen hin und her. Auch wenn ich andere Artikel öffne, wie z. B. das Frühstück, stelle ich fest, dass auch diese jetzt Artikel mit "Menge X 1" erhalten haben, obwohl ich sie nicht angeklickt habe.

Die relevanten Codebits lauten wie folgt:

Die XML für ein untergeordnetes Element:

<?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>

Der Code, der beim Klicken auf ein untergeordnetes Element ausgelöst wird:

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();
   }
     });

Der obige Code öffnet einen Dialog, akzeptiert einen Wert für die Menge, hängt das Listenelement an, um dies widerzuspiegeln, speichert auch in der Datenbank und legt eine Textansicht mit dem ausgewählten Artikel und der ausgewählten Menge fest.

Tut mir leid, nur eine ganze Menge Code zu entleeren, aber das hat mich verblüfft und hoffentlich kann jemand helfen.

Vielen Dan

Kevin

Antworten auf die Frage(4)

Ihre Antwort auf die Frage