与单选按钮ExpandableListView。选择值一RadioGroup中,几个都被选择当组将展开 [英] ExpandableListView with RadioButtons. Select Value For One RadioGroup, Several More Get Selected When Group Expands

查看:405
本文介绍了与单选按钮ExpandableListView。选择值一RadioGroup中,几个都被选择当组将展开的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我复制了Android应用中的一台设备的检查形式。有其中组数据由机器和子数据的不同的系统包含的项目以供技术人员,以指示通过/失败项目的状态的RadioGroup中的清单的ExpandableListView。所有的工作在一个孩子选择一个单选按钮的值时除外很大,它会选择其他组为同一单选按钮的值。所以,如果我有:

  1组
  问题1
    通过
    失败
    更正
    NA
  问题2
    通过
    失败
    更正
    NA
第2组
  问题1
    通过
    失败
    更正
    NA
  问题2
    通过
    失败
    更正
    NA

如果我在第1组两个问题选择过去了,而无需进入了第2组,展开后,1或两个RadioGroups的出现也就过去了还选择。

我使用与RadioGroup中创建子组的布局看起来像

 <?XML版本=1.0编码=UTF-8&GT?;
< LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
机器人:方向=垂直
机器人:layout_width =FILL_PARENT
机器人:layout_height =FILL_PARENT
机器人:layout_marginLeft =15dip>
<的TextView
机器人:ID =@ + ID / questionText
机器人:layout_width =WRAP_CONTENT
机器人:layout_height =WRAP_CONTENT/>
< RadioGroup中
机器人:标签=行动小组
机器人:layout_width =FILL_PARENT
机器人:layout_height =WRAP_CONTENT
机器人:方向=垂直>
<单选
  机器人:标签=通过
  机器人:layout_width =WRAP_CONTENT
  机器人:layout_height =WRAP_CONTENT
  机器人:文字=通过/>
<单选
  机器人:标签=失败
  机器人:layout_width =WRAP_CONTENT
  机器人:layout_height =WRAP_CONTENT
  机器人:文字=失败/>
<单选
  机器人:标签=更正
  机器人:layout_width =WRAP_CONTENT
  机器人:layout_height =WRAP_CONTENT
  机器人:文字=更正/>
<单选
  机器人:标签=NA
  机器人:layout_width =WRAP_CONTENT
  机器人:layout_height =WRAP_CONTENT
  机器人:文字=NA/>
< / RadioGroup中>
< / LinearLayout中>

BaseExpandableListAdapter的实例化

  ExpandableListView inspectionQuestions =(ExpandableListView)FindViewById(Android.Resource.Id.List);
inspectionQuestions.SetAdapter(新ExpAdapter(本));

BaseExpandableListAdapter

 公共类ExpAdapter:BaseExpandableListAdapter
{
    私人只读上下文的背景下;
    问题问题=新问题();
    私人诠释种子= 1000;    公共ExpAdapter(上下文CTX)
    {
        上下文= CTX;
    }    公众覆盖对象GetChild(INT groupPosition,诠释childPosition)
    {
        返回null;
    }    公众覆盖长GetChildId(INT groupPosition,诠释childPosition)
    {
        返回0;
    }    公众覆盖查看GetChildView(INT groupPosition,诠释childPosition,布尔isLastChild,查看convertView,父母的ViewGroup)
    {
        如果(convertView == NULL)
        {
            LayoutInflater吹气=(LayoutInflater)context.GetSystemService(Context.LayoutInflaterService);
            convertView = inflater.Inflate(Resource.Layout.inspection_row_2,NULL);
        }        INT currentID;        TextView的问题=(TextView中)convertView.FindViewById(Resource.Id.questionText);
        RadioGroup中无线电=(RadioGroup中)convertView.FindViewWithTag(行动小组);
        radio.Id =种子++;
        单选通=(单选)convertView.FindViewWithTag(通过);
        pass.Id =种子++;
        单选按钮失效=(单选)convertView.FindViewWithTag(失败);
        fail.Id =种子++;
        单选正确=(单选)convertView.FindViewWithTag(校正);
        correct.Id =种子++;
        单选按钮NA =(单选)convertView.FindViewWithTag(NA);
        na.Id =种子++;        字符串[] [] =项目questions.childItems();
        question.Text =项目[groupPosition] [childPosition];        返回convertView;
    }    公共覆盖INT GetChildrenCount(INT groupPosition)
    {
        返回questions.childItems()[groupPosition]。长度;
    }    公众覆盖对象GetGroup(INT groupPosition)
    {
        返回null;
    }    公众覆盖长GetGroupId(INT groupPosition)
    {
        返回0;
    }    公众覆盖查看GetGroupView(INT groupPosition,布尔isExpanded,查看convertView,父母的ViewGroup)
    {
        如果(convertView == NULL)
        {
            LayoutInflater吹气=(LayoutInflater)context.GetSystemService(Context.LayoutInflaterService);
            convertView = inflater.Inflate(Android.Resource.Layout.SimpleExpandableListItem1,NULL);
        }        TextView的组名=(的TextView)convertView.FindViewById(Android.Resource.Id.Text1);        QuestionGrouper石斑鱼=新QuestionGrouper();
        groupName.Text = grouper.groupItems()[groupPosition];        返回convertView;
    }    公众覆盖布尔IsChildSelectable(INT groupPosition,诠释childPosition)
    {
        返回true;
    }    公共覆盖INT GroupCount
    {
        得到{9; }
    }    公众覆盖布尔HasStableIds
    {
        获得{返回false; }
    }
}

每建议EDITED GetChildView:

 公众覆盖查看GetChildView(INT groupPosition,诠释childPosition,布尔isLastChild,查看convertView,父母的ViewGroup)
    {
        如果(convertView == NULL)
        {
            LayoutInflater吹气=(LayoutInflater)context.GetSystemService(Context.LayoutInflaterService);
            convertView = inflater.Inflate(Resource.Layout.inspection_row_2,NULL);
        }        TextView的问题=(TextView中)convertView.FindViewById(Resource.Id.questionText);        RadioGroup中无线电=(RadioGroup中)convertView.FindViewById(Resource.Id.activityGroup);
        诠释计数= radio.ChildCount;        如果(计数== 4)
        {
            返回convertView;
        }        单选通=新的单选按钮(上下文){文字=通过};
        单选按钮失效=新的单选按钮(上下文){文字=失败};
        单选正确=新的单选按钮(上下文){文字=更正};
        单选按钮NA =新的单选按钮(上下文){文字=NA};        radio.AddView(PASS);
        radio.AddView(失败);
        radio.AddView(正确的);
        radio.AddView(NA);        字符串[] [] =项目questions.childItems();
        question.Text =项目[groupPosition] [childPosition];        返回convertView;
    }


解决方案

您一定should't从XML添加子单选组..尝试在运行时添加它......然后就保持所有

在一些键值对(儿童地位的关键和单选按钮对象)那些孩子。现在你不要

需要的独特性,因为你必须参考所有单选按钮..我有同样的问题,我这样做,现在它

伟大工程..它变得容易处理这些,因为你总是在得到childPosition

ExpandibleListView 从而使其易于访问。

I am replicating an inspection form for a piece of equipment in an android app. There is an ExpandableListView where group data consists of the different systems of the machine and child data contains the checklist of items with a RadioGroup for the technician to indicate the pass/fail status of the item. All works great except when selecting a value for a RadioButton in one child, it selects a value for the same RadioButton in other groups. So if I had:

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

If I select Passed in both questions in Group 1, without ever having gone into group 2, when expanded, 1 or both of the RadioGroups there will have Passed selected also.

The layout I am using to create the child group with the RadioGroup looks like

<?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>

Instantiation of 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; }
    }
}

EDITED GetChildView per Suggestion:

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

解决方案

You surely should't add Child radio group from xml.. try adding it at run time... then just keep all

those children in a Some key value pair (Child position as key and RadioButton Object).. Now you don't

need uniqueness since You have reference to all RadioButtons.. I had same issue and I did this, now it

works great.. it becomes easy for handling these since you always get childPosition in

ExpandibleListView thus making it easy to access..

这篇关于与单选按钮ExpandableListView。选择值一RadioGroup中,几个都被选择当组将展开的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆