¿Cómo usar RadioGroup en el adaptador personalizado ListView?

Quiero mostrar una sola opción de selección en mi lista. Estoy usando RadioButton en mi fila listView . Sé que RadioGroup se usa para una sola selección.

Pero el problema es que he agregado RadioButton en mi ListRowView . Ahora quiero agregar todos mis elementos de lista en un RadioButton . Estoy usando Custom Adapter y en getView() . Obtengo RadioButton en getView() , pero cuando quiero agregarlo en RadioGroup digo

“ver ya tiene padre, llamar a removeView () en el padre antes”

Y sé que es verdad, pero si lo elimino de la vista. Entonces no es visible.

También bash crear y agregar RadioButton progtwigción. Y luego RadioGrop en RadioGrop . Y luego para ver la fila de la lista. Pero esta vez, como padre es RadioGroup , así que de nuevo dice

“ver ya tiene padre, llamar a removeView () en el padre antes”

Lo que quiero hacer es seleccionar solo un elemento en la lista a la vez. Mi código es el siguiente.

getView

  public class MyAdapter extends ArrayAdapter  { private LayoutInflater mInflater ; int mResource ; List  mData ; Context context; public MyAdapter ( Context context , int resource , int textViewResourceId , List  data ) { super ( context , resource , textViewResourceId , data ) ; this.context = context; mData = data ; mResource = resource ; mInflater = ( LayoutInflater ) getSystemService ( Context.LAYOUT_INFLATER_SERVICE ) ; } @ Override public View getView ( int position , View convertView , ViewGroup parent ) { ViewHolder holder = null ; if ( convertView == null ) { convertView = mInflater.inflate ( mResource , null ) ; holder = new ViewHolder ( ) ; holder.icon = ( ImageView ) convertView.findViewById ( R.id.icon ) ; holder.text = ( TextView ) convertView.findViewById ( R.id.text ) ; holder.comment = ( TextView ) convertView.findViewById ( R.id.comment ) ; LinearLayout lin = ( LinearLayout ) convertView.findViewById ( R.id.linerList ) ; RadioButton rbtn = new RadioButton ( context ); LayoutParams lparam = new LayoutParams ( LayoutParams.WRAP_CONTENT , LayoutParams.WRAP_CONTENT ); rbtn.setSelected ( false ); holder.check = rbtn; //radioGroup.addView ( rbtn ); lin.addView ( rbtn , 0 ); convertView.setTag ( holder ) ; } else { holder = ( ViewHolder ) convertView.getTag ( ) ; } holder.text.setText ( mData.get ( position ).getText ( ) ) ; holder.comment.setText ( mData.get ( position ).getComment ( ) ) ; holder.icon.setImageResource ( getApplicationContext ( ).getResources ( ).getIdentifier ( mData.get ( position ).getIcon ( ) , "drawable" , getPackageName ( ) ) ) ; return convertView ; } } 

Mi XML para la fila

          

Se ve así si no uso RadioGroup

Tienes que hacer dos cosas:

  1. Use mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
  2. Haga que su vista de fila personalizada implemente Checkable . (Más información sobre esto aquí ).

Esta solución funciona y es bastante limpia, pero podría haber algunas soluciones mejores por ahí.

Debe usar su adaptador para administrar el estado de los botones de radio.

Debe mantener una referencia al último botón de opción marcado, y luego en RadioButton.onClick clic en configurar el último botón de setChecked(false) .

también recuerde configurar el botón de radio recién seleccionado como el último botón de opción seleccionado.

ver ejemplo:

 private class MyAdapter extends ArrayAdapter{ private int mResourceId = 0; private LayoutInflater mLayoutInflater; private RadioButton mSelectedRB; private int mSelectedPosition = -1; public MyAdapter(Context context, int resource, int textViewResourceId, List objects) { super(context, resource, textViewResourceId, objects); mResourceId = resource; mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public View getView(final int position, View convertView, ViewGroup parent) { View view = convertView; ViewHolder holder; if(view == null){ view = mLayoutInflater.inflate(mResourceId, parent, false); holder = new ViewHolder(); holder.name = (TextView)view.findViewById(R.id.text); holder.radioBtn = (RadioButton)view.findViewById(R.id.radioButton1); view.setTag(holder); }else{ holder = (ViewHolder)view.getTag(); } holder.radioBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(position != mSelectedPosition && mSelectedRB != null){ mSelectedRB.setChecked(false); } mSelectedPosition = position; mSelectedRB = (RadioButton)v; } }); if(mSelectedPosition != position){ holder.radioBtn.setChecked(false); }else{ holder.radioBtn.setChecked(true); if(mSelectedRB != null && holder.radioBtn != mSelectedRB){ mSelectedRB = holder.radioBtn; } } holder.name.setText(getItem(position)); return view; } private class ViewHolder{ TextView name; RadioButton radioBtn; } } 

Espero que lo haga por ti.

Esta es mi solución. Es bastante fácil.

my_radio_adapter_item.xml:

     

MyRadioAdapter.java

 public class MyRadioAdapter extends BaseAdapter { private Context mContext; private ArrayList mVariations; private int mSelectedVariation; public MyRadioAdapter(Context context, ArrayList variations, int selectedVariation) { mContext = context; mVariations = variations; mSelectedVariation = selectedVariation; } @Override public View getView(final int position, View convertView, ViewGroup parent) { View view = convertView; if(view==null) { LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(R.layout.my_radio_adapter_item, null); } final Variation variation = mVariations.get(position); TextView name = (TextView) view.findViewById(R.id.name); RadioButton radio = (RadioButton) view.findViewById(R.id.radio); name.setText(variation.getName()); if(position==mSelectedVariation) radio.setChecked(true); else radio.setChecked(false); view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mSelectedVariation = position; MyRadioAdapter.this.notifyDataSetChanged(); } }); return view; } ... } 

Podrías poner un

 private int selectedIndex = -1; 

luego, en el código getView puedes verificar

 if (position == selectedIndex) { rbtn.setSelected ( true ); } else { rbtn.setSelected ( false ); } 

y agrega un método en tu adaptador personalizado:

 public void setSelectedIndex(int index) { //some range-checks, maybe selectedIndex = index; //invalidate } 

Luego, en su onItemClickedListener llama a setSelectedIndex en la posición.

Necesita usar CheckedTextView en lugar del normal. http://developer.android.com/reference/android/widget/CheckedTextView.html

Nunca lo usé, pero AlertDialog lo usa para los elementos de SingleChoice. Entonces definitivamente funcionará 🙂

Editar: no te olvides de llamar

  listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

para agregar a las respuestas ya dadas, para un enfoque más modular, todos los elementos de la lista heredan de la misma clase / interfaz que tienen una función de mensaje que le permitiría pasarles masajes a través del adaptador.
El adaptador se registra a sí mismo con cada elemento que se agrega, por lo que cada elemento de la lista puede llamar al adaptador para enviar un mensaje. luego, en el oyente de RadioButton puede enviar un mensaje a todos los demás botones de radio para que se apaguen, encender el que está presionado y finalmente notificar el conjunto de datos modificado en el adaptador.

Tengo una clase ListAdapter y una clase abstracta ListItem que son bastante robustas; Lo enviaré a cualquiera que lo necesite.
Múltiples tipos de elementos de lista compatibles.

necesitas el mismo resultado o diferente …

Lo que quiero decir es que tiene que seleccionar solo uno de los idiomas de la lista. ¿Es correcto?

conformarlo Entonces daré un ejemplo para eso