2009-10-01 14 views
43

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.Android: ¿enlazar datos de una base de datos a un CheckBox en un ListView?

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 lógico y también he intentado asignar un id al comprobar campo para completar el valor.

Respuesta

33

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

Ok, así que aquí hay un ejemplo. No he probado para ver si se compilará porque estoy en el trabajo, pero esto definitivamente tiene que introducir 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)))); 
     } 
    } 
} 
+0

¿Podría darme un ejemplo, porque soy muy nuevo en la programación de Android y todavía no he visto algo como esto? – svens

+0

Claro, déjame cavar algo y lo publicaré. – MattC

+0

¡Gracias! Funcionó. Parece que no hay función getBoolean() ;-). Ahora estoy usando cbListCheck.setChecked ((cur.getInt (cur.getColumnIndex (Datenbank.DB_STATE)) == 0? False: true)); que hace el truco. – svens

38

También podemos establecer una costumbre SimpleCursorAdapter.ViewBinder:

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.

+3

El único problema es que esto no está disponible en el nivel 3 de api (Android 1.5). Esto está disponible desde el nivel 5 de la API. –

+1

Esta técnica funcionó muy bien para que las imágenes se carguen en una vista de lista. Gracias. –

+4

Los documentos dicen que están disponibles desde el nivel 1 de la API. Además, debería ser bastante seguro apuntar al nivel 5 y hasta ahora: http://developer.android.com/resources/dashboard/platform-versions.html – plainjimbo

0

Puede resolver este problema mediante la creación de un widget CheckBox encargo de este modo:

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(""); 
     } 
    } 
    } 

La función OnTextChanged se llamará cuando el ListView une los datos de la casilla de verificación (es decir, añadir "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, proporcionar la clase personalizada para el archivo de diseño tales como:

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

Eso debería hacerlo!

+0

Me gusta esta implementación mejor, sin embargo, cuando lo intento, mi programa se bloquea cuando intenta inflar mi objeto CustomCheckBox. ¿Por qué sería esto? – finiteloop

+0

Esta solución no funciona para mí. – petrnohejl

Cuestiones relacionadas