Select only one radio button from the list

I have repeatedly looked for this question, there are many questions that I found in stackoverflow, but I did not find a solution. Here is my problem. I have a list of items in linelayout as follows:  enter image description here

When the screen first appears, the last beam button is automatically selected. But if I select another radio button, the last radio button is already in the selected state. I want to select only one radion button, but at the same time, when the first one appears on the screen, the last radio button will be automatically selected, and the other will not be automatically selected. How can i achieve this. My adapter class is:

public class AdapterPaymentMethod extends ArrayAdapter<PaymentData> {
    private Context context;
    private boolean userSelected = false;
    ViewHolder holder;

    public AdapterPaymentMethod(Context context, int resource,
            List<PaymentData> items) {
        super(context, resource, items);
        this.context = context;
    }

    /* private view holder class */
    private class ViewHolder {
        RadioButton radioBtn;
        Button btPaymentMethod;
        // ImageView ivLine;
    }

    public View getView(final int position, View convertView, ViewGroup parent) {
        holder = null;
        PaymentData rowItem = getItem(position);
        LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            convertView = mInflater.inflate(
                    com.android.paypal.homeactivity.R.layout.list_item, null);
            holder = new ViewHolder();
            holder.radioBtn = (RadioButton) convertView
                    .findViewById(com.android.paypal.homeactivity.R.id.rdb_payment_method);
            holder.btPaymentMethod = (Button) convertView
                    .findViewById(com.android.paypal.homeactivity.R.id.bt_item_event);
            convertView.setTag(holder);
        } else
            holder = (ViewHolder) convertView.getTag();

        if(position==getCount()-1 && userSelected==false){
            holder.radioBtn.setChecked(true);
        Log.d("if position", ""+position);
        }
        else{
            holder.radioBtn.setChecked(false);
            Log.d("else position", ""+position);
        }

        holder.radioBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                userSelected=true;
                if(getCount()-1==position&&userSelected==true){         
                }
                else if(getCount()-2==position&&userSelected==true)
                {
                    holder.radioBtn.setChecked(true);
                }
            }
        });



        holder.radioBtn.setText(rowItem.getRdbText());
        holder.btPaymentMethod.setText(rowItem.getBtText());
        return convertView;
    }
}
+6
source share
4 answers

RadioButton Activity. OnClickListener RadioButtons :

// checks if we already have a checked radiobutton. If we don't, we can assume that 
// the user clicked the current one to check it, so we can remember it.
if(mCurrentlyCheckedRB == null) 
    mCurrentlyCheckedRB = (RadioButton) v;
    mCurrentlyCheckedRB.setChecked(true);
}

// If the user clicks on a RadioButton that we've already stored as being checked, we 
// don't want to do anything.       
if(mCurrentlyCheckedRB == v)
    return;

// Otherwise, uncheck the currently checked RadioButton, check the newly checked 
// RadioButton, and store it for future reference.
mCurrentlyCheckedRB.setChecked(false);
((RadioButton)v).setChecked(true);
mCurrentlyCheckedRB = (RadioButton)v;   
+13

:

ListAdapter.java

public class ListAdapter extends BaseAdapter {

    private Context context;
    private String[] version;
    private LayoutInflater inflater;
    private RadioButton selected = null;

    public ListAdapter(Context context, String[] version) {
        this.context = context;
        this.version = version;
        inflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return version.length;
    }

    @Override
    public Object getItem(int position) {
        return version;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View view, ViewGroup viewGroup) {

        final Holder holder;
        if (view == null) {
            holder = new Holder();
            view = inflater.inflate(R.layout.row_list, null);

            holder.radioButton = (RadioButton) view.findViewById(R.id.radio1);
            holder.textViewVersion = (TextView) view.findViewById(R.id.textView1);
            holder.btnMore = (Button) view.findViewById(R.id.button1);

            view.setTag(holder);
        } else {
            holder = (Holder) view.getTag();
        }

        holder.textViewVersion.setText(version[position]);

        //by default last radio button selected
        if (position == getCount() - 1) {
            if (selected == null) {
                holder.radioButton.setChecked(true);
                selected = holder.radioButton;
            }
        }

        holder.radioButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (selected != null) {
                    selected.setChecked(false);
                }
                holder.radioButton.setChecked(true);
                selected = holder.radioButton;
            }
        });       
    }

    private class Holder {
        private RadioButton radioButton;
        private TextView textViewVersion;
        private Button btnMore;
    }
}

, :)

+7

Try this hack.

In the layout, this will change.

<RadioButton
  android:id="@+id/radio"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_gravity="center_vertical"
  **android:clickable="false"
  android:focusable="false"**
/>

In your adapter, simply add the following lines:

 private int selectedPosition = -1;

 viewHolder.choiceButton = (RadioButton)convertView.findViewById(R.id.radio);

 if(selectedPosition == -1) {
    viewHolder.choiceButton.setChecked(position==getCount()-1);
 }
 else{
    viewHolder.choiceButton.setChecked(selectedPosition == position);
 }

In getView (), assign selectedPosition:

viewHolder.clickLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                selectedPosition = (int) view.getTag();
                notifyDataSetChanged();
            }
        });
0
source

Listview_Adapter.java. Take a global variable and initialize it private int lastSelectedPosition = -1;

public class ViewHolder extends RecyclerView.ViewHolder {
    public RadioButton check;
    public ViewHolder(View itemView) {
        super(itemView);
        check=itemView.findViewById(R.id.check_box4);//Your radio button id
        check.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                lastSelectedPosition = getAdapterPosition();
                notifyDataSetChanged();
            }
        });
    }
public void onBindViewHolder(ViewHolder holder, int position) {
    holder.check.setChecked(lastSelectedPosition == position);

}

0
source

All Articles