Ho un listView che per mezzo di un ArrayAdapter è popolato da piccole viste XML sub. ogni piccola vista ha solo due cose all'interno, una casella di controllo e un'etichetta di stringa accanto ad essa.
voglio impostare un listener onCheckedChanged per acquisire l'evento del controllo dell'utente o deselezionando le caselle di controllo.
ad esempio l'ascoltatore mostrato qui:
listView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
Toast.makeText(this, "box has been checked", Toast.LENGTH_SHORT).show();
}
}
dove metto il codice ascoltatore? e come lo installo?
codice per l'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;
}
}
io non credo che questo funziona perché di opinioni riciclaggio ListView. Mentre scorri verso il basso e un convertView selezionato viene riciclato, la riga selezionata diventa deselezionata. Come fai ad aggirare questo? –
Questo è un comportamento corretto. Quando una vista viene riutilizzata, tutti i suoi sottotitoli hanno le caratteristiche della vista senza significato che è stata riciclata. Pertanto, è necessario aggiornare tutte le viste e i loro attributi in 'getView()' ogni volta. Ciò include l'impostazione del valore CheckBox e il suo 'OnClickListener'. In breve, mantieni l'ascoltatore e aggiungi 'checkBox.setChecked()' per impostarlo sul valore atteso nel caso in cui la vista riciclata (o nuova) abbia un'impostazione diversa. –