Вы должны удерживать выбранный идентификатор переключателя для вашей модели.
1> Возьмите selectedId в вашей модели.
class Model{
int selctedId;
// getter setter
}
2> Прикрепите этот идентификатор к вашей радиогруппе.
@Override
public void onBindViewHolder(final CoachListViewHolder holder, final int position) {
Model model = list.get(position);
holder.radioGroup.check(model.getSelectedId);
holder.radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
{
public void onCheckedChanged(RadioGroup group, int checkedId)
{
model.setSelectedId(checkedId);
}
});
В этом решении мы держим выбранный идентификатор в модели и присоединяем это поле к радиогруппе с помощью radioGroup.check(model.getSelectedId);
Причина
Если вы не удерживаете выбранное значение, оно перерабатывается, когда пользователь прокручивает позицию.
Я нашел связанный вопрос также.
Хорошо протестированное решение
Вы используете привязку данных, поэтому приведенное выше решение может быть более коротким. Используйте двустороннюю привязку для хранения выбранного идентификатора.
Item.java
public class Item extends BaseObservable{
private int selectedId;
public int getSelectedId() {
return selectedId;
}
public void setSelectedId(int selectedId) {
this.selectedId = selectedId;
}
}
row_list.xml
<data>
<variable
name="item"
type="com.innovanathinklabs.sample.ui2.Item"/>
</data>
<RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:background="@color/colorPrimary"
android:checkedButton="@={item.selectedId}"
>
<android.support.v7.widget.AppCompatRadioButton
android:id="@+id/rbMale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="male"/>
<android.support.v7.widget.AppCompatRadioButton
android:id="@+id/rbFemale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="female"/>
</RadioGroup>
Теперь, когда вам нужно получить выбранный предмет. Тогда сделай это.
if(list.get(1).getSelectedId() == R.id.rbMale){
// male is selected
}
else if (list.get(1).getSelectedId() == R.id.rbMale){
// female is selcted
}
Также удалите любую другую ненужную логику из группы Радио и кнопок радио.
Магия привязки данных
Этот код преобразуется в android:checkedButton="@={item.selectedId}"
@Override
public void onBindViewHolder(final CoachListViewHolder holder, final int position) {
Model model = list.get(position);
holder.radioGroup.check(model.getSelectedId);
holder.radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
{
public void onCheckedChanged(RadioGroup group, int checkedId)
{
model.setSelectedId(checkedId);
}
});
Обновление
Это то, как вы привязываете свой элемент в макете вашего элемента.
holder.binding.setItem(list.get(position));