0

Android アプリでラジオ グループの拡張可能なリストを作成したいと考えています。リストの各要素には、(開いたときに) いくつかの個別のラジオ グループが含まれている必要があります。これまでのところ、子供ごとに 1 つのラジオグループだけでテストしていますが、すでに自分では解決できないような問題に直面しています。

展開可能なリストの親を展開すると、正しく機能しているようです。ラジオグループ (現時点では親の唯一の子要素) のラジオボタンは、本来あるべき方法で表示されます。ただし、展開可能なリストの別の親を展開すると、ラジオ ボタンが他の子グループの既存のボタンに追加されます。つまり、いくつかの子グループを展開すると、展開された子グループのそれぞれに大量のラジオ ボタンが含まれ、画面全体があふれます。簡単に言えば、親 1 を展開すると選択肢が表示されます

  • はい
  • 番号
  • 多分

2 番目の親を展開すると、ラジオの選択肢が表示されます

  • はい
  • 番号
  • 多分
  • はい
  • 番号
  • 多分
  • おそらく

...これは、親 1 内のラジオ ボタン グループにも追加されます。これで、2 つの大きな展開されたリスト要素ができました。別のグループを展開すると、選択肢がすべての子ビューにも追加されます。

したがって、単純なロジックに従うと、すべてのラジオ ボタンが新しいグループ (子リストを展開するたびに新しく作成される) に配置されるのではなく、同じ既存のグループに追加されるように見えます。

ExpandableListAdapter クラス内の getChildView 関数に問題をほぼ切り分けることができました。これは、上記の出力を引き起こすコードです。

public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View view,
        ViewGroup parent) {
    ExpandListChild child = (ExpandListChild) getChild(groupPosition, childPosition);
    if (view == null) {
        LayoutInflater infalInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = infalInflater.inflate(R.layout.child_layout, null);
    }

    ArrayList<HashMap<String,String>> inputDetailsList = child.getInputfields();
    //RadioGroup rg = new RadioGroup(view.getContext());
    RadioGroup rg = (RadioGroup) view.findViewById(R.id.radiogroup);
    int has_radiogroup = 0;

    for (int i = 0; i <inputDetailsList.size(); i++){
        if (inputDetailsList.get(i).get("type").equals("radio")){
            has_radiogroup = 1;
            RadioButton rb = new RadioButton(rg.getContext());
            rb.setText(inputDetailsList.get(i).get("textcontent"));
            rg.addView(rb);
        }
    }

    return view;
}

子レイアウトとして使用される xml ファイルは次のとおりです。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="55dip"
android:background="@color/ExpandChildBackground"
android:orientation="vertical" >

<TextView
    android:id="@+id/tvChild"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textColor="@color/Black"
    android:textSize="17dip" />

<RadioGroup
    android:id="@+id/radiogroup"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    >
</RadioGroup>
</LinearLayout>

私のエラーが疑われる行は次のとおりです。

RadioGroup rg = (RadioGroup) view.findViewById(R.id.radiogroup);

インフレートされた子レイアウト (R.layout.child_layout) 内で作成したラジオ グループを探します。ただし、展開された子ビューごとに新しいものを使用するのではなく、既存のものを使用してボタンを適用します。言い換えれば、ラジオグループが「終了」したという兆候を決して得ないように見え、および/または子ビューが古いラジオグループの代わりに新しいラジオグループを使用する必要があるという兆候を決して得ないようです。

私が試したのは、レイアウトで定義したラジオグループを使用する代わりに、次の行を使用して子ビューごとに新しい RadioGroup を作成することです (上記のコードのコメント行であることがわかります)。新しいラジオグループを作成すると、次のようになります。

RadioGroup rg = new RadioGroup(view.getContext());

ただし、これは機能しません。ラジオ グループは表示されず、ボタンはまったく表示されません。また、レイアウト xml ファイルから radiogroup 要素を削除しようとしました (とにかく使用されないため)。まだ運がありません。各要素に単純な整理されていないテキストビューを使用すると、適切に機能するように見えるため、これはラジオ グループの実装にも問題があることを示しています。

正直なところ、私は今アイデアがありません。間違ったコンテキストを取得している可能性がありますが、使用するコンテキストがわかりません。誰かが私を正しい方向に向けることができれば、私は非常に感謝しています. 前もって感謝します。

4

2 に答える 2

0

誰かが興味を持っているなら、私は自分で問題を解決することができました。if-condition []を削除しただけif (view == null)なので、新しいコードは次のようになります。

    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View view,
        ViewGroup parent) {

    ExpandListChild child = (ExpandListChild) getChild(groupPosition, childPosition);
    LayoutInflater infalInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    view = infalInflater.inflate(R.layout.child_layout, null);

    ArrayList<HashMap<String,String>> inputDetailsList = child.getInputfields();

    RadioGroup rg = (RadioGroup) view.findViewById(R.id.radiogroup);
    int has_radiogroup = 0;

    for (int i = 0; i <inputDetailsList.size(); i++){

        if (inputDetailsList.get(i).get("type").equals("radio")){
            System.out.println("type: "+inputDetailsList.get(i).get("type"));
            has_radiogroup = 1;
            RadioButton rb = new RadioButton(rg.getContext());
            rb.setText(inputDetailsList.get(i).get("textcontent"));
            System.out.println("textcontent: "+inputDetailsList.get(i).get("textcontent"));
            rb.setId(Integer.parseInt(inputDetailsList.get(i).get("value")));

            if (has_radiogroup == 1){
                rg.addView(rb);
            }
        }
    }

    return view;
}

今では理にかなっています。これLayoutInflaterは、新しい子ビューが生成されるたびに呼び出されます。つまり、グループが展開されます。これまでは、で埋められた既存のビュー(ビューはnullではありません)を使用し、その既存のビューにradiobuttons新しいビューを追加したradiobuttonsだけで、リストが画面にあふれていました。

しかし、問題に頭を悩ませようとしている人に感謝します。

于 2013-03-18T12:41:39.010 に答える
0

これは私のために働いています。RadioButton と CheckBoxの場合

        android:focusable="false"
于 2017-09-01T11:54:33.997 に答える