Выберите только одну радиокнопку в обзоре переработчика

У меня есть обзор переработчика, в котором у каждого элемента есть 3 радиокнопки, сгруппированные в радиогруппу. Теперь пользователь может выбрать только одну радиокнопку на элемент в представлении реселлера. Но я хочу, чтобы пользователь выбрал только одну радиопереключатель в обзоре переработчика. Как этого достичь?

Вот как это выглядит сейчас.

введите описание изображения здесь

Я хотел бы сделать возможным проверить только 1 радиопереключатель на всем экране рециркулятора. Если 1-й переключатель в первом элементе отмечен, и после этого пользователь нажимает 2-й переключатель в 2-ом элементе, то первый переключатель в 1-м элементе должен быть отключен.

9 ответов

Решение

Вот еще один способ сделать то же самое. Это более элегантно, чем мой предыдущий ответ. Но я сохранил оба, так как предыдущий ответ обеспечивает большую гибкость.

private RadioButton lastCheckedRB = null;
...
@Override
public void onBindViewHolder(final CoachListViewHolder holder, final int position) {
   holder.priceRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            RadioButton checked_rb = (RadioButton) group.findViewById(checkedId);
            if (lastCheckedRB != null) {
                lastCheckedRB.setChecked(false);
            }
            //store the clicked radiobutton
            lastCheckedRB = checked_rb;
        }
    });

Вот что сработало для меня:

 private RadioButton lastCheckedRB = null;
 ...
 @Override
 public void onBindViewHolder(final CoachListViewHolder holder, final int position) {
  View.OnClickListener rbClick = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            RadioButton checked_rb = (RadioButton) v;
            if(lastCheckedRB != null){
                lastCheckedRB.setChecked(false);
            }
            lastCheckedRB = checked_rb;
        }
    };

    //price_1m, price3m, price_6m are RadioButtons inside a radiogroup
    holder.price1m.setOnClickListener(rbClick);
    holder.price3m.setOnClickListener(rbClick);
    holder.price6m.setOnClickListener(rbClick);

Здесь переключатель временно сохраняется в lastCheckedRB. При нажатии новой радиокнопки старая радиокнопка не проверяется. Первоначально lastCheckedRB имеет значение null.

Я использовал этот подход

public class OffersRecyclerViewAdapter extends
    RecyclerView.Adapter<OffersRecyclerViewAdapter.ViewHolder> {

private List<OffersModel> offersList;
private Context context;

private int lastSelectedPosition = -1;

public OffersRecyclerViewAdapter(List<OffersModel> offersListIn
        , Context ctx) {
    offersList = offersListIn;
    context = ctx;
}

@Override
public OffersRecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                               int viewType) {

    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.offer_item, parent, false);

    OffersRecyclerViewAdapter.ViewHolder viewHolder =
            new OffersRecyclerViewAdapter.ViewHolder(view);
    return viewHolder;
}

@Override
public void onBindViewHolder(OffersRecyclerViewAdapter.ViewHolder holder,
                             int position) {

 //since only one radio button is allowed to be selected,
    // this condition un-checks previous selections
    holder.selectionState.setChecked(lastSelectedPosition == position);
}

@Override
public int getItemCount() {
    return offersList.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {

    public RadioButton selectionState;

    public ViewHolder(View view) {
        super(view);

     selectionState = (RadioButton) view.findViewById(R.id.offer_select);

        selectionState.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                lastSelectedPosition = getAdapterPosition();
                notifyDataSetChanged();

            }
        });
    }
}

}

У меня возникли проблемы с принятым ответом. Иногда это делает отмеченную в настоящий момент переключенную кнопку выключенной, оставляя не выбранными переключатели. Это происходило при выборе радиокнопки в другой радиогруппе после выбора радиокнопки из одной группы.

Вот решение, вместо сохранения последней проверенной RadioButton, сохранения последней проверенной RadioGroup и очистки последней проверки, если последняя проверенная RadioGroup не является текущей и имеет выбранную RadioButton, как показано ниже.

Для получения дополнительной информации читайте http://www.zoftino.com/android-recyclerview-radiogroup

   priceGroup = (RadioGroup) view.findViewById(R.id.price_grp);

    priceGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup radioGroup, int i) {

            if (lastCheckedRadioGroup != null
                    && lastCheckedRadioGroup.getCheckedRadioButtonId()
                                     != radioGroup.getCheckedRadioButtonId()
                    && lastCheckedRadioGroup.getCheckedRadioButtonId() != -1) {
                lastCheckedRadioGroup.clearCheck();

                Toast.makeText(PackageRecyclerViewAdapter.this.context,
                        "Radio button clicked " + radioGroup.getCheckedRadioButtonId(),
                        Toast.LENGTH_SHORT).show();

            }
            lastCheckedRadioGroup = radioGroup;

        }
    });

В Котлине

      private var checkedRadioButton: CompoundButton? = null
....
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    this.holder=holder

    val option = getItem(position)
    holder.txt_place_name.setText(option.toString())

    holder.itemView.radioButton.setOnCheckedChangeListener(checkedChangeListener)
    if (holder.itemView.radioButton.isChecked) checkedRadioButton = 
    holder.itemView.radioButton
    }
....
    private val checkedChangeListener = CompoundButton.OnCheckedChangeListener { 
    compoundButton, isChecked ->
    checkedRadioButton?.apply { setChecked(!isChecked) }
    checkedRadioButton = compoundButton.apply { setChecked(isChecked) }
    }

КОТЛИН 2021

Объявите RadioButton в переменной в вашем классе адаптера

          private var lastCheckedRB: RadioButton? = null

Теперь в вашем классе адаптера onBindViewHolder напишите OnclickListener в RadioButton

      holder.YOURRADIOBUTTON.setOnClickListener {
        if (lastCheckedRB!=null){
            lastCheckedRB?.isChecked=false
        }
        lastCheckedRB = holder.YOURRADIOBUTTON
    }

Чтобы добавить к ответу G Anil Reddy :...

КОТЛИН 2023

я изменился

      lastCheckedRB = holder.YOURRADIOBUTTON

к:

      lastCheckedRB = if (lastCheckedRB == holder.YOURRADIOBUTTON) null else holder.YOURRADIOBUTTON

Это на случай, если пользователь нажмет один и тот же переключатель несколько раз. Он будет снимать флажок и проверять каждый раз, когда пользователь нажимает.


Объявите RadioButton в переменной в вашем классе адаптера

      private var lastCheckedRB: RadioButton? = null

Теперь в вашем классе адаптера onBindViewHolder напишите OnclickListener в RadioButton

      holder.YOURRADIOBUTTON.setOnClickListener {
        if (lastCheckedRB!=null){
            lastCheckedRB?.isChecked=false
        }
        lastCheckedRB = if (lastCheckedRB == holder.YOURRADIOBUTTON) null else holder.YOURRADIOBUTTON
    }

Попробуйте что-нибудь подобное:

public void onCheckedChanged(RadioGroup radioGroup, int checkedItemId) {
  mCheckedId = checkedItemId;
  mSelectedPosition = getAdapterPosition();
}

Код выше - слушатель, которого вы регистрируете на RadioGroup внутри onCreateViewHolder(), Префиксные элементы - это ваши поля в адаптере.

В onBindViewHolder():

if (position == mSelectedPosition) {
  holder.radioGroup.check(mCheckedId);
} else {
  holder.radioGroup.clearCheck();
}

Это должно работать таким образом.

final String[] country_selcted = new String[1];
    holder.rb_team_one.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                        if(b==true)
                            country_selcted[0] =holder.rb_team_one.getText().toString();
                        else
                            country_selcted[0] =holder.rb_team_two.getText().toString();
                    }
                });

Теперь напечатайте country_selcted[0], он дает вам только результат выбора радиогруппы

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