Выберите только одну радиокнопку в обзоре переработчика
У меня есть обзор переработчика, в котором у каждого элемента есть 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], он дает вам только результат выбора радиогруппы