2012-03-30 5 views
3

Ich repliziere ein Inspektionsformular für ein Gerät in einer Android-App. Es gibt eine ExpandableListView, bei der Gruppendaten aus den verschiedenen Systemen der Maschine bestehen und die Child-Daten die Checkliste der Elemente mit einer RadioGroup enthalten, damit der Techniker den Bestanden/Fehlgeschlagen-Status des Artikels anzeigen kann. Alles funktioniert gut, außer wenn man einen Wert für einen RadioButton in einem Kind auswählt, wählt er einen Wert für den gleichen RadioButton in anderen Gruppen. Also, wenn ich hatte:ExpandableListView mit RadioButtons. Wählen Sie Wert für eine RadioGroup, mehrere weitere ausgewählt werden, wenn Gruppe erweitert

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 

Wenn ich in beiden Fragen in der Gruppe 1 Bestanden wählen, ohne jemals in Gruppe 2 gegangen, wenn erweitert, 1 oder beide der RadioGroups wird es auch ausgewählt bestanden hat.

Das Layout Ich bin mit dem Kind-Gruppe zu schaffen, mit der Radiogroup wie

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

Instanziierung 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 pro Vorschlag sieht:

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

Antwort

0

Sind Sie sicher, dass die @ + ID, die Sie für jeden RadioButton verwenden, für jede Gruppe unterschiedlich ist? Das ist das erste, was einem einfällt. Selbst wenn sie in einer anderen RadioGroup sind, bin ich mir ziemlich sicher, dass sie eindeutige IDs haben müssen, damit Sie ViewById korrekt finden können.

+0

Ich bin nicht sicher, wie das geht, da ich nur das obige Layout als das Layout für Gruppe 2 in meinem ExpandableListAdapter zuweisen. Wie würde ich jedem RadioButton eine neue ID zuweisen? – jmease

+0

Ich habe nicht viel mit SimpleExpandableListAdapter gearbeitet. Ich bin also nicht sehr positiv. Können Sie den Rest Ihres Layout-XMLs posten? Ich sehe nicht wirklich, wie das, was du da oben hast, zu den 2 Fragen pro Gruppe übersetzt. – Brayden

+0

Das ist das gesamte Layout. SimpleExpandableListAdapters nehmen Ihre Gruppierungsdaten und wenden das erste von Ihnen bereitgestellte Layout an (z. B. Android.Resource.Layout.SimpleExpandableListItem1) und dann die untergeordnete Datengruppierung und wenden das von Ihnen bereitgestellte zweite Layout an, das das oben beschriebene Layout ist. – jmease

0

Sie should't sicher Kinderradiogruppe aus xml hinzuzufügen .. versuchen Sie es zur Laufzeit das Hinzufügen ... dann einfach weiter alle

diese Kinder in einem Einige Schlüsselwertpaar (Child Position als Schlüssel und RadioButton- Object) .. nun weiß

Sie nicht

Einzigartigkeit benötigen, da Sie Bezug auf alle Optionsfelder haben .. ich gleiche Problem hatte und ich das tat, ist es nun

funktioniert gut .. es wird für den Umgang mit diesen, da Sie einfach erhalten Sie immer childPosition in

ExpandibleListView damit es einfach zu erreichen ..

+0

Können Sie vielleicht etwas Code zur Verfügung stellen? Wenn ich RadioButtons in GetChildView und nicht in XML hinzufüge, bekomme ich eine Menge RadioButtons unter jeder Frage und nicht die 4, die ich hinzufüge. – jmease

+0

Bitte beachte die bearbeitete GetChildView oben. Immer noch das gleiche Problem. – jmease

Verwandte Themen