简体   繁体   English

Expandablelistview中的奇怪行为 - Android

[英]Strange behaviour in Expandablelistview - Android

Im trying to implement an activity that uses ExpandableListView and I have gotten so far but now I have found some strange behavior. 我试图实现一个使用ExpandableListView的活动,我已经到目前为止,但现在我发现了一些奇怪的行为。

My activity is meant to record food intake as specified by the user. 我的活动是为了记录用户指定的食物摄入量。 they have a choice of menus (breakfast, lunch and dinner - the outer group) which expand to show their contents. 他们可以选择菜单(早餐,午餐和晚餐 - 外部团体),以扩展其内容。 when a user clicks on an inner menu item a dialog appears asking them for the qty. 当用户点击内部菜单项时,会出现一个对话框,要求他们输入数量。 once they enter a qty and dismiss the dialog the text on the menu item changes to reflect the quantity of that item that has been consumed 一旦他们输入数量并关闭对话框,菜单项上的文本就会发生变化,以反映已消耗的项目数量 图。1

The above image shows the list in a closed state. 上图显示处于关闭状态的列表。

below is the list after I have opened the lunch menu and clicked on 'Potato Chips' and indicating a Quantity of 1. As you can see the 'Potato' itemtext has now been changed to reflect the Qty of 1. 下面是我打开午餐菜单并单击“薯片”并指示数量为1后的列表。您可以看到“马铃薯”项目文本现已更改为反映数量为1。

图2

The strange part happens now. 奇怪的部分现在发生了。 if I click on 'Lunch' and close the list and then click on it again re-opening it, the 'Qty X 1' text has jumped to another item (Milk) 如果我点击'午餐'并关闭列表,然后再次点击它重新打开它,'Qty X 1'文字已跳转到另一个项目(牛奶)

替代文字

each time I open and close the list it jumps back and forth between the two items. 每次打开和关闭列表时,它都会在两个项目之间来回跳转。 Also if I open up other items, such as breakfast, I find that they too have now gotten items with 'Qty X 1' even though I havent clicked them. 此外,如果我打开其他项目,如早餐,我发现他们现在也得到了'Qty X 1'的项目,即使我没有点击它们。

The bits of code that are relevant are as such: 相关的代码位如下:

The XML for a child element: 子元素的XML:

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

The code thats triggered on clicking a child element: 单击子元素时触发的代码:

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

The above code opens a dialog, accepts a value for quantity, appends the list element to reflect this, also saves to database and sets a textview with the selected item and quantity. 上面的代码打开一个对话框,接受数量值,附加列表元素以反映这一点,同时保存到数据库并设置带有所选项目和数量的文本视图。

Sorry to just dump a whole load of code, but this has me stumped and hopefully someone can help. 很抱歉只是转储了大量的代码,但这让我很难过,希望有人可以提供帮助。

Thanks 谢谢

Kevin 凯文

Android reuses dialogs. Android重用对话框。 So the behavior you are seeing could be a result of that. 所以你看到的行为可能就是这样的结果。 You could use a activity managed dialog and use onPrepareDialog() to update dialog contents. 您可以使用活动管理对话框并使用onPrepareDialog()来更新对话框内容。

I don't think the problem is with the dialogs. 我认为问题不在于对话框。 I had the same problem in my project and couldn't fix it. 我在我的项目中遇到了同样的问题而且无法修复它。 I think the ExpandableListView has a bug when opening children. 我认为ExpandableListView在打开子项时有一个bug。 I had only one child per group and when I expand a group, the child moves to another group. 我每组只有一个孩子,当我扩展一个小组时,孩子会移动到另一组。 After testing, I found out that when I expand the children are reloaded. 经过测试,我发现当我扩展时,孩子们会重新加载。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM