Expandablelistview 中的奇怪行为 - Android

Posted

技术标签:

【中文标题】Expandablelistview 中的奇怪行为 - Android【英文标题】:Strange behaviour in Expandablelistview - Android 【发布时间】:2011-04-07 17:21:45 【问题描述】:

我正在尝试实现一个使用 ExpandableListView 的活动,到目前为止我已经做到了,但现在我发现了一些奇怪的行为。

我的活动旨在记录用户指定的食物摄入量。他们可以选择菜单(早餐,午餐和晚餐 - 外部组),这些菜单会扩展以显示其内容。 当用户单击内部菜单项时,会出现一个对话框,询问他们的数量。一旦他们输入数量并关闭对话框,菜单项上的文本就会更改以反映该项目已被消耗的数量

上图显示了处于关闭状态的列表。

以下是我打开午餐菜单并单击“薯片”并指示数量为 1 后的列表。如您所见,“土豆”项目文本现在已更改为反映数量为 1。

奇怪的部分现在发生了。如果我单击“午餐”并关闭列表,然后再次单击它重新打开它,则“数量 X 1”文本已跳转到另一个项目(牛奶)

每次我打开和关闭列表时,它都会在两个项目之间来回跳转。此外,如果我打开其他项目,例如早餐,我发现他们现在也得到了带有“数量 X 1”的项目,即使我没有点击它们。

相关的代码如下:

子元素的 XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_
    android:layout_>

    <TextView android:id="@+id/childname"
         android:paddingLeft="50dip"

         android:textSize="14dip"
         android:textStyle="italic"
         android:layout_
         android:textColor="@color/black"
         android:layout_/>

    <TextView android:id="@+id/qty_display"
         android:text="-"
         android:textSize="14dip"
         android:textStyle="italic"
         android:layout_
         android:textColor="@color/black"
         android:layout_/>
</LinearLayout>

点击子元素触发的代码:

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

上面的代码打开一个对话框,接受一个数量值,附加列表元素以反映这一点,还保存到数据库并设置一个带有所选项目和数量的文本视图。

很抱歉只是转储了一大堆代码,但这让我很困惑,希望有人能提供帮助。

谢谢

凯文

【问题讨论】:

【参考方案1】:

Android 重用对话框。因此,您看到的行为可能是其结果。您可以使用活动管理对话框并使用onPrepareDialog() 来更新对话框内容。

【讨论】:

当你说android重用对话框时,你是指列表元素吗?还是您的意思是用于输入项目数量的实际对话框?谢谢【参考方案2】:

我认为问题不在于对话框。我在我的项目中遇到了同样的问题,无法解决。我认为ExpandableListView 在打开孩子时有一个错误。我每组只有一个孩子,当我扩大一个组时,孩子会转移到另一个组。经过测试,我发现当我展开时,孩子们被重新加载。

【讨论】:

以上是关于Expandablelistview 中的奇怪行为 - Android的主要内容,如果未能解决你的问题,请参考以下文章

node.js 中的奇怪行为

异常处理中的这种奇怪行为是啥?

球拍中的奇怪行为

将焦点保存在 ExpandableListView 中的展开组上

Postgresql 中的奇怪行为

SetSystemTime kernel32 中的奇怪行为