Android: значение одного счетчика зависит от значения другого счетчика - PullRequest
4 голосов
/ 30 декабря 2011

У меня проблема с Android Spinner. В своем приложении я создал два Spinner на основном макете. "Штат" Spinner и "Район" Spinner. Все данные на Spinner хранятся в базе данных SQLite. Я хочу отобразить список «Район» на втором счетчике в зависимости от выбора конкретного «состояния» в первом счетчике. Пример: Предположим, что когда я выбираю Karnataka в первом вращателе, приложение сначала извлекает весь район из базы данных SQLite, связанный с состоянием karnataka, а затем отображает его во втором 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();

после этого я создаю один 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 для выполнения запроса на выборку для включения в базу данных всего района, связанного с конкретным состоянием.
  2. Как будет генерироваться адаптер для округа.
  3. где я положил все эти коды.

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

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

Ответы [ 2 ]

3 голосов
/ 30 декабря 2011

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

Вариант 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());
}

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

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 голос
/ 30 декабря 2011

Для задачи 1:

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

Для задачи 2:

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

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

Для задачи 3:

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

...