Я пытаюсь настроить большое количество OnClickListeners через цикл for. При каждом просмотре должен выполняться метод при нажатии; view 0 должен запустить метод со значением 0, view 1 со значением 1 и т. д.Передача значения переменной без ссылки в OnClickListener()
Однако, если я объявляю OnClickListener, используя переменную, которая увеличивается с помощью циклов for, OnClickListener запоминает ссылку на переменную, чем значение переменной в момент ее объявления.
Это, вероятно, не очень понятно - вот код:
for (int i = 0; i < 20; i++) {
cells[i] = (ImageView) findViewById(cellIDs[i]);
cells[cellnumber++].setOnClickListener(new OnClickListener() {
public void onClick(View v){
cellClicked(cellnumber, v);
}
});
}
Это правильно настраивает OnClickListeners для каждой ячейки, но в зависимости от того один щелкают, он всегда работает вызовы cellClicked со значением 21.
Я знаю, что могу вручную настроить OnClickListeners, используя cell[0]
. , , cellClicked(0, v),
, но есть ли способ сделать это, чтобы ClickListener передавал значение переменной, а не ссылку на переменную в цикле for?
(я видел несколько страниц, которые считают, что Java обычно работает с проходящими значениями и не ссылками, но я предполагаю, что в Android библиотеку как-то сделать по-другому, и, следовательно, мои трудности здесь.)
Спасибо, это очень полезно. Я немного экспериментирую и понимаю, что я могу получить. –
Удивительно, это было то, что мне нужно. Потребовалось немного возиться, так как вы не можете напрямую использовать объект от int, но в итоге я решил, что это сделает: «int cellID = Integer.valueOf (v.getTag(). ToString()); , Там может быть более прямой способ сделать это, но это сработало! Еще раз спасибо. –
Веселый хорошо. 'int cellId = (Integer) v.getTag()' должен работать. –