0

Я разработал сценарий, который, согласно моему пониманию Java, должен был хорошо работать, но, к сожалению, этого не произошло. Сценарий объясняется в коде:Android - Получить значения кнопок радио в ListView

ListViewAdapter

public final class ListViewAdapter extends BaseAdapter { 

    private Context context; 
    private RadioGroup[] radioGroups; 
    private List<String> listOfData; 

    public OneForAllListViewAdapter(Context context, List<String> listOfData) { 
     super(); 
     this.context = context; 
     this.radioGroups = new RadioGroup[listOfData.size()]; 
     this.listOfData = listOfData; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     final String timelyOfferedStr = "Yes"; 
     final String lateOfferedStr = "Yes but late"; 
     final String notOfferedStr = "No"; 
     final String pName = listOfData.get(position); 

     if(convertView == null) { 
      convertView = LayoutInflater.from(context).inflate(R.layout.one_for_all_list_item, parent, false); 
     } 

     TextView pNameTextView = (TextView) convertView.findViewById(R.id.one_for_all_p_name_TextView); 
     RadioButton timelyOffered = (RadioButton) convertView.findViewById(R.id.one_for_all_timely_offered); 
     RadioButton lateOffered = (RadioButton) convertView.findViewById(R.id.one_for_all_late_offered); 
     RadioButton notOffered = (RadioButton) convertView.findViewById(R.id.one_for_all_not_offered); 

     this.radioGroups[position] = (RadioGroup) convertView.findViewById(R.id.one_for_all_radio_group); 

     pNameTextView.setText(pName); 
     timelyOffered.setText(timelyOfferedStr); 
     lateOffered.setText(lateOfferedStr); 
     notOffered.setText(notOfferedStr); 

     return convertView; 
    } 

    @Nullable 
    public ThatStatus[] getThoseStatuses() 
    { 
     ThatStatus[] thoseStatuses = new ThatStatus[radioGroups.length]; 

     for(int i=0; i<radioGroups.length; i++) { 
      int selectedRadioButton = radioGroups[i].getCheckedRadioButtonId(); 

      switch (selectedRadioButton) { 
       case R.id.one_for_all_timely_offered: 
        thoseStatuses [i] = ThatStatus.TimelyOffered; 
        break; 
       case R.id.one_for_all_late_offered: 
        thoseStatuses [i] = ThatStatus.Offered; 
        break; 
       case R.id.one_for_all_not_offered: 
        thoseStatuses [i] = ThatStatus.NotOffered; 
        break; 
       default: 
        return null; 
      } 
     } 

     return thoseStatuses; 
    } 
} 

Важно отметить в выше коде эта линия:

this.radioGroups[position] = (RadioGroup) convertView.findViewById (R.id.one_for_all_radio_group);

Я спасаю все RadioGroup с в массив RadioGroup, и в getThoseStatuses() Я пытаюсь получить проверенные RadioButton s от тех RadioGroup s. Но radioGroups[i].getCheckedRadioButtonId() всегда возвращает мне -1.

Я пропустил некоторые концепции Java? В чем проблема?

ответ

0

Это дефект дизайна. Вы должны не хранить изображения в вашей модели. Храните данные в своей модели. Вместо

this.radioGroups[position] = (RadioGroup) convertView.findViewById(R.id.one_for_all_radio_group); 

установить проверенный статус RadioGroup в соответствии с моделью:

model = getItem(position); 
switch(model.offered) { 
    case 0: 
    radioGroup.check(R.id.one_for_all_timely_offered); 
    break; 
    case 1: 
    radioGroup.check(R.id.one_for_all_late_offered); 
    break; 
    ... 

Храните все свои данные в модели представления.

Рассмотрите возможность расширения ArrayListAdapter. Получите доступ к элементам адаптера вместо входных данных.

0

Попробуйте создать шаблон Houlder для вашего адаптера.

Например: изменить GetView к

@Override 
     public View getView(int position, View convertView, ViewGroup parent) { 

      Viewhoulder viewHoulder = null; 
      final String timelyOfferedStr = "Yes"; 
      final String lateOfferedStr = "Yes but late"; 
      final String notOfferedStr = "No"; 
      final String pName = listOfData.get(position); 
      if(convertView == null) { 
       convertView = LayoutInflater.from(context).inflate(R.layout.one_for_all_list_item, parent, false); 
       viewHoulder = new Viewhoulder(); 
       viewHoulder.pNameTextView = (TextView) convertView.findViewById(R.id.one_for_all_p_name_TextView); 
       viewHoulder.timelyOffered = (RadioButton) convertView.findViewById(R.id.one_for_all_timely_offered); 
       viewHoulder.lateOffered = (RadioButton) convertView.findViewById(R.id.one_for_all_late_offered); 
       viewHoulder.notOffered = (RadioButton) convertView.findViewById(R.id.one_for_all_not_offered); 
       viewHoulder.radioGroup = (RadioGroup) convertView.findViewById(R.id.one_for_all_radio_group); 
      } 
      else 
       viewHoulder = (Viewhoulder)convertView .getTag(); 
      this.radioGroups[position] = viewHoulder .radioGroup ; 
      viewHoulder . pNameTextView.setText(pName); 
      viewHoulder .timelyOffered.setText(timelyOfferedStr); 
      viewHoulder .lateOffered.setText(lateOfferedStr); 
      viewHoulder .notOffered.setText(notOfferedStr); 
      return convertView; 
     } 

И создать этот класс Viewhoulder внутри адаптера

static class Viewhoulder { 
    private TextView pNameTextView; 
    private RadioButton timelyOffered; 
    private RadioButton lateOffered ; 
    private RadioButton notOffered; 
    private RadioGroup radioGroup; 
} 
+0

Я извиняюсь за поздний ответ, как это отличается от моего решения? Вы создаете дополнительный класс для сохранения просмотров, я сохраняю их в массиве. –

+0

Это не просто класс для хранения данных. Ваш код может часто вызвать findViewById() во время прокрутки ListView, что может замедлить производительность. Даже когда адаптер возвращает завышенный вид для повторной переработки, вам все равно нужно искать элементы и обновлять их. Способом повторного использования findViewById() является использование шаблона дизайна «view holder». –

+0

хорошо, спасибо за объяснение производительности. Я попробую. –