我有一个recyclerview,其中每个项目都有3个radiobuttons组合在一个radiogroup中。现在,用户只能在recyclerview中为每个项目选择一个radiobutton。但我希望用户在整个Recyclerview中只选择一个radiobutton。如何实现这一目标?
这就是它目前的样子。
我想在整个回收站视图中只检查1个radiobutton。如果选中第一项中的第一个单选按钮,之后用户点击第二项中的第二个单选按钮,则第一项中的第一个单选按钮应该取消选中。
答案 0 :(得分:17)
这是另一种做同样的方法。这比我以前的答案更优雅。但我保留了两个,因为之前的答案提供了更多的灵活性。
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;
}
});
答案 1 :(得分:12)
这对我有用:
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。
答案 2 :(得分:1)
我遇到了接受答案的问题。 有时它会取消选中当前选中的单选按钮,而不选择单选按钮。在从一个组中选择单选按钮后,在不同的无线电组中选择单选按钮时会发生这种情况。
这是解决方案,而不是保存上次检查的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;
}
});
答案 3 :(得分:1)
在 Kotlin 中
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) }
}
答案 4 :(得分:0)
尝试类似的东西:
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();
}
它应该以这种方式工作。
答案 5 :(得分:0)
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],它只为您提供行无线电组选择结果
答案 6 :(得分:0)
我使用了这种方法
upstream io_nodes {
ip_hash;
server 127.0.0.1:6001;
server 127.0.0.1:6002;
server 127.0.0.1:6003;
server 127.0.0.1:6004;
}