6

Ho un DialogFragment che ha una vista elenco con CheckedTextView e una casella di controllo in alto per Controllare e deselezionare tutti gli elementi nella vista elenco. Sto cercando di impostare lo stato di CheckedTextView su Controllato/Deselezionato a seconda dello stato della casella di controllo CheckAll. Ma non sono in grado di aggiornare la vista di conseguenza utilizzando notifyDataSetChanged. enter image description herenotifyDataSetChanged non riesce ad aggiornare ListView

CategoriesDialogFragment.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" /> 

risposta

2

Sto cercando di impostare lo stato del CheckedTextView a Controllato/Non selezionata a seconda dello stato della Casella di controllo checkall. Ma non sono in grado di aggiornare la vista di conseguenza utilizzando notifyDataSetChanged.

Aggiunto un esempio con il codice della domanda come esempio delle mie risposte. Funziona e can be found here (dai un'occhiata).

Inoltre, la risposta dello sviluppatore Android funziona perché in pratica ripristini l'adattatore con nuovi elementi con lo stato corretto ogni volta che l'utente controlla/deseleziona tutto CheckBoxs. Ciò potrebbe essere dispendioso (ma accettabile se la lista è relativamente piccola). Inoltre, tieni presente che se la classe Category della finestra di dialogo Category cambia nella finestra di dialogo dovrai assicurarti di creare il nuovo Categories con il nome corretto (se non modifichi il nome della categoria, questo non è un problema) quando viene eseguito il tutto CheckBox.

provare qualcosa di simile:

  1. rimuovere il categoriesListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); se è nel codice
  2. modificare il OnCheckedChangeListener per il controllo 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 a le tue categorie ListViewListView li ke 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 avete un metodo isChecked in Category si potrebbe usare che per ottenere lo stato booleano) sono metodi nella classe Category per impostare e ottenere lo stato di tale voce

  5. nel metodo dell'adattatore getView(), impostare lo stato in questo modo:

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

Aggiornamento del codice. Ho cambiato lo stato di category in valore booleano che è il modo in cui verrà memorizzato nei dati. veri mezzi controllati e viceversa. Ora quando carico il Dialog sto abilitando lo stato basato su isChecked(). Come da codice, facendo clic su controlla tutto ho aggiunto il codice. ma l'interfaccia utente non riflette lo stato selezionato e deselezionato. Ma su Log mostra il giusto valore. con notifyDataSetChanged non sono in grado di aggiornare l'interfaccia utente. –

+1

@HarshaMV Come appare il layout della tua riga? Hai un singolo 'CheckedTextView' o è un' CheckTextView' avvolto da un 'LinearLayout' come nella tua domanda precedente? – Luksprog

+0

un singolo CheckedTextView. aggiornerò il codice in questione –

2

Così si stanno cercando di impostare tutti i tuoi elementi selezionati sul tuo

setOnCheckedChangeListener

mi pare di capire. Prima di tutto, se si desidera rendere il vostro

adapter.notifyDataSetChanged();

a lavorare si deve apportare le modifiche sui vostri contenuti. Si utilizza

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

per popolare il dialogo e per aggiornare lo si deve utilizzare lo stesso con dati modificati o creare un nuovo adattatore. Per utilizzare lo stesso nel vostro 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 mi ha lasciato ora se funziona per voi. :)

+0

Perfetto. Grazie mille ha aiutato. solo per capire cosa stavo facendo male. perché non dovevo avvisare prima? –

+1

Felice che abbia funzionato per te. :) – hardartcore

Problemi correlati