web-dev-qa-db-ja.com

recyclerviewでラジオボタンを1つだけ選択します

私はすべてのアイテムがラジオグループにグループ化された3つのラジオボタンを持っているrecyclerviewを持っています。現在、ユーザーはrecyclerviewのアイテムごとに1つのラジオボタンのみを選択できます。しかし、私はユーザーに、recyclerview全体でラジオボタンを1つだけ選択してほしいと思っています。どうすればこれを達成できますか?

これが現在の外観です。

enter image description here

リサイクル業者ビュー全体で1つのラジオボタンのみをチェックできるようにしたいと思います。最初の項目の1番目のラジオボタンがチェックされている場合、ユーザーが2番目の項目の2番目のラジオボタンをクリックすると、1番目の項目の1番目のラジオボタンがオフになります。

9
suku

これを行う別の方法を次に示します。これは私の以前の答えよりもエレガントです。ただし、前の回答の方が柔軟性が高いため、両方を保持しました。

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;
        }
    });
18
suku

これが私のために働いたものです:

 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に設定されています。

12
suku

私はこのアプローチを使用しました

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();

                }
            });
        }
    }
}
1
Developine

受け入れられた回答で問題に直面しました。時々、それは現在チェックされたラジオボタンをチェックされないままにし、ラジオボタンのどれも選択されないままにします。これは、1つのグループからラジオボタンを選択した後で、別のラジオグループのラジオボタンを選択すると発生していました。

以下に示すように、最後にチェックされたRadioButtonを保存する代わりに、最後にチェックされたRadioGroupを保存し、最後にチェックされたRadioGroupが現在のものではなく、ラジオボタンが選択されている場合は、最後のチェックをクリアするソリューションです。

詳細については 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;

        }
    });
1
Arnav Rao

同様のことを試してください:

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

上記のコードは、onCreateViewHolder()内のRadioGroupに登録するリスナーです。接頭辞付きの項目は、アダプタのフィールドです。

onBindViewHolder()内:

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

このように動作するはずです。

0
razzledazzle
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]を出力して、ラジオグループの選択結果のみを行に表示します。

0
Manoj Rawat