0

我想在我的 android 应用程序中制作一个可扩展的广播组列表。列表的每个元素都应包含(打开时)几个单独的无线电组。到目前为止,我正在测试每个孩子只有一个无线电组,而且我已经遇到了一个我自己似乎无法解决的问题。

当我扩展可扩展列表的父级时,它似乎工作正常。单选按钮(现在是父元素的唯一子元素)的单选按钮按应有的方式显示。但是,当我展开可展开列表的另一个父级时,单选按钮会添加到另一个子组的现有按钮中。这意味着:一旦我扩展了几个子组,每个扩展的子组都包含大量的单选按钮,充斥着整个屏幕。简而言之,当我展开 parent 1 时,我得到了选择

  • 是的
  • 也许

当我展开第二个父项时,我得到了单选选项

  • 是的
  • 也许
  • 是的
  • 也许
  • 大概

...它们也被添加到父 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。制作一个新的广播组将如下所示:

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子视图时都会调用 ,即扩展组。在此之前,它只是使用已填充的现有视图(视图不为空),radiobuttons并将新视图添加radiobuttons到现有视图中,导致我的列表充满屏幕。

然而,感谢任何试图解决这个问题的人。

于 2013-03-18T12:41:39.010 回答
0

这对我有用。对于单选按钮和复选框

        android:focusable="false"
于 2017-09-01T11:54:33.997 回答