6

enter image description herewie ein Listener für Kontrollkästchen in einem Adapter Ansicht hinzuzufügen, Android, ArrayAdapter, onCheckedChanged, OnCheckedChangeListener

Ich habe eine Listview, dass durch ein ArrayAdapter durch kleine xml Unteransichten bevölkert ist. Jede kleine Ansicht enthält nur zwei Dinge, ein Kontrollkästchen und eine Zeichenfolgenbeschriftung daneben.

Ich möchte einen onCheckedChanged-Listener festlegen, um das Ereignis zu erfassen, wenn der Benutzer die Kontrollkästchen aktiviert oder deaktiviert.

listView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

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

Toast.makeText(this, "box has been checked", Toast.LENGTH_SHORT).show(); 

} 

}

wo ich den Hörer Code setzen:

zum Beispiel der Hörer hier gezeigt? und wie richte ich es ein?

Code für die ArrayAdapter:

public class MobileArrayAdapter extends ArrayAdapter<CheckBoxInfo>{ 
    CheckBoxInfo[] objects; 
    Context context; 
    int textViewResourceId; 

    public MobileArrayAdapter(Context context, int textViewResourceId, 
     CheckBoxInfo[] objects) { 
     super(context, textViewResourceId, objects); 
     this.context = context; 
     this.textViewResourceId = textViewResourceId; 
     this.objects = objects; 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row_layout_view = convertView; 


      if ((row_layout_view == null)){ 


       LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       row_layout_view = inflater.inflate(R.layout.row_layout, null); 
      } 

      //CheckBoxInfo item = objects.get(position); // for arrayList 
      CheckBoxInfo item = objects[position]; 

      if(item != null){ 

      TextView textView = (TextView) row_layout_view.findViewById(R.id.textView1); 
      CheckBox checkBox = (CheckBox) row_layout_view.findViewById(R.id.checkBox1); 

      if(item !=null){ 
      textView.setText(item.checkBoxName); 
      checkBox.setChecked(item.checkBoxState); 
       } 
      } 
      return row_layout_view; 
    } 


} 

Antwort

29

Verwenden Sie das Beispiel nicht listView.setOnCheckedChangeListener oder onCheckedChanged Code.

Zuerst, für CheckBox, sollten Sie setOnClickListener() anstelle von setOnCheckedChangeListener() verwenden. Sie können den überprüften Zustand innerhalb der onClick() Funktion erhalten.

Zweitens, platzieren Sie Ihre setOnClickListener() innerhalb der getView() Funktion des Listenadapters.

Beispiel:

checkBox.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View arg0) { 
     final boolean isChecked = checkBox.isChecked(); 
     // Do something here. 
    } 
}); 
+3

ich dies wegen der Listview Recycling Ansichten funktioniert nicht denken. Wenn Sie einen Bildlauf nach unten durchführen und eine ausgewählte convertView-Datei wiederverwendet wird, wird die markierte Zeile deaktiviert. Wie kommst du dazu? –

+4

Das ist korrektes Verhalten. Wenn eine Ansicht wiederverwendet wird, haben alle untergeordneten Ansichten der Unteransicht die Eigenschaften der bedeutungslosen Ansicht, die wiederverwendet wurde. Daher müssen Sie jedes Mal alle Ansichten und ihre Attribute in 'getView()' aktualisieren. Dies beinhaltet das Setzen des CheckBox-Wertes sowie dessen 'OnClickListener'. Zusammenfassend behalten Sie den Listener und fügen Sie 'checkBox.setChecked()' hinzu, um ihn auf den erwarteten Wert zu setzen, falls die recycelte (oder neue) Ansicht eine andere Einstellung hat. –

1

Danke David! in Bezug auf HukeLau_DABA Kommentar, löste ich es, indem Sie das Listenansichtsobjekt mit dem CheckBox-Wert in OnClickListener() aktualisieren. In meinem Fall habe ich eine Liste von Orten, wie im nächsten Code zu sehen:

holder.placeCheckBox.setOnClickListener(new View.OnClickListener() { 

     //please note that objPlace, position and holder must be declared 
     //as final inside the getView() function scope. 
      @Override 
      public void onClick(View arg0) { 
       final boolean isChecked = holder.placeCheckBox.isChecked(); 
       if (isChecked){ 
        objPlace.setItemChecked("yes"); 
       }else{ 
        objPlace.setItemChecked("no"); 
       } 

       placesList.set(position,objPlace); // updating the list with the updated object 

      } 
     }); 
1

nicht beziehen sich auf „holder.placeCheckBox“ in Ihrem OnClickListener, sollten Sie anzeigen beziehen, die durch onClick geleitet wird und wirf es Code CheckBox so sollte wie folgt aussehen:

holder.placeCheckBox.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      boolean isChecked = ((CheckBox)arg0).isChecked(); 
      if (isChecked){ 
       objPlace.setItemChecked("yes"); 
      }else{ 
       objPlace.setItemChecked("no"); 
      } 

      placesList.set(position,objPlace); // updating the list with the updated object 

     } 
    }); 
0

Sie konnten dieses versuchen:

holder.placeCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 
     Log.d(TAG, "onCheckedChanged: " + holder.placeCheckBox.getText() + " " + (b ? "selected":"deselected")); 
    } 
}); 
Verwandte Themen