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

  • Nessun errore che invia textView.setText da thread non UI. Perché?
  • GridLayout (non GridView) come allungare tutti i bambini in modo uniforms
  • Single TextView con più text colorato
  • Distriggers una chiave sulla tastiera personalizzata in Android
  • Fare parte di una string audace in visualizzazione di text
  • Nessun client corrispondente trovato per il nome del pacchetto (Google Analytics) - productFlavors multipli e buildTypes
  • 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" /> 

  • Come modificare il colore delle tabs di navigazione di ActionBar?
  • (bisogno di consigli) Parlare con il database MySQL server dalla mia applicazione Android
  • Come fare il button Drag & Drop in Android
  • Come serializzare il valore null quando si utilizza l'interface Parcelable
  • è ansible hide la barra di sistema
  • onKeyDown in un servizio? (Chiavi globali globali)
  • 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.