Il modo migliore per aggiungere un listener di eventi all'interno di un loop e ottenere il tag dell'elemento

StackOverflow https://stackoverflow.com//questions/20020525

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);
                }
            }
        });
    }
.

È stato utile?

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
scroll top