with validar studio radiobutton dinamico con botones android android-layout android-listview radio-button android-adapter

validar - Android: botón de opción en la vista de lista personalizada



radiobutton android checked (2)

Pruebe el adaptador siguiente:

public class ChooseAdapter extends ArrayAdapter<LinkedHashMap<String, String>> { private ArrayList<LinkedHashMap<String, String>> listMenu; int position_id; private LayoutInflater inflater; Context context; public ChooseAdapter(Activity activity, ArrayList<LinkedHashMap<String, String>> listMenu, int type) { super(activity, R.layout.choose_single_item, listMenu); this.listMenu = listMenu; context = activity.getApplicationContext(); inflater = LayoutInflater.from(context); } public int getCount() { return listMenu.size(); } public long getItemId(int position) { return position; } public static class ViewHolder { public CheckBox chk; } public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder view; if (convertView == null) { view = new ViewHolder(); convertView = inflater.inflate(R.layout.choose_single_item, null); view.chk = (CheckBox) convertView .findViewById(R.id.selection_checkbox); view.chk.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // TODO Auto-generated method stub if (isChecked) { listMenu.get((Integer) buttonView.getTag()).put( "checked", "true"); for (int i = 0; i < listMenu.size(); i++) { if (i != (Integer) buttonView.getTag()) { if (listMenu.get(i).containsKey("checked")) listMenu.get(i).remove("checked"); } } } else { listMenu.get((Integer) buttonView.getTag()).remove( "checked"); } notifyDataSetChanged(); } }); convertView.setTag(R.id.selection_checkbox, view.chk); convertView.setTag(view); } else { view = (ViewHolder) convertView.getTag(); } view.chk.setTag(position); view.chk.setText(listMenu.get(position).get("name")); if (listMenu.get(position).containsKey("checked")) { view.chk.setChecked(true); } else view.chk.setChecked(false); return convertView; } }

Y el diseño que estoy inflando es:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <CheckBox android:id="@+id/selection_checkbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dp" android:text="abc" android:textColor="#8C8C8C" android:textSize="16sp" /> </LinearLayout>

Aquí, he usado la casilla de verificación, también puede usar el botón de radio en lugar de eso, no se necesita nada más para cambiar.

¡Espero eso ayude!

Estoy desarrollando una aplicación en la que necesito implementar botones de opción en la vista de lista. Quiero implementar una vista de lista con un botón de opción y dos vistas de texto en cada fila. Y un botón "Ok" debajo de la vista de lista.

Lo que hice fue crear una vista de lista y un adaptador personalizado. El código de listview es como:

<ListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:cacheColorHint="#00000000" android:overScrollMode="never" tools:ignore="NestedScrolling" android:choiceMode="singleChoice" > </ListView>

Y creé un diseño de adaptador personalizado como:

<?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TableRow android:layout_width="fill_parent" android:layout_height="wrap_content" tools:ignore="UselessParent" > <RadioButton android:id="@+id/radiobutton" android:layout_width="0sp" android:layout_height="wrap_content" android:layout_weight=".1" /> <TextView android:id="@+id/textview1" android:layout_width="0sp" android:layout_height="wrap_content" android:layout_weight=".3" /> <TextView android:id="@+id/textview2" android:layout_width="0sp" android:layout_height="wrap_content" android:layout_weight=".3" /> </TableRow> </TableLayout>

El código de fragmento de Java es el siguiente:

ListView listView = (ListView) view.findViewById(R.id.listview); // values is a StringArray holding some string values. CustomAdapter customAdapter = new CustomAdapter (getActivity(), values); listView.setAdapter(customAdapter ); listView.setOnItemClickListener(this); @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {}

Y el código de adaptador es el siguiente:

public class CustomAdapter extends ArrayAdapter<String> { /** Global declaration of variables. As there scope lies in whole class. */ private Context context; private String[] listOfValues; /** Constructor Class */ public CustomAdapter (Context c,String[] values) { super(c,R.layout.adapter_layout,values); this.context = c; this.listOfValues = values; } /** Implement getView method for customizing row of list view. */ public View getView(final int position, View convertView, ViewGroup parent) { LayoutInflater inflater = ((Activity)context).getLayoutInflater(); // Creating a view of row. View rowView = inflater.inflate(R.layout.adapter_layout, parent, false); TextView textView1 = (TextView)rowView.findViewById(R.id.textview1); TextView textView2 = (TextView)rowView.findViewById(R.id.textview2); RadioButton radioButton = (RadioButton) rowView.findViewById(R.id.radiobutton); radioButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(context, CustomAdapter[position], Toast.LENGTH_SHORT).show(); } }); return rowView; } }

Los datos de textview1 se llenan desde la base de datos SQLite y en textview2 los datos son "Status Closed". Y al seleccionar o al hacer clic en cualquier botón de opción, el texto de la vista de texto cambia a "Estado abierto".

El problema es: la necesidad de la aplicación es que solo un botón de radio debe seleccionarse y los datos de textview2 obtener cambio en la selección. Y cuando el usuario hace clic en el otro botón de radio, se selecciona y el anterior debe deseleccionarse y el texto de textview2 cambia a "Estado cerrado" de un botón de opción previamente seleccionado y se hace clic en el botón de opción para "Estado abierto".

Editar 1:

Y haciendo clic en el botón "Aceptar", quiero obtener la posición, el texto de la vista de lista textview1 y textview2, ya que quiero guardar ese texto en la base de datos SQLite en la vista.

Por favor, guíame qué pasos debo seguir. Estoy en medio de mi solicitud. Su valiosa guía es requerida.


Aquí están las ideas clave

  • Cuando se RadioButton un RadioButton , debemos llamar a notifyDataSetChanged() , para que todas las vistas se actualicen.
  • cuando se selecciona un RadioButton , debemos establecer una posición selectedPosition , para mantener un registro de qué RadioButton está seleccionado
  • View se reciclan dentro de ListView . Por lo tanto, su posición absoluta cambia en ListView . Por lo tanto, dentro de ListAdapter#getView() , debemos llamar a setTag() en cada RadioButton . Esto nos permite determinar la posición actual de RadioButton en la lista cuando se hace clic en RadioButton .
  • RadioButton#setChecked() debe actualizarse dentro de getView() para View nueva o preexistente.

Aquí hay un ejemplo de ArrayAdapter que escribí y probé para demostrar estas ideas

public class MainActivity extends ListActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // I do no use these values anywhere inside the ArrayAdapter. I could, but don''t. final Integer[] values = new Integer[] {1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,}; ArrayAdapter<Integer> adapter = new ArrayAdapter<Integer>(this, R.layout.row, R.id.textview, values) { int selectedPosition = 0; @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.row, null); RadioButton r = (RadioButton)v.findViewById(R.id.radiobutton); } TextView tv = (TextView)v.findViewById(R.id.textview); tv.setText("Text view #" + position); RadioButton r = (RadioButton)v.findViewById(R.id.radiobutton); r.setChecked(position == selectedPosition); r.setTag(position); r.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { selectedPosition = (Integer)view.getTag(); notifyDataSetChanged(); } }); return v; } }; setListAdapter(adapter); } }