notifyDataSetChanged non riesce ad aggiornare ListView

Ho un DialogFragment che ha una vista di elenco con CheckedTextView e una casella di controllo in alto per controllare e deselect tutti gli elementi nella vista elenco. Sto cercando di impostare lo stato del CheckedTextView su Checked / Unchecked in base allo stato della casella di controllo CheckAll. Ma non riesco ad aggiornare la visualizzazione di conseguenza usando notifyDataSetChanged. immettere qui la descrizione dell'immagine

CategoriesDialogFragment.java

  • Video di YouTube non suonare in WebView - Android
  • PHP: Android perde le informazioni di session e cookie quando utilizza il lettore video incorporato
  • Posso eseguire un server HTTP su una piattaforma mobile?
  • Scorrere con più ListViews per Android
  • Differenza tra directory / res e / asset
  • Come definire grassetto in un selettore Android?
  • 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" /> 

  • Dov'è la produzione di un test strumentale android?
  • Android: Come get l'attuale offset X di RecyclerView?
  • La notifica di firebase non funziona quando l'attività è in background o no
  • Architettura di GUI di Android - relazione tra superficie / vista / window / canvas
  • Per eseguire dex in process, il demone Gradle necessita di un mucchio maggiore. Attualmente ha circa 910 MB
  • mela bonjour per android
  • 3 Solutions collect form web for “notifyDataSetChanged non riesce ad aggiornare ListView”

    Sto cercando di impostare lo stato del CheckedTextView su Checked / Unchecked in base allo stato della casella di controllo CheckAll. Ma non riesco ad aggiornare la visualizzazione di conseguenza usando notifyDataSetChanged.

    Aggiunto un esempio con il codice della domanda come un esempio delle mie risposte. Funziona e può essere trovato qui (osservatelo).

    Inoltre, la risposta di Android Developer funziona perché in pratica si ripristinerà l'adattatore con nuovi elementi con lo stato corretto each volta che l'utente controlla / deseleziona tutti i CheckBoxs . Questo potrebbe essere sprecato (ma accettabile se l'elenco è relativamente piccolo). Ricorda inoltre che se la categoryName della class Category cambia nella window di dialogo, è necessario assicurarsi di creare le nuove Categories con il nome corretto (se non si modifica il nome della categoria, questo non è un problema) quando viene eseguito il controllo di tutti i controlli.

    Prova qualcosa di simile:

    1. rimuovere le categoriesListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); se è nel tuo codice
    2. modificare OnCheckedChangeListener per controllare tutto CheckBox come questo:

        @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. aggiungere un OnItemClickListener alle categorieListView ListView come questo:

        @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. il setChecked(boolean) e getCheckStatus() (vedo che si dispone di un metodo isChecked in Category è ansible utilizzare per get lo stato boolean) sono methods nella class di categoria per impostare e get lo stato di tale elemento

    5. nel metodo getView() della scheda, impostare lo stato di questo tipo:

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

    Quindi stai cercando di impostare tutti i tuoi elementi controllati sul tuo

    setOnCheckedChangeListener

    come capisco. Prima di tutto, se vuoi rendere il tuo

    adapter.notifyDataSetChanged();

    per lavorare devi fare modifiche sul tuo contenuto. Tu stai usando

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

    per popolare la window di dialogo e per aggiornarlo è necessario utilizzare lo stesso con i dati modificati o creare una nuova scheda. Per utilizzare lo stesso nel setOnCheckedChangeListener devi fare qualcosa di simile:

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

    Prova questo e lasciami ora se funziona per te. 🙂

    anche nel tuo ciclo

     for (int i = 0; i < adapter.getCount(); i++) { CategoriesListAdapter adapter = (CategoriesListAdapter) parent.getAdapter(); Category c = (Category) adapter.getItem(i); c.setChecked(!c.getChecked()); } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.