Возможно кто-то уже встречался (в андроиде это часто случается) с внутренними, анонимными классами. Пример:
Код: Выделить всё
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Выбрать адрес");
builder.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
// Что-то делаем.
});
AlertDialog alert = builder.create();
alert.show();
В него мы можем передавать только final переменные. Думаю все с этим встречались. Порой приходится как-то выкручиваться с этим делом. Это бывает редко, но всё же бывает. Тут нам могут помочь обычные массивы. Гляньте разницу
Код: Выделить всё
final int variable = 2;
Код: Выделить всё
final int[] massive = new int[1];
Суть в том, что final тут идёт на длину массива (которую по дефолту менять нельзя). Поэтому никак не влияет на смену переменных в массиве. Отсюда еще один вывод, что
Код: Выделить всё
final int[] massive = new int[1];
Код: Выделить всё
int[] massive = new int[1];
Массивы можно делать любой длины, не обязательно как я создал один элемент. приведу небольшой кусочек пода, где это понадобилось
Код: Выделить всё
private static void getListAdressDialog(final Place[] addresses, final MapActivity mapActivity) {
final String[] items = new String[addresses.length];
final Location currentLocation = mapActivity.getLocation();
for (int i=0;i<addresses.length;++i) {
Place r = addresses[i];
if (r!=null)
items[i] = "(" + FancyFormatter.distance(r.getLocation().distanceTo(currentLocation)) + ") " + r.getDisplayName();
else
items[i] = "(null)";
}
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Выбрать адрес");
builder.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
//Какие-то действия
});
AlertDialog alert = builder.create();
alert.show();
}