studio solo seleccionar radiobutton programacion móviles guardar ejemplo desarrollo datos curso aplicaciones android listview checkbox cursor

solo - Android: ¿enlazar datos de una base de datos a un CheckBox en un ListView?



radiobutton android studio (3)

Estoy tratando de vincular los datos de mi SQLiteDatabase a un ListView . Actualmente estoy usando un SimpleCursorAdapter para completar mi ListView . Lamentablemente, esto no parece funcionar con la configuración de un atributo comprobado de CheckBox.

Así es como lo hago ahora; en lugar de cambiar el estado verificado de CheckBox, el adaptador está rellenando el valor del argumento de texto, por lo que el valor se muestra a la derecha de CheckBox como texto.

Java:

setListAdapter( new SimpleCursorAdapter( this, R.layout.mylist, data, new String[] { Datenbank.DB_STATE, Datenbank.DB_NAME }, new int[] { R.id.list_checkbox, R.id.list_text } ) );

mylist.xml:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:id="@+id/LinearLayout01" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" > <CheckBox android:text="" android:id="@+id/list_checkbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="false" ></CheckBox> <TextView android:text="" android:id="@+id/list_text" android:layout_width="wrap_content" android:layout_height="wrap_content" ></TextView> </LinearLayout>

Editar: El campo en la base de datos es, por supuesto, de tipo booleano y también he intentado asignar un id al campo marcado para completar el valor.


No estoy seguro de cómo haría esto aparte de crear un Adaptador personalizado que anulara newView / bindView o getView, según lo que sobrescriba (ResourceCursorAdapter es bueno).

Bien, entonces aquí hay un ejemplo. No probé para ver si se compilaría porque estoy en el trabajo, pero esto definitivamente debería apuntar en la dirección correcta:

public class MyActivity extends ListActivity { MyAdapter mListAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Cursor myCur = null; myCur = do_stuff_here_to_obtain_a_cursor_of_query_results(); mListAdapter = new MyAdapter(MyActivity.this, myCur); setListAdapter(mListAdapter); } private class MyAdapter extends ResourceCursorAdapter { public MyAdapter(Context context, Cursor cur) { super(context, R.layout.mylist, cur); } @Override public View newView(Context context, Cursor cur, ViewGroup parent) { LayoutInflater li = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); return li.inflate(R.layout.mylist, parent, false); } @Override public void bindView(View view, Context context, Cursor cur) { TextView tvListText = (TextView)view.findViewById(R.id.list_text); CheckBox cbListCheck = (CheckBox)view.findViewById(R.id.list_checkbox); tvListText.setText(cur.getString(cur.getColumnIndex(Datenbank.DB_NAME))); cbListCheck.setChecked((cur.getInt(cur.getColumnIndex(Datenbank.DB_STATE))==0? false:true)))); } } }


Puede establecer un SimpleCursorAdapter.ViewBinder personalizado:

SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(/* ur stuff */); cursorAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() { public boolean setViewValue(View view, Cursor cursor, int columnIndex) { if(columnIndex == 1) { CheckBox cb = (CheckBox) view; cb.setChecked(cursor.getInt(1) > 0); return true; } return false; } });

El método setViewValue se invoca para cada columna que especifique en el constructor SimpleCursorAdapter y le proporciona un buen lugar para manipular algunas (o todas) las vistas.


Puede resolver ese problema creando un widget CheckBox personalizado como ese:

package com.example.CustomCheckBox; public class CustomCheckBox extends CheckBox { public CustomCheckBox(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public CustomCheckBox(Context context, AttributeSet attrs) { super(context, attrs); } public CustomCheckBox(Context context) { super(context); } protected void onTextChanged(CharSequence text, int start, int before, int after) { if (text.toString().compareTo("") != 0) { setChecked(text.toString().compareTo("1") == 0 ? true : false); setText(""); } } }

Se llamará a la función onTextChanged cuando ListView vincula los datos al CheckBox (es decir, agregando "0" o "1"). Esto captará ese cambio y agregará su procesamiento booleano. La primera declaración "si" es necesaria para no crear recursión infinita.

A continuación, proporcione su clase personalizada en el archivo de diseño como tal:

<com.example.CustomCheckBox android:id="@+id/rowCheckBox" android:layout_height="fill_parent" android:layout_width="wrap_content" />

¡Deberias hacer eso!