Хорошо, я почитал и вижу, что Java проходит только по значению, а не по ссылка, поэтому я не знаю, как это сделать.
- У меня есть 6 Spinners в Android Activity, которые заполнены разными запросами SQLite.
- Код для заполнения каждого Spinner и установки OnItemSelectedListener очень похож, поэтому я надеялся провести рефакторинг в один метод и вызвать его 6 раз с каждым идентификатором Spinner и запросом Sqlite.
Как заставить Spinner onItemSelectedListener изменить правильный элемент экземпляра на каждом другом Spinner?
public void fillSpinner(String spinner_name, final String field_name) { // This finds the Spinner ID passed into the method with spinner_name // from the Resources file. e.g. spinner1 int resID = getResources().getIdentifier(spinner_name, "id", getPackageName()); Spinner s = (Spinner) findViewById(resID); final Cursor cMonth; // This gets the data to populate the spinner, e.g. if field_name was // strength = SELECT _id, strength FROM cigars GROUP BY strength cMonth = dbHelper.fetchSpinnerFilters(field_name); startManagingCursor(cMonth); String[] from = new String[] { field_name }; int[] to = new int[] { android.R.id.text1 }; SimpleCursorAdapter months = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, cMonth, from, to); months.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); s.setAdapter(months); // This is setting the Spinner Item Selected Listener Callback, where // all the problems happen s.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Cursor theCursor = (Cursor) parent.getSelectedItem(); // This is the problem area. object_reference_to_clas_member_of_field_name = theCursor .getString(theCursor.getColumnIndex(field_name)); } public void onNothingSelected(AdapterView<?> parent) { // showToast("Spinner1: unselected"); } });
}
Вы вызываете этот метод следующим образом: fillSpinner("spinner1","strength");
.
Он находит счетчик с идентификатором spinner1
и запрашивает базу данных для поля strength
. field_name, которое является сильным в этом примере, должно было быть объявлено окончательной переменной для использования в onItemSelectedListener, иначе я получил бы ошибку Cannot refer to a non-final variable field_name inside an inner class defined in a different method
.
Но как заставить onItemSelectedListener изменять значение другого члена экземпляра, когда используется каждый отдельный Spinner? Это самая важная строка кода: object_reference_to_clas_member_of_field_name = theCursor .getString(theCursor.getColumnIndex(field_name));
Я не могу использовать окончательную строку, поскольку переменная, очевидно, изменится, когда пользователь выберет другое значение. Я много читал и не нашел решения. Я могу просто скопировать и вставить этот код 6 раз и забыть о рефакторинге, но мне бы очень хотелось узнать элегантное решение. Напишите комментарий, если вы не понимаете мой вопрос, я не уверен, что хорошо объяснил себя.
Cannot refer to a non-final variable field_name inside an inner class defined in a different method.
, почему бы вам не объявитьfield_name
глобально в основном классе. - person Lalit Poptani   schedule 21.01.2012