2012-03-30 2 views
3

Я реплицирую форму проверки для части оборудования в приложении для Android. Существует ExpandableListView, где данные группы состоят из разных систем машинного и дочернего данных, содержит контрольный список элементов с RadioGroup для техников, которые указывают статус прохода/отказа элемента. Все работает отлично, за исключением того, что при выборе значения для RadioButton у одного ребенка он выбирает значение для того же RadioButton в других группах. Так что, если у меня было:ExpandableListView с RadioButtons. Выберите значение для одной радиогруппы, еще несколько выберете выделение при расширении группы

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

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

ответ

0

Вы уверены, что идентификатор @ +, который вы используете для каждого RadioButton, отличается для каждой группы? Это первое, что приходит на ум. Даже если они находятся в другой RadioGroup, я уверен, что им нужно иметь уникальные идентификаторы, чтобы вы могли правильно найти findViewById.

+0

Я не уверен, как это сделать, поскольку я просто назначаю приведенный выше макет как макет для группы 2 в моем ExpandableListAdapter. Как назначить новый идентификатор каждому из RadioButtons? – jmease

+0

Я не много работал с SimpleExpandableListAdapter. Поэтому я не слишком позитивен. Можете ли вы опубликовать остальную часть вашего макета xml? Я действительно не понимаю, как то, что у вас есть, переводит на 2 вопроса на группу. – Brayden

+0

Это весь макет. SimpleExpandableListAdapters берут ваши данные группировки и применяют первый макет, который вы предоставляете (т. Е. Android.Resource.Layout.SimpleExpandableListItem1), а затем детскую группировку данных и применяете второй макет, который вы указываете, который является макетом, который я включил выше. – jmease

0

Вы наверняка should't добавить группу Child радио из XML .. попробуйте добавить его во время выполнения ... тогда просто держать все

этих детей в паре с Некоторыми ключевыми значениями (положение ребенка в качестве ключа и RadioButton Object) .. Теперь вы не

нужна уникальность, так как вы имеете ссылки на все Radiobuttons .. у меня была такая же проблема, и я это сделал, теперь

прекрасно работает .. это становится легким для обработки этих так как вы всегда получать childPosition в

ExpandibleListView таким образом облегчает доступ.

+0

Можете ли вы предоставить какой-то код? Когда я добавляю RadioButtons в GetChildView, а не в xml, я получаю кучу RadioButtons по каждому вопросу, а не по 4, которые я добавляю. – jmease

+0

См. Отредактированный GetChildView выше. По-прежнему имеет ту же проблему. – jmease