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
unRadioButton
, debemos llamar anotifyDataSetChanged()
, para que todas las vistas se actualicen. - cuando se selecciona un
RadioButton
, debemos establecer una posiciónselectedPosition
, para mantener un registro de quéRadioButton
está seleccionado -
View
se reciclan dentro deListView
. Por lo tanto, su posición absoluta cambia enListView
. Por lo tanto, dentro deListAdapter#getView()
, debemos llamar asetTag()
en cadaRadioButton
. Esto nos permite determinar la posición actual deRadioButton
en la lista cuando se hace clic enRadioButton
. -
RadioButton#setChecked()
debe actualizarse dentro degetView()
paraView
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);
}
}