Android - Получить значения радиокнопок в ListView

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

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с тех RadioGroups. Но radioGroups[i].getCheckedRadioButtonId() всегда возвращает мне -1.

Я пропускаю какую-то концепцию Java? В чем здесь проблема?

2 ответа

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

Например: измените ваш 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;
}

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

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. Доступ к элементам адаптера вместо входных данных.

Другие вопросы по тегам