wake-up-neo.com

Wählen Sie nur einen Radiobutton in einer Recyclingübersicht aus

Ich habe eine Recyclingübersicht, in der jeder Artikel 3 Radiobuttons enthält, die in einer Radiogruppe zusammengefasst sind. Jetzt kann ein Benutzer nur einen Radiobutton pro Artikel in der Recyclingübersicht auswählen. Ich möchte jedoch, dass der Benutzer im gesamten Recycler nur einen einzigen Radiobutton auswählt. Wie kann das erreicht werden?

So sieht es aktuell aus. 

 enter image description here

Ich möchte es ermöglichen, nur einen Radiobutton in der gesamten Sicht des Recyclers zu überprüfen. Wenn der erste Radioknopf im ersten Element markiert ist und der Benutzer anschließend auf den zweiten Radiobutton im zweiten Element klickt, sollte der erste Radiobutton im ersten Element deaktiviert werden.

7
suku

Hier ist eine andere Methode, um dasselbe zu tun. Dies ist eleganter als meine vorherige Antwort. Ich habe jedoch beides beibehalten, da die vorige Antwort mehr Flexibilität bietet.

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

Folgendes hat für mich funktioniert:

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

Hier wird das Optionsfeld in lastCheckedRB zwischengespeichert. Wenn ein neuer Radioknopf angeklickt wird, wird der alte Radiobutton deaktiviert. Anfangs ist lastCheckedRB auf null gesetzt. 

12
suku

Ich hatte Probleme mit der akzeptierten Antwort ... Manchmal macht es das aktivierte Optionsfeld deaktiviert, wenn keine der Optionsfelder ausgewählt wird. Dies geschah, wenn ein Optionsfeld in einer anderen Optionsgruppe ausgewählt wurde, nachdem ein Optionsfeld aus einer Gruppe ausgewählt wurde.

Hier ist die Lösung, anstatt den zuletzt markierten RadioButton zu speichern, die zuletzt markierte RadioGroup zu speichern und die letzte Prüfung zu deaktivieren, wenn die letzte markierte RadioGroup nicht die aktuelle ist und ein RadioButton ausgewählt ist (siehe unten).

Weitere Informationen finden Sie unter 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

Ich habe diesen Ansatz verwendet

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

                }
            });
        }
    }
}
0
Hammad Tariq

Versuchen Sie etwas Ähnliches:

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

Der obige Code ist der Listener, den Sie für RadioGroup in onCreateViewHolder() registrieren. Die vorangestellten Elemente sind Ihre Felder im Adapter.

In onBindViewHolder():

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

Es sollte so funktionieren.

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

Nun drucken Sie country_selcted [0] aus, um nur das Ergebnis der Auswahl der Radiosendergruppen anzuzeigen

0
Manoj Rawat