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;
}
}
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? –
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. –