Mam ListView, który w drodze ArrayAdapter jest wypełniana przez małe widoki xml sub. każdy mały widok ma tylko dwie rzeczy w środku, pole wyboru i etykietę ciągu obok niego.
Chcę ustawić detektor onCheckedChanged, aby przechwycić zdarzenie użytkownika sprawdzającego lub odznaczając pola wyboru.
na przykład pokazany tu słuchacz:
listView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
Toast.makeText(this, "box has been checked", Toast.LENGTH_SHORT).show();
}
}
gdzie mogę umieścić kod słuchacza? i jak to skonfigurować?
koddla 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;
}
}
I nie sądzę, że to działa, ponieważ poglądów recyklingu ListView. Gdy przewiniesz w dół, a wybrany convertView zostanie poddany recyklingowi, zaznaczony wiersz zostanie odznaczony. Jak sobie z tym poradzisz? –
To jest prawidłowe zachowanie. Kiedy widok zostaje ponownie użyty, wszystkie jego podrzędne elementy podrzędne mają cechy widoku bez znaczenia, który został poddany recyklingowi. Dlatego za każdym razem musisz aktualizować wszystkie widoki i ich atrybuty w 'getView()'. Obejmuje to ustawienie wartości CheckBox oraz jej "OnClickListener". Podsumowując, zachowaj słuchacza i dodaj 'checkBox.setChecked()', aby ustawić go na wartość oczekiwaną, w przypadku, gdy widok poddany recyklingowi (lub nowemu) ma inne ustawienie. –