CursorAdapter en ListView

Estoy utilizando CursorAdapter para leer la base de datos en listview. Tengo una casilla de verificación en cada elemento de la lista que cuando la casilla fue marcada por el usuario la columna favorita en mi base de datos cambiar el sí y el elemento añadido a la favorita.

Todo está bien y la columna favorita cambió, pero cuando me desplazo hacia arriba y hacia abajo en la lista de la casilla de verificación sin marcar. Y si reinicia la aplicación, la casilla de verificación se ha comprobado

¿Qué debo hacer para este problema:

Perdón por mi mal ingles:

Clase CursorAdapter:

public class MyAdapter extends CursorAdapter { Context b; LayoutInflater inflater; @SuppressWarnings("deprecation") public MyAdapter(Context context, Cursor c) { super(context, c); inflater = LayoutInflater.from(context); b= (Context) context; } @SuppressWarnings("unused") @Override public void bindView(View view, Context context, final Cursor cursor) { // TODO Auto-generated method stub TextView tv1 = (TextView)view.findViewById(R.id.txt_name); TextView tv2 = (TextView)view.findViewById(R.id.txt_numer); tv1.setText(cursor.getString(2)); tv2.setText(cursor.getString(3)); final int pos = cursor.getPosition(); final CheckBox repeatChkBx = (CheckBox)view.findViewById(R.id.favorite_check); String me = cursor.getString(cursor.getColumnIndex("like")); if (me.equals("yes")) { repeatChkBx.setChecked(true); } else { repeatChkBx.setChecked(false); } repeatChkBx.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { MyDatabase MyDatabase = new MyDatabase(b); SQLiteDatabase mydb = MyDatabase.getWritableDatabase(); cursor.moveToPosition(pos); if (repeatChkBx.isChecked()) { mydb.execSQL("update list set like = 'yes' where id = " + cursor.getString(1)); }else{ mydb.execSQL("update list set like = 'no' where id = " + cursor.getString(1)); } } }); } protected Context getActivity() { // TODO Auto-generated method stub return null; } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { return inflater.inflate(R.layout.item, parent, false); } } 

captura de pantalla:

Introduzca aquí la descripción de la imagen

Problema es cuando se actualiza la base de datos sólo la base de datos va a actualizar no el cursor que adaptar el adaptador de cursor, por lo que tiene que utilizar

  changeCursor(newcursor); 

En su adaptador después de actualizar su base de datos. Espero que esto te ayude.

Los elementos marcados no se reciclan. Debe guardar los elementos marcados en algún tipo de matriz – dinámica o estática. Una matriz booleana sería adecuada para este propósito.

 Boolean[] myCheckedItems = new Boolean[SIZE]; 

Utilizaría el listAdapter para implementar el uso de múltiples selecciones en un ListView. Cree el siguiente modelo que contenga el nombre y la información si este elemento está seleccionado actualmente.

Primero cree la clase del modelo:

 public class Model { private String name; private boolean selected; public Model(String name) { this.name = name; selected = false; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isSelected() { return selected; } public void setSelected(boolean selected) { this.selected = selected; } } 

Cree el siguiente archivo xml en la carpeta layouts:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@+id/label" android:textSize="30px" > </TextView> <CheckBox android:id="@+id/check" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_marginLeft="4px" android:layout_marginRight="10px" > </CheckBox> </RelativeLayout> 

Cree el siguiente adaptador. Este adaptador agrega un escucha en la vista de casilla de verificación. Si se selecciona la casilla de verificación, se cambian los datos subyacentes del modelo. Checkbox obtiene el elemento de modelo correspondiente asignado mediante el método getTag ().

 import java.util.List; import android.app.Activity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.TextView; public class InteractiveArrayAdapter extends ArrayAdapter<Model> { private final List<Model> list; private final Activity context; public InteractiveArrayAdapter(Activity context, List<Model> list) { super(context, R.layout.rowbuttonlayout, list); this.context = context; this.list = list; } static class ViewHolder { protected TextView text; protected CheckBox checkbox; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; if (convertView == null) { LayoutInflater inflator = context.getLayoutInflater(); view = inflator.inflate(R.layout.rowbuttonlayout, null); final ViewHolder viewHolder = new ViewHolder(); viewHolder.text = (TextView) view.findViewById(R.id.label); viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check); viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { Model element = (Model) viewHolder.checkbox.getTag(); element.setSelected(buttonView.isChecked()); } }); view.setTag(viewHolder); viewHolder.checkbox.setTag(list.get(position)); } else { view = convertView; ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position)); } ViewHolder holder = (ViewHolder) view.getTag(); holder.text.setText(list.get(position).getName()); holder.checkbox.setChecked(list.get(position).isSelected()); return view; } } 

Al final, debe cambiar su actividad a lo siguiente:

 import java.util.ArrayList; import java.util.List; import android.app.ListActivity; import android.os.Bundle; import android.widget.ArrayAdapter; public class MyList extends ListActivity { /** Called when the activity is first created. */ public void onCreate(Bundle icicle) { super.onCreate(icicle); // create an array of Strings, that will be put to our ListActivity ArrayAdapter<Model> adapter = new InteractiveArrayAdapter(this, getModel()); setListAdapter(adapter); } private List<Model> getModel() { List<Model> list = new ArrayList<Model>(); //The following elements need to be changed by your elements. list.add(get("List number 1")); list.add(get("List number 2")); list.add(get("List number 3")); list.add(get("List number 4")); list.add(get("List number 5")); list.add(get("List number 6")); // Initially select one of the items list.get(1).setSelected(true); return list; } private Model get(String s) { return new Model(s); } 

}

  • El listview personalizado con una sola casilla de verificación se selecciona uno a la vez
  • Android 5.0 - las casillas de verificación de las preferencias no son visibles
  • Cambiar la casilla de verificación colorAccent en tiempo de ejecución mediante programación
  • Android Listview con hilandero y una casilla de verificación
  • Cómo agregar una casilla de verificación a un cuadro de diálogo de alerta
  • Android setOnCheckedChangeListener vuelve a llamar cuando la vista anterior vuelve
  • CheckBox Hacer la listaNo se puede hacer clic en el elemento
  • ¿Es eso un error con CheckBox en android?
  • Casilla de verificación en CursorAdapter
  • El texto de CheckBox de Android no se muestra
  • Problema de casilla de verificación en la aplicación instalada en listview
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.