Il modo migliore per aggiungere un listener di eventi all'interno di un loop e ottenere il tag dell'elemento
-
21-12-2019 - |
Domanda
Devo aggiungere un ascoltatore a tutte le caselle di controllo all'interno di un linearlayout e, ogni volta che si verifica un clic su ciascun elemento, controllare il valore del tag.Ho fatto qualcosa del genere, ma non ho a mio agio dichiarare una corda all'interno di un looping.Qualche migliore pratica?
ViewGroup generalContainer = (ViewGroup) contextView;
ViewGroup optionsContainer = (ViewGroup) generalContainer.getChildAt(0);
int len = optionsContainer.getChildCount();
CheckBox currentCheckBox;
for (int i = 0; i < len; i++) {
currentCheckBox = (CheckBox) optionsContainer.getChildAt(i);
final String currentTag = (String) currentCheckBox.getTag().toString();
currentCheckBox.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (((CheckBox) v).isChecked()) {
Log.i("ulog", "is checked " + currentTag);
} else {
Log.i("ulog", "not checked " + currentTag);
}
}
});
}
. Soluzione
Se stai cercando un modo più efficiente, è possibile dichiarare un singolo OnClickListener
per tutte le tue istanze CheckBox
.(Suppongo che tu stia impostando tag unici alle caselle di controllo durante la creazione.)
Quindi non ci sono problemi a utilizzare tag come stringa se li hai garantiti per essere unici.
OnClickListener checkBoxOnClickLister = new OnClickListener() {
@Override
public void onClick(View v) {
CheckBox checkBox = ((CheckBox) v);
String currentTag = (String) checkBox.getTag();
if (checkBox.isChecked()) {
Log.i("ulog", "is checked " + currentTag);
} else {
Log.i("ulog", "not checked " + currentTag);
}
}
};
for (int i = 0; i < len; i++) {
currentCheckBox = (CheckBox) optionsContainer.getChildAt(i);
currentCheckBox.setOnClickListener(checkBoxOnClickLister);
}
. Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow