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