4

ExpandableListView を使用するアクティビティを実装しようとしていますが、これまでのところ、奇妙な動作を発見しました。

私のアクティビティは、ユーザーが指定した食事の摂取量を記録することを目的としています。メニュー (朝食、ランチ、ディナー - 外側のグループ) の選択肢があり、展開して内容を表示します。ユーザーが内側のメニュー項目をクリックすると、数量を尋ねるダイアログが表示されます。数量を入力してダイアログを閉じると、メニュー項目のテキストが変更され、消費されたその項目の数量が反映されます。 図1

上の画像は、閉じた状態のリストを示しています。

以下は、ランチ メニューを開いて [ポテトチップス] をクリックし、数量が 1 であることを示すリストです。

図2

奇妙な部分が今起こります。「ランチ」をクリックしてリストを閉じ、もう一度クリックして再度開くと、「数量 X 1」のテキストが別の項目 (ミルク) にジャンプしました。

代替テキスト

リストを開いたり閉じたりするたびに、2 つの項目の間を行ったり来たりします。また、朝食などの他のアイテムを開くと、クリックしていないにもかかわらず、「数量 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_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>

子要素をクリックするとトリガーされるコード:

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

上記のコードはダイアログを開き、数量の値を受け入れ、リスト要素を追加してこれを反映させ、データベースに保存し、選択したアイテムと数量でテキストビューを設定します。

コード全体をダンプして申し訳ありませんが、これは私を困惑させ、誰かが助けてくれることを願っています.

ありがとう

ケビン

4

2 に答える 2

1

Androidはダイアログを再利用します。したがって、表示されている動作はその結果である可能性があります。アクティビティ管理ダイアログを使用し、onPrepareDialog()を使用してダイアログの内容を更新できます。

于 2010-09-03T08:30:53.453 に答える
-1

ダイアログに問題があるとは思いません。プロジェクトで同じ問題が発生し、修正できませんでした。ExpandableListView子を開くときにバグがあると思います。グループごとに 1 人の子供しかいませんでしたが、グループを展開すると、その子供は別のグループに移動します。テスト後、展開すると子がリロードされることがわかりました。

于 2011-07-05T14:47:22.780 に答える