NotifyDataSetChanged no puede actualizar ListView

Tengo un DialogFragment que tiene una vista de la lista con CheckedTextView y una caja de cheque en la tapa para comprobar y uncheck todos los artículos en la visión de la lista. Estoy intentando fijar el estado del CheckedTextView a comprobado / unchecked dependiendo del estado de la caja de cheque CheckAll. Pero no puedo actualizar la vista en consecuencia utilizando notifyDataSetChanged. Introduzca aquí la descripción de la imagen

CategoríasDialogFragment.java

public class CategoriesDialogFragment extends SherlockDialogFragment { CheckBox checkAll; ListView categoriesListView; CategoriesListAdapter adapter; static Category category; String[] categories = new String[] { "Hill Station", "Beach", "Historic", "Wild Life", "Waterfall", "River", "Archeology", "Hill Station", "Beach", "Historic", "Wild Life", "Waterfall", "River", "Archeology" }; Boolean[] categories_state = new Boolean[] { true, false, true, true, true, true, false, true, false, true, true, true, true, false }; public static CategoriesDialogFragment newInstance() { CategoriesDialogFragment frag = new CategoriesDialogFragment(); Bundle args = new Bundle(); frag.setArguments(args); return frag; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Dialog dialog = new Dialog(MainActivity.context); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.dialog_categories); categoriesListView = (ListView) dialog .findViewById(R.id.listViewDialog); List<Category> theCategories = new ArrayList<Category>(); for (int i = 0; i < categories.length; i++) { Boolean flag; Category pl = new Category(categories[i], categories_state[i]); theCategories.add(pl); } // categoriesListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); adapter = new CategoriesListAdapter(MainActivity.context, R.layout.dialog_list_item_category, theCategories); categoriesListView.setAdapter(adapter); // List View Item Click Listener categoriesListView .setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub CategoriesListAdapter adapter = (CategoriesListAdapter) parent .getAdapter(); Category c = (Category) adapter.getItem(position); c.setChecked(!c.getChecked()); adapter.notifyDataSetChanged(); } }); // CheckAll CheckBox checkAll = (CheckBox) dialog.findViewById(R.id.checkBoxAll); checkAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { Toast.makeText(MainActivity.context, "Check", Toast.LENGTH_SHORT).show(); for (int i = 0; i < adapter.getCount(); i++) { categoriesListView.setItemChecked(i, isChecked); Log.i("Nomad", isChecked + " isChecked " + i); } adapter.notifyDataSetChanged(); /* * if (isChecked) { Log.i("Nomad", "isChecked"); for (int i = 0; * i < adapter.getCount(); i++) { category = adapter.getItem(i); * category.setChecked(true); Log.i("Nomad", "isChecked "+i); } * adapter.notifyDataSetChanged(); } else { Log.i("Nomad", * "isUnChecked"); for (int i = 0; i < adapter.getCount(); i++) * { category = adapter.getItem(i); category.setChecked(false); * Log.i("Nomad", "isUnChecked "+i); } * adapter.notifyDataSetChanged(); } */ } }); return dialog; } private static class CategoriesListAdapter extends ArrayAdapter<Category> { public Context mContext; List<Category> mCategories; public CategoriesListAdapter(Context context, int resource, List<Category> categories) { super(context, resource, categories); // TODO Auto-generated constructor stub this.mCategories = categories; this.mContext = context; } public int getCount() { return mCategories.size(); } @Override public Category getItem(int position) { // TODO Auto-generated method stub return mCategories.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { LayoutInflater viewInflater; viewInflater = LayoutInflater.from(getContext()); convertView = viewInflater.inflate( R.layout.dialog_list_item_category, null); holder = new ViewHolder(); holder.categoryName = (CheckedTextView) convertView .findViewById(R.id.categories_checkbox); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.categoryName.setText(mCategories.get(position) .getCategoryName()); holder.categoryName.setChecked(mCategories.get(position) .getChecked()); return convertView; } static class ViewHolder { CheckedTextView categoryName; } } } 

Category.java

 public class Category { String categoryName = ""; private boolean checked = false; public Category(String categoryName, boolean checked) { this.categoryName = categoryName; this.checked = checked; } public String getCategoryName() { return categoryName; } public void setCategoryName(String categoryName) { this.categoryName = categoryName; } public boolean getChecked() { return checked; } public void setChecked(boolean checked) { this.checked = checked; } } 

Dialog_categories.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/parentPanel" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginEnd="8dip" android:layout_marginStart="8dip" android:background="@color/primary_white" android:orientation="vertical" > <LinearLayout android:id="@+id/title_template" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginEnd="16dip" android:layout_marginStart="16dip" android:gravity="center_vertical|start" android:orientation="horizontal" android:paddingTop="5dp" > <TextView android:id="@+id/textView1" style="?android:attr/textAppearanceLarge" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:paddingLeft="10dp" android:text="@string/dialog_category_title" android:textColor="@color/primary_color" android:textSize="22sp" /> <TextView android:id="@+id/all" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/dialog_category_checkbox" android:textColor="@color/primary_color" /> <CheckBox android:id="@+id/checkBoxAll" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingRight="6dp" /> </LinearLayout> <View android:id="@+id/titleDivider" android:layout_width="match_parent" android:layout_height="2dip" android:background="@color/black" /> <LinearLayout android:id="@+id/contentPanel" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:minHeight="64dp" android:orientation="vertical" > <ListView android:id="@+id/listViewDialog" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout> <LinearLayout android:id="@+id/buttonPanel" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <Button android:id="@+id/button_category_ok" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/dialog_category_btn_ok" android:textSize="14sp" /> </LinearLayout> </LinearLayout> 

Dialog_list_item_category.xml

 <?xml version="1.0" encoding="utf-8"?> <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/categories_checkbox" android:layout_width="fill_parent" android:layout_height="?android:attr/listPreferredItemHeight" android:checkMark="?android:attr/listChoiceIndicatorMultiple" android:gravity="center_vertical" android:onClick="toggle" android:paddingBottom="10dp" android:paddingLeft="10dp" android:paddingRight="12dp" android:paddingTop="10dp" android:text="sss" /> 

3 Solutions collect form web for “NotifyDataSetChanged no puede actualizar ListView”

Estoy intentando fijar el estado del CheckedTextView a comprobado / unchecked dependiendo del estado de la caja de cheque CheckAll. Pero no puedo actualizar la vista en consecuencia utilizando notifyDataSetChanged.

Se agregó una muestra con el código de la pregunta como ejemplo de mis respuestas. Funciona y se puede encontrar aquí (echar un vistazo).

Además, la respuesta de Android-Developer funciona porque básicamente restablecerás el adaptador con nuevos elementos con el estado correcto cada vez que el usuario compruebe o desmarque todos los CheckBoxs . Esto podría ser un desperdicio (pero aceptable si la lista es relativamente pequeña). Además, tenga en cuenta que si cambia el categoryName de la clase Category en el cuadro de diálogo, deberá asegurarse de que construye las nuevas Categories con el nombre correcto (si no modifica el nombre de la categoría, esto no es un problema) Cuando se actúa sobre todo CheckBox .

Intente algo como esto:

  1. Quite las categoriesListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); Si está en su código
  2. Modifique el OnCheckedChangeListener para comprobar todo CheckBox como esto:

      @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { Toast.makeText(getActivity(), "Check", Toast.LENGTH_SHORT) .show(); Log.i("Nomad", "isChecked"); for (int i = 0; i < adapter.getCount(); i++) { adapter.getItem(i).setChecked(isChecked); Log.i("Nomad", "isChecked " + i); } adapter.notifyDataSetChanged(); } 
  3. Agregue un OnItemClickListener a sus categoriesListView ListView como esto:

      @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { CategoriesListAdapter adapter = (CategoriesListAdapter) arg0 .getAdapter(); Category c = (Category) adapter.getItem(arg2); c.setChecked(!c.getCheckStatus()); adapter.notifyDataSetChanged(); } 
  4. El setChecked(boolean) y getCheckStatus() veo que tienes un método isChecked en Category que podrías usar para obtener el estado booleano) son métodos en tu clase Category para establecer y obtener el estado de ese elemento

  5. En el método getView() del adaptador, defina el estado como este:

     holder.categoryName.setChecked(mCategories.get(position) .getCheckStatus()); 

Por lo tanto, intenta establecer todos sus elementos

setOnCheckedChangeListener

Según entiendo. En primer lugar, si desea

adapter.notifyDataSetChanged();

Para trabajar tienes que hacer ediciones en tu contenido. Tu estas usando

List<Category> theCategories = new ArrayList<Category>();

Para rellenar tu cuadro de diálogo y para actualizarlo tienes que usar el mismo con datos modificados o crear un nuevo adaptador. Para utilizar el mismo en su setOnCheckedChangeListener usted tiene que hacer algo como esto:

 checkAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if(isChecked){ theCategories.clear(); Toast.makeText(MainActivity.context, "Check", Toast.LENGTH_SHORT).show(); for (int i = 0; i < categories.length; i++) { Category pl = new Category(categories[i], true); theCategories.add(pl); } adapter.notifyDataSetChanged(); } } }); 

Prueba esto y déjame ahora si funciona para ti. 🙂

En tu bucle for también

 for (int i = 0; i < adapter.getCount(); i++) { CategoriesListAdapter adapter = (CategoriesListAdapter) parent.getAdapter(); Category c = (Category) adapter.getItem(i); c.setChecked(!c.getChecked()); } 
  • Android getChildView no se llama después de notifyDataSetChanged
  • Mantener el foco en TextView después de notifyDatasetChanged () fue llamado en listview personalizado?
  • Cómo utilizar ListView, ArrayList, ArrayAdapter y notifyDataSetChanged junto con un runnable, y un Handler de mensaje en el hilo principal
  • Cómo proporcionar animación personalizada durante la clasificación (notifyDataSetChanged) en RecyclerView
  • Android ListView no se actualiza después de notifyDataSetChanged
  • Using notifyItemRemoved o notifyDataSetChanged con RecyclerView en Android
  • Adaptador de Android "java.lang.IndexOutOfBoundsException: Índice no válido 4, tamaño es 4"
  • Emitir refrescando una vista de una fila en recyclerview
  • ¿Por qué no necesito usar Adapter.notifyDataSetChanged ()?
  • Android: detecta si un ListView tiene la barra de desplazamiento (después de configurar nuevos datos)
  • RecyclerViewAdapter.notifyDataSetChanged () en una referencia de objeto nulo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.