web-dev-qa-db-fra.com

Sélectionnez un seul bouton radio dans un aperçu de recyclage

J'ai un tableau de recyclage dans lequel chaque élément a 3 radiobuttons regroupés dans un radiogroupe. Désormais, un utilisateur ne peut sélectionner qu'un seul radiobutton par élément dans Recyclerview. Mais je veux que l'utilisateur sélectionne un seul radiobutton dans la vue de recyclage. Comment cela peut il etre accompli?

Voici à quoi cela ressemble actuellement. 

 enter image description here

Je voudrais permettre de contrôler seulement 1 radiobutton dans la vue recycleur. Si le premier bouton radio du premier élément est coché et que l'utilisateur clique ensuite sur le 2e bouton radio du deuxième élément, le premier bouton radio du premier élément doit être décoché.

7
suku

Voici une autre méthode pour faire la même chose. C'est plus élégant que ma réponse précédente. Mais j'ai gardé les deux car la réponse précédente offre plus de flexibilité.

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

Voici ce qui a fonctionné pour moi:

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

Ici, le bouton radio est stocké temporairement dans lastCheckedRB. Quand un nouveau bouton radio est cliqué, l'ancien bouton radio est décoché. LastCheckedRB est initialement défini sur null. 

12
suku

Je me suis heurté à des problèmes avec la réponse acceptée . Parfois, le bouton radio actuellement coché était décoché, sans les boutons radio sélectionnés. Cela se produisait lors de la sélection d'un bouton radio dans un groupe de radio différent après la sélection d'un bouton radio d'un groupe.

Voici la solution: au lieu de sauvegarder le dernier bouton radio vérifié, sauvegardez le dernier groupe vérifié et effacez la dernière vérification si le dernier groupe coché n'est pas le groupe actuel et si le bouton radio sélectionné est sélectionné, comme indiqué ci-dessous.

Pour plus d'informations, lisez 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

J'ai utilisé cette approche

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

Maintenant, imprimer country_selcted [0] vous donne uniquement le résultat de la sélection du groupe de radio en ligne

0
Manoj Rawat