Android: значение одного счетчика зависит от значения другого счетчика

У меня проблема на Android Spinner. В моем приложении я создал два Spinner на главной компоновке. 'State' Spinner и 'District' Spinner. Все данные Spinner хранятся в базе данных SQLite. Я хочу показать список «Район» на втором счетчике в зависимости от выбора конкретного «состояния» в первом счетчике. Пример: предположим, что, когда я выбираю Karnataka в первом счетчике, приложение сначала извлекает весь район из базы данных SQLite, относящейся к состоянию карнатаки, а затем отображает его на втором Spinner.

Для этого я делаю всю деятельность базы данных правильно, это означает создание двух «состояний» таблицы и «района», в которых один столбец в таблице окружения является внешним ключом, который ссылается на один из первичных ключей «таблицы состояний»,

db.execSQL("create table "+STATE_TABLE+" ("+ STATE_ID+" integer primary key autoincrement not null, "+ STATE_NAME+" text"+")"); db.execSQL("create table "+DISTRICT_TABLE+" ("+DISTRICT_ID+ " integer primary key autoincrement not null,"+DISTRICT_NAME +" text,"+STATE_ID+" integer, FOREIGN KEY(" +STATE_ID+") REFERENCES "+STATE_TABLE +"("+STATE_ID+")"+")"); 

Теперь в классе активности:

 spinnerState = (Spinner)findViewById(R.id.spinner1); spinnerDistrict = (Spinner)findViewById(R.id.spinner2); stateList = new ArrayList<String>(); districtList = new ArrayList<String>(); 

Предположим, что все данные готовы к хранению в базе данных.

Теперь мне нужно получить все данные «State» из базы данных и добавить их в элемент статистики, который является ArrayList.

 Cursor stateCursor = database.query(STATE_TABLE, new String[]{STATE_ID, STATE_NAME}, null, null, null, null, STATE_NAME); stateCursor.moveToFirst(); if(! stateCursor.isAfterLast()){ do{ int id = stateCursor.getInt(0); String stateName = stateCursor.getString(1); stateList.add(stateName); }while(stateCursor.moveToNext()); } stateCursor.close(); в Cursor stateCursor = database.query(STATE_TABLE, new String[]{STATE_ID, STATE_NAME}, null, null, null, null, STATE_NAME); stateCursor.moveToFirst(); if(! stateCursor.isAfterLast()){ do{ int id = stateCursor.getInt(0); String stateName = stateCursor.getString(1); stateList.add(stateName); }while(stateCursor.moveToNext()); } stateCursor.close(); 

После этого я создаю один ArrayAdapter и помещаю этот список состояний в это.

 spinnerState.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, stateList)); 

Затем я добавлю следующий код в класс активности:

 spinnerState.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View v, int pos, long id) { } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub } }); 

Теперь моя проблема здесь:

  1. Как я получаю StateId для выполнения запроса select для того, чтобы весь район был связан с конкретным состоянием в базе данных.
  2. Как будет создан адаптер для района.
  3. Где я поместил весь этот код.

Вот то, что мне нужно создать theListList после получения значения из состояния Spinner.

Подобный вопрос, который ранее задавался на этом веб-сайте, что они делают: они уже создают два адаптера для двух счетчиков, а затем применяют setOnItemSelectedListener. Пожалуйста, помогите мне, потому что здесь мой ум полностью перестает работать. Я отсылаю много книг и веб-сайтов, но не упоминает об этих проблемах.

Я вижу пару решений здесь:

Опция 1:

Вместо объявления stateList как ArrayList<String> , создайте пользовательское POJO StateInfo и назначьте stateList как ArrayList<StateInfo>

 public class StateList { private int id; private String stateName; //Constructors, getters and setters } 

Затем,

 if(! stateCursor.isAfterLast()){ do{ int id = stateCursor.getInt(0); String stateName = stateCursor.getString(1); stateList.add(new StateInfo(id, stateName)); }while(stateCursor.moveToNext()); } в if(! stateCursor.isAfterLast()){ do{ int id = stateCursor.getInt(0); String stateName = stateCursor.getString(1); stateList.add(new StateInfo(id, stateName)); }while(stateCursor.moveToNext()); } 

Теперь вы можете сделать это:

 public void onItemSelected(AdapterView<?> parent, View v, int pos, long id) { int id = stateList.get(pos).getId(); //Use This ID to construct your next SQLite query; and populate the district spinner. } 

Если вы это сделаете, вам придется создать настраиваемый ArrayAdapter и реализовать метод getView() . Посмотрите на документы Android, как это сделать.

Вариант 2:

Зачем вам нужен идентификатор состояния? Я полагаю, вы можете написать запрос, чтобы получить список округов, учитывая только имя штата. В этом случае вы можете сохранить stateList как ArrayList<String> и вам вообще не нужен класс StateInfo . Просто сделайте это:

 public void onItemSelected(AdapterView<?> parent, View v, int pos, long id) { String stateName = stateList.get(pos); //Use this name to construct your next SQLite query; and populate the district spinner. } 

Для проблемы 1:

Вам просто нужно следить за тем, какой пользователь выбирает пользователя в прядильщик, и в соответствии с его положением вы должны найти соответствующий идентификатор. Затем вы можете запросить район соответственно. Очевидно, вам придется использовать onItemSelectedListener этого счетчика, чтобы получить позицию Выбранное состояние.

Для проблемы 2:

Вам нужно сделать метод в вспомогательном классе, который принимает stateId (который вы бы вычислили, как я сказал выше), и вернул вас по названиям округов в массиве String. Таким образом, в вашем основном действии, в onItemSelectedListener состояния spinner, вам придется Возьмите этот массив строк и подготовьте адаптер для него. Там вам нужно будет установить адаптер на свой счетчик.

Это всегда даст вам обновленную информацию о том, что пользователь выбирает в массиве состояний.

Для проблемы 3:

Почти весь код будет в onItemSelectedListener только для вашего штата. Только метод получения связанных имен окружения будет в вашем вспомогательном классе.

Intereting Posts
Как узнать, отображается ли вид на экране в Android? Текст кнопки виджета Android 5.0 (Lollipop) находится во ВСЕХ CAPS Android-устройство не отображается в устройстве Android Chooser, но указано в adb Анимация изменения размера в дизайне материалов Android: отключить вибрацию по умолчанию OnLongClick Различные макеты для разных групп ExpandableListView Как получить адрес электронной почты с адресом первичной покупки Унаследовано от Theme.AppCompat * Размещение ImageView в центре с шириной и высотой до половины от ширины родительского элемента? Доступность пароля для Android не работает с библиотекой поддержки 25? Как использовать Recyclerview внутри Scrollview Учебники для OpenSL ES для Android Android, как установить первую вкладку как вкладку по умолчанию всегда Установить значок приложения вправо в панели инструментов деятельности Как разрешить UnsupportedOperationException Требуемый метод destroyItem не был переопределен