with recyclerview problem android listview checkbox state

recyclerview - Android save Checkbox State en ListView con adaptador Cursor



listview with checkbox in android (5)

Tuve el mismo problema: cómo alternar múltiples selecciones CheckedTextView en un diseño personalizado (es decir, sin usar android.R.layout.simple_list_item_multiple_choice )

Lo siguiente funcionó para mí. El ejemplo que tengo es una vista personalizada que se proporciona con un adaptador extendido desde SimpleCursorAdapter.

Mi vista personalizada (row_contact.xml):

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="wrap_content" android:layout_width="fill_parent"> <CheckedTextView android:id="@android:id/text1" android:layout_width="fill_parent" android:layout_height="?android:attr/listPreferredItemHeight" android:textAppearance="?android:attr/textAppearanceLarge" android:gravity="center_vertical" android:paddingLeft="6dip" android:paddingRight="6dip" android:checkMark="?android:attr/listChoiceIndicatorMultiple" /> <TextView android:text="@+id/TextView01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tvNumber" android:layout_gravity="bottom" android:paddingLeft="6dip" android:paddingRight="6dip" /> </FrameLayout>

El adaptador se crea en ListActivity.OnCreate, que llama a setupViews ():

private void setupViews() { bOk = (Button) findViewById(R.id.ButtonOK); bCancel = (Button) findViewById(R.id.ButtonCancel); FListView = getListView(); // bOk.setText("Select"); // FListView.setItemsCanFocus(false); FListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); // bOk.setOnClickListener(this); bCancel.setOnClickListener(this); // ContentResolver content = getContentResolver(); Cursor cursor = ApplicationHelper.MobilePhoneContacts(content); startManagingCursor(cursor); ListAdapter adapter = new CheckedCursorAdapter( SelectContacts.this, R.layout.row_contact, cursor, new String[] {People.NAME, People.NUMBER}, new int[] {android.R.id.text1, R.id.tvNumber}); setListAdapter(adapter); }

El adaptador personalizado:

public class CheckedCursorAdapter extends SimpleCursorAdapter { Activity context; Cursor c; public CheckedCursorAdapter(Activity context, int rowContact, Cursor cursor, String[] strings, int[] is) { super(context, rowContact, cursor, strings, is); this.context = context; this.c = cursor; } public View getView(int position, View convertView, ViewGroup parent) { View row = convertView; ContactRowWrapper wrapper; if (row == null) { LayoutInflater inflater=context.getLayoutInflater(); row = inflater.inflate(R.layout.row_contact, null); // wrapper = new ContactRowWrapper(row); row.setTag(wrapper); } else { wrapper = (ContactRowWrapper)row.getTag(); } c.moveToPosition(position); wrapper.getTextView().setText( c.getString(c.getColumnIndex(Contacts.People.NUMBER)) ); wrapper.getcheckBox().setText( c.getString(c.getColumnIndex(Contacts.People.NAME)) ); wrapper.getcheckBox().setChecked(getListView().isItemChecked(position)); // return row; } }

El código crucial para mí fue que las casillas de verificación funcionaran:

wrapper.getcheckBox().setChecked(getListView().isItemChecked(position));

Espero que esto lo ayude a usted o a cualquier otra persona que tropiece con esta pregunta.

Además, disculpe mi noobness de Java ... Hace unas semanas comencé Java.

No puedo encontrar la manera de guardar el estado de la casilla de verificación cuando uso un adaptador de Cursor. Todo lo demás funciona bien, pero si hago clic en una casilla de verificación, se repite cuando se recicla. He visto ejemplos que usan adaptadores de matriz, pero debido a mi falta de experiencia, me cuesta traducirlo usando un adaptador de cursor. ¿Podría alguien darme un ejemplo de cómo hacerlo? Cualquier ayuda apreciada.

private class PostImageAdapter extends CursorAdapter { private static final int s = 0; private int layout; Bitmap bm=null; private String PostNumber; TourDbAdapter mDbHelper; public PostImageAdapter (Context context, int layout, Cursor c, String[] from, int[] to, String Postid) { super(context, c); this.layout = layout; PostNumber = Postid; mDbHelper = new TourDbAdapter(context); mDbHelper.open(); } @Override public View newView(Context context, final Cursor c, ViewGroup parent) { ViewHolder holder; LayoutInflater inflater=getLayoutInflater(); View row=inflater.inflate(R.layout.image_post_row, null); holder = new ViewHolder(); holder.Description = (TextView) row.findViewById(R.id.item_desc); holder.cb = (CheckBox) row.findViewById(R.id.item_checkbox); holder.DateTaken = (TextView) row.findViewById(R.id.item_date_taken); holder.Photo = (ImageView) row.findViewById(R.id.item_thumb); row.setTag(holder); int DateCol = c.getColumnIndex(TourDbAdapter.KEY_DATE); String Date = c.getString(DateCol); int DescCol = c.getColumnIndex(TourDbAdapter.KEY_CAPTION); String Description = c.getString(DescCol); int FileNameCol = c.getColumnIndex(TourDbAdapter.KEY_FILENAME); final String FileName = c.getString(FileNameCol); int PostRowCol = c.getColumnIndex(TourDbAdapter.KEY_Post_ID); String RowID = c.getString(PostRowCol); String Path = "sdcard/Tourabout/Thumbs/" + FileName + ".jpg"; Bitmap bm = BitmapFactory.decodeFile(Path, null); holder.Photo.setImageBitmap(bm); holder.DateTaken.setText(Date); holder.Description.setText(Description); holder.cb.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { CheckBox cBox = (CheckBox) v; if (cBox.isChecked()) { mDbHelper.UpdatePostImage(FileName, PostNumber); } else if (!cBox.isChecked()) { mDbHelper.UpdatePostImage(FileName, ""); } } }); return row; }; @Override public void bindView(View row, Context context, final Cursor c) { ViewHolder holder; holder = (ViewHolder) row.getTag(); int DateCol = c.getColumnIndex(TourDbAdapter.KEY_DATE); String Date = c.getString(DateCol); int DescCol = c.getColumnIndex(TourDbAdapter.KEY_CAPTION); String Description = c.getString(DescCol); int FileNameCol = c.getColumnIndex(TourDbAdapter.KEY_FILENAME); final String FileName = c.getString(FileNameCol); int PostRowCol = c.getColumnIndex(TourDbAdapter.KEY_Post_ID); String RowID = c.getString(PostRowCol); String Path = "sdcard/Tourabout/Thumbs/" + FileName + ".jpg"; Bitmap bm = BitmapFactory.decodeFile(Path, null); File x = null; holder.Photo.setImageBitmap(bm); holder.DateTaken.setText(Date); holder.Description.setText(Description); holder.cb.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { CheckBox cBox = (CheckBox) v; if (cBox.isChecked()) { mDbHelper.UpdatePostImage(FileName, PostNumber); } else if (!cBox.isChecked()) { mDbHelper.UpdatePostImage(FileName, ""); } } }); } } static class ViewHolder{ TextView Description; ImageView Photo; CheckBox cb; TextView DateTaken; } }


Declare el CheckBox en el método getView y use este código

CheckBox checkBtn =(CheckBox) convertView.findViewById(R.id.phCheckBox); checkBtn.setChecked(Boolean.parseBoolean((vList.get(position).getCheckBtnStatus()))); checkBtn.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { if(checkBtn.isChecked()==true) { vList.get(position).setCheckBtnStatus("true"); System.out.println("vList.get(position)---"+vList.get(position).getCheckBtnStatus()+" -"+position); } else { vList.get(position).setCheckBtnStatus("false"); System.out.println("else vList.get(position)---"+vList.get(position).getCheckBtnStatus()+"-"+position); } } });

Después de eso, en la actividad principal, debe verificar qué posición de la casilla de verificación es verdadera.

save.setOnClickListener(new OnClickListener() { public void onClick(View v) { for (int i = 0; i < newList.size(); i++) { UserData v1 = newList.get(i); status = Boolean.parseBoolean(v1.getCheckBtnStatus()); if (status == true) { //write ur code here } }});


3. Code Code Attach listeners inside your activity “onCreate()” method, to monitor following events : If checkbox id : “chkIos” is checked, display a floating box with message “Bro, try Android”. If button is is clicked, display a floating box and display the checkbox states. File : MyAndroidAppActivity.java package com.mkyong.android; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.CheckBox; import android.widget.Toast; public class MyAndroidAppActivity extends Activity { private CheckBox chkIos, chkAndroid, chkWindows; private Button btnDisplay; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); addListenerOnChkIos(); addListenerOnButton(); } public void addListenerOnChkIos() { chkIos = (CheckBox) findViewById(R.id.chkIos); chkIos.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //is chkIos checked? if (((CheckBox) v).isChecked()) { Toast.makeText(MyAndroidAppActivity.this, "Bro, try Android :)", Toast.LENGTH_LONG).show(); } } }); } public void addListenerOnButton() { chkIos = (CheckBox) findViewById(R.id.chkIos); chkAndroid = (CheckBox) findViewById(R.id.chkAndroid); chkWindows = (CheckBox) findViewById(R.id.chkWindows); btnDisplay = (Button) findViewById(R.id.btnDisplay); btnDisplay.setOnClickListener(new OnClickListener() { //Run when button is clicked @Override public void onClick(View v) { StringBuffer result = new StringBuffer(); result.append("IPhone check : ").append(chkIos.isChecked()); result.append("/nAndroid check : ").append(chkAndroid.isChecked()); result.append("/nWindows Mobile check :").append(chkWindows.isChecked()); Toast.makeText(MyAndroidAppActivity.this, result.toString(), Toast.LENGTH_LONG).show(); } }); } }


Recomiendo que utilices el soporte integrado de Android para listas de opción múltiple ( CHOICE_MODE_MULTIPLE ).

El List11.java SDK de List11.java demuestra esto. También puede encontrar un proyecto de uno de mis tutoriales que lo usa aquí .

Todavía puede utilizar esta técnica con su propio diseño, siempre y cuando incluya un CheckedTextView con android:id="@android:id/text1" como se muestra en el recurso android.R.layout.simple_list_item_multiple_choice , una copia del cual se envía con tu SDK

Además, vea esta pregunta y esta pregunta, esta pregunta y esta pregunta .


  1. CheckBox Abra el archivo "res / layout / main.xml", agregue 3 "CheckBox" y un botón, dentro de LinearLayout.

Archivo: res / layout / main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <CheckBox android:id="@+id/chkIos" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/chk_ios" /> <CheckBox android:id="@+id/chkAndroid" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/chk_android" android:checked="true" /> <CheckBox android:id="@+id/chkWindows" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/chk_windows" /> <Button android:id="@+id/btnDisplay" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/btn_display" /> </LinearLayout>