在recyclerview中只选择一个radiobutton

时间:2016-02-05 07:36:04

标签: android radio-button android-recyclerview

我有一个recyclerview,其中每个项目都有3个radiobuttons组合在一个radiogroup中。现在,用户只能在recyclerview中为每个项目选择一个radiobutton。但我希望用户在整个Recyclerview中只选择一个radiobutton。如何实现这一目标?

这就是它目前的样子。

enter image description here

我想在整个回收站视图中只检查1个radiobutton。如果选中第一项中的第一个单选按钮,之后用户点击第二项中的第二个单选按钮,则第一项中的第一个单选按钮应该取消选中。

7 个答案:

答案 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;
}