【问题标题】:ExpandableListView with RadioButtons. Select Value For One RadioGroup, Several More Get Selected When Group Expands带有 RadioButtons 的 ExpandableListView。为一个 RadioGroup 选择值,当组扩展时选择更多的值
【发布时间】:2012-04-14 12:25:58
【问题描述】:

我正在为 Android 应用程序中的一件设备复制检查表。有一个 ExpandableListView,其中组数据由机器的不同系统组成,子数据包含带有 RadioGroup 的项目清单,供技术人员指示项目的通过/失败状态。除了在一个孩子中为 RadioButton 选择一个值时,所有的工作都很好,它为其他组中的同一个 RadioButton 选择一个值。所以如果我有:

Group 1
  Question 1
    Passed
    Failed
    Corrected
    NA
  Question 2
    Passed
    Failed
    Corrected
    NA
Group 2
  Question 1
    Passed
    Failed
    Corrected
    NA
  Question 2
    Passed
    Failed
    Corrected
    NA

如果我在第 1 组的两个问题中都选择了通过,而没有进入第 2 组,那么在展开时,其中的 1 个或两个 RadioGroups 也会被选中。

我用来创建带有 RadioGroup 的子组的布局如下所示

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginLeft="15dip">
<TextView
android:id="@+id/questionText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<RadioGroup
android:tag="actionGroup"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<RadioButton
  android:tag="passed"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="Passed"/>
<RadioButton
  android:tag="failed"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="Failed"/>
<RadioButton
  android:tag="corrected"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="Corrected"/>
<RadioButton
  android:tag="na"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="NA"/>
</RadioGroup>
</LinearLayout>

BaseExpandableListAdapter 的实例化

ExpandableListView inspectionQuestions = (ExpandableListView) FindViewById(Android.Resource.Id.List);
inspectionQuestions.SetAdapter(new ExpAdapter(this));

BaseExpandableListAdapter

public class ExpAdapter : BaseExpandableListAdapter
{
    private readonly Context context;
    Questions questions = new Questions();
    private int seed = 1000;

    public ExpAdapter(Context ctx)
    {
        context = ctx;
    }

    public override Object GetChild(int groupPosition, int childPosition)
    {
        return null;
    }

    public override long GetChildId(int groupPosition, int childPosition)
    {
        return 0;
    }

    public override View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent)
    {
        if (convertView == null)
        {
            LayoutInflater inflater = (LayoutInflater) context.GetSystemService(Context.LayoutInflaterService);
            convertView = inflater.Inflate(Resource.Layout.inspection_row_2, null);
        }

        int currentID;

        TextView question = (TextView) convertView.FindViewById(Resource.Id.questionText);
        RadioGroup radio = (RadioGroup) convertView.FindViewWithTag("actionGroup");
        radio.Id = seed++;
        RadioButton pass = (RadioButton) convertView.FindViewWithTag("passed");
        pass.Id = seed++;
        RadioButton fail = (RadioButton) convertView.FindViewWithTag("failed");
        fail.Id = seed++;
        RadioButton correct = (RadioButton)convertView.FindViewWithTag("corrected");
        correct.Id = seed++;
        RadioButton na = (RadioButton)convertView.FindViewWithTag("na");
        na.Id = seed++;

        string[][] items = questions.childItems();
        question.Text = items[groupPosition][childPosition];

        return convertView;
    }

    public override int GetChildrenCount(int groupPosition)
    {
        return questions.childItems()[groupPosition].Length;
    }

    public override Object GetGroup(int groupPosition)
    {
        return null;
    }

    public override long GetGroupId(int groupPosition)
    {
        return 0;
    }

    public override View GetGroupView(int groupPosition, bool isExpanded, View convertView, ViewGroup parent)
    {
        if (convertView == null)
        {
            LayoutInflater inflater = (LayoutInflater) context.GetSystemService(Context.LayoutInflaterService);
            convertView = inflater.Inflate(Android.Resource.Layout.SimpleExpandableListItem1, null);
        }

        TextView groupName = (TextView) convertView.FindViewById(Android.Resource.Id.Text1);

        QuestionGrouper grouper = new QuestionGrouper();
        groupName.Text = grouper.groupItems()[groupPosition];

        return convertView;
    }

    public override bool IsChildSelectable(int groupPosition, int childPosition)
    {
        return true;
    }

    public override int GroupCount
    {
        get { return 9; }
    }

    public override bool HasStableIds
    {
        get { return false; }
    }
}

根据建议编辑 GetChildView:

   public override View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent)
    {
        if (convertView == null)
        {
            LayoutInflater inflater = (LayoutInflater) context.GetSystemService(Context.LayoutInflaterService);
            convertView = inflater.Inflate(Resource.Layout.inspection_row_2, null);
        }

        TextView question = (TextView) convertView.FindViewById(Resource.Id.questionText);

        RadioGroup radio = (RadioGroup) convertView.FindViewById(Resource.Id.activityGroup);
        int count = radio.ChildCount;

        if (count == 4)
        {
            return convertView;
        }

        RadioButton pass = new RadioButton(context) {Text = "Passed"};
        RadioButton fail = new RadioButton(context) {Text = "Failed"};
        RadioButton correct = new RadioButton(context) {Text = "Corrected"};
        RadioButton na = new RadioButton(context) {Text = "NA"};

        radio.AddView(pass);
        radio.AddView(fail);
        radio.AddView(correct);
        radio.AddView(na); 

        string[][] items = questions.childItems();
        question.Text = items[groupPosition][childPosition];

        return convertView;
    }

【问题讨论】:

    标签: android xamarin.android expandablelistview


    【解决方案1】:

    您确定您用于每个 RadioButton 的 @+id 对于每个组都不同吗?这是首先想到的。即使他们在不同的 RadioGroup 中,我也很确定他们需要拥有唯一的 ID,以便您可以正确地执行 findViewById。

    【讨论】:

    • 我不知道该怎么做,因为我只是将上述布局分配为我的 ExpandableListAdapter 中组 2 的布局。如何为每个 RadioButtons 分配一个新 ID?
    • 我对 SimpleExpandableListAdapter 的工作并不多。所以我不是太积极。您可以发布其余的布局 xml 吗?我真的不明白你在那里的内容如何转化为每组 2 个问题。
    • 就是整个布局。 SimpleExpandableListAdapters 获取您的分组数据并应用您提供的第一个布局(即 Android.Resource.Layout.SimpleExpandableListItem1),然后将子数据分组并应用您提供的第二个布局,即我上面包含的布局。
    • 返回并使用 BaseExpandableListAdapter 重新执行所有操作,如 [this example] (android-adda.blogspot.com/2011/06/…),然后使用 Randomizer 在 GetChildView 方法中设置每个 RadioButton 的 ID。所以显然问题不在于没有唯一 ID 的 RadioButtons。
    【解决方案2】:

    您当然不应该从 xml 添加子单选组..尝试在运行时添加它...然后保留所有

    Some 键值对中的那些孩子(孩子位置作为键和 RadioButton 对象).. 现在你不需要

    需要唯一性,因为您参考了所有 RadioButtons.. 我有同样的问题,我这样做了,现在它

    效果很好.. 处理这些变得很容易,因为你总是在

    中获得 childPosition

    ExpandibleListView 从而使其易于访问..

    【讨论】:

    • 你能提供一些代码吗?当我在 GetChildView 而不是 xml 中添加 RadioButtons 时,我会在每个问题下得到一堆 RadioButtons,而不是我要添加的 4 个。
    • 请参阅上面编辑的 GetChildView。仍然有同样的问题。
    【解决方案3】:

    对每个项目使用 ListView 和 Inflate 视图。 见此链接:RadioGroup in ListView

    【讨论】:

      猜你喜欢
      • 2017-01-14
      • 2013-06-14
      • 2011-12-28
      • 2016-04-07
      • 2016-02-26
      • 2011-02-25
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      相关资源
      最近更新 更多