2011-01-06 10 views
1

Freunde,Wie programmiere ich alle Kontrollkästchen im benutzerdefinierten Listenadapter?

Ich verwende folgenden benutzerdefinierten Adapter, um Textansicht und Checkboxen in Listview anzuzeigen. jetzt, wenn Textansicht ausgewählt istAlle beim Klicken auf Checbox vor ihm in der Liste sollte ich alle Kontrollkästchen unten in der Liste auswählen. in meinem Fall wählen Sie alle Kontrollkästchen an Position "0" und andere darunter.

irgendjemand führe mich, wie man alle Checkboxarrays erhält, damit ich sie an- oder abwählen konnte. jede Hilfe wäre willkommen.

public class EfficientAdapter extends BaseAdapter implements 
     Filterable { 
    private LayoutInflater mInflater; 
    //private Context context; 
    List<DalCategories> obj; 

    public EfficientAdapter(Context context,List<DalCategories> value) { 

     mInflater = LayoutInflater.from(context); 
     obj = value; 
     //this.context = context; 
    } 

    public View getView(final int position, View convertView, 
     final ViewGroup parent) { 
     ViewHolder holder; 

     convertView = mInflater.inflate(R.layout.list_category_item, null); 

     holder = new ViewHolder(); 
     holder.TextTitle = (TextView) convertView.findViewById(R.id.list_item_title); 
     holder.checkBoxes = (CheckBox) convertView.findViewById(R.id.chkSubCategory); 


     if(obj.get(position).isIs_Selected()) 
     { 
      holder.checkBoxes.setChecked(true); 
     } 


     holder.checkBoxes 
     .setOnCheckedChangeListener(new OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(
        CompoundButton buttonView, boolean isChecked) { 

       if(select_all == true) 
{    
       // select all here........ 


}     


      } 
     }); 

     convertView.setTag(holder); 


     holder.TextTitle.setText(obj.get(position).getTitle()); 



     return convertView; 
    } 

    class ViewHolder 
    { 
     public TextView TextTitle; 
     public CheckBox checkBoxes; 
    } 

    @Override 
    public Filter getFilter() { 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public int getCount() { 
     return obj.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return obj.get(position); 
    } 

    }`enter code here` 

Antwort

1

Um Ihre Hauptfrage zu beantworten ... was Sie tun sollten, ist über die gespeicherten Daten iterieren (List obj) und setzen Sie die Werte auf wahr, und rufen Sie dann notifyDataSetChanged().

Allerdings gibt es viele Probleme mit Ihrem (etwas ironisch benannten) EfficientAdapter, den Sie ansprechen sollten.

Zuerst verwenden Sie das ViewHolder-Muster, aber das ist hier völlig nutzlos, weil Sie das convertView-Argument ignorieren und jedes Mal eine neue Ansicht von Grund auf neu erstellen. Da Ihre Ansichten nie wieder verwendet werden, macht der Viewholder nichts für Sie. Sie sollten nur dann eine neue Ansicht aufblasen, wenn convertView null ist.

Zweitens scheint es, als hätten Sie nur eine Aktion beim Klicken, wenn auf das erste Element geklickt wird, aber Sie erstellen und definieren Handler für jedes Element. Sie können Ihren Code effizienter gestalten, indem Sie diesen Check einfach nach außen verschieben, anstatt einen Event-Handler ohne Ope- ration an alle außer einem Ihrer Elemente anzuhängen.

empfehle ich Ihnen sehr dieses Video auf Listviews von Google I go/O: http://developer.android.com/videos/index.html#

0

Sie benötigen ein globales boolesches Array, um die Status der Kontrollkästchen zu speichern.

Declare dieses Array außerhalb onCreate() -Methode

private boolean[] itemToggled; 

Und Initialisiere es in onCreate() -Methode wie unten

itemToggled = new boolean[Checkbox.length]; 
int i; 
     for(i=0;i<Checkbox.length;i++) 
     { 
      itemToggled[i]=false; 
     } 

Dann können Sie diese in Ihrem Adapter haben.

@Override 
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
if(select_all == true) 
{    
       // select all here........ 
     int i; 
     for(i=0;i<Checkbox.length;i++) 
     { 
      itemToggled[i]=true; 
     } 

}  

Verwenden Sie den Wert in diesem Array für die Handhabung von Kontrollkästchen.

0
selectAllButton.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) 
     { 
      Log.i("Children Count",""+myListView.getCount()+"Items from MyList Checked"); 
       for(int i=0;i<myListView.getCount();i++) 
       { 
        myListView.setItemChecked(i,true); 
       } 
     } 
    }); 

Genießen Sie und halten androiding ...

Verwandte Themen