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
- No se puede usar la casilla de verificación en eclipse con el complemento de adt de Android
- Android Espresso - Haga clic en la casilla de verificación si no está marcada
- Spinner con elementos de casilla de verificación, ¿es posible?
- Android CheckBoxPreference - un / marque todas las preferencias
- Vista de lista de Android con el problema de la casilla de verificación
¿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:
- Puede cambiar el tipo de fuente de un Edittext, un botón de radio y un CheckBox en Android
- Iniciar otra actividad si la casilla está marcada
- Cuándo usar CheckBox y cuando cambie
- Establecer el estado de las casillas de verificación en Multichoice AlertDialog en Android
- CheckBox se desactiva en desplazamiento en una vista de lista personalizada
- Android: casilla de verificación que se repite cada 10º en un listview
- ¿Cómo guardar el estado de un Android CheckBox cuando los usuarios salen de la aplicación?
- Checkbox listener en RecyclerView con DataBinding
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); }
}
- Cree un IntentFilter en android que coincida con TODOS los intentos
- Obtener "java.lang.reflect.InvocationTargetException" al intentar registrar receptor de difusión de apk incrustado