ExpandableListView с RadioButtons.Выберите значение для одной радиогруппы, несколько других будут выбраны при расширении группы - PullRequest
3 голосов
/ 30 марта 2012

Я копирую форму проверки для части оборудования в приложении для 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 или обе из Радиогрупп будут также выбраны Пропущенными.

Макет, который я использую для создания дочерней группы с 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;
    }

Ответы [ 3 ]

0 голосов
/ 03 апреля 2012

Вы, конечно, не должны добавлять дочернюю радиогруппу из xml .. попробуйте добавить ее во время выполнения ... затем просто сохраните все

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

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

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

ExpandibleListView , что облегчает доступ ..

0 голосов
/ 19 мая 2017

Используйте ListView и Inflate view для каждого элемента.Смотрите эту ссылку: Радиогруппа в ListView

0 голосов
/ 30 марта 2012

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

...