У меня есть список имен учетных записей и Spinner. Как мне заполнить Spinner списком?

Я борюсь со списками Android и тем, как преобразовать их для использования в Spinner. Поместить массив строк в Spinner очень просто, поэтому я подумал, что сделать то же самое со списком будет также просто. Однако в настоящее время я не могу понять, как получить список в правильном формате для использования с ArrayAdapter Spinner.

Вот мой код для получения списка имен учетных записей из базы данных:

//---retrieves all the accounts matching the account_type---
    public List getAccounts(String account_type) {      
        List<String> list = new ArrayList<String>();
        Cursor cursor = this.db.query(DBACCOUNTS, new String[] {
                ID,
                ACCOUNTTYPE,
                ACCOUNTNUMBER,
                ACCOUNTNAME},
                ACCOUNTTYPE + " = " + "'" + account_type + "'",
                null, 
                null, 
                null, 
                null, 
                null);
        if (cursor.moveToFirst()) {
           do {
              //---account_name column number is 3--- 
              list.add(cursor.getString(3));
           } while (cursor.moveToNext());
        }
        if (cursor != null && !cursor.isClosed()) {
           cursor.close();
        }

        return list;
    }

Что мне нужно сделать из возвращенного «списка», чтобы заполнить мой счетчик? Следующий код, очевидно, предназначен для массива строк, однако я не понимаю, что мне нужно сделать, чтобы список работал с аналогичной функциональностью. Вот мой неработающий код ArrayAdapter (account_name_array установлен как возвращаемый «список» сверху):

account_name_spinner = (Spinner) findViewById(R.id.account_name_spinner);      
account_name_adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, account_name_array);
account_name_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
account_name_spinner.setAdapter(account_name_adapter);

Я знаю, что здесь я далеко от пути, я знаю, что ArrayAdapter ожидает массив строк, однако, как я уже сказал, мне нужен хороший толчок в правильном направлении. Очевидно, мне нужно либо преобразовать мой список в массив строк, либо изменить способ адаптации Spinner к списку. Android было довольно сложно понять для меня, есть много структур данных и гораздо больше правил типов данных, чем я привык приходить из фона PHP.

Ваша помощь очень ценится!


person AutoM8R    schedule 26.07.2011    source источник


Ответы (3)


Используйте toArray, чтобы преобразовать список в массив.

List<String> list = new ArrayList<String>(); // Your list
// Populate it

// Then get an array:
String[] array = list.toArray( new String[0] );
person trutheality    schedule 26.07.2011
comment
Спасибо, просто! Не могли бы вы подтвердить, что я правильно понимаю? Инициализирована ли новая строка [0] для хранения временного массива, который функция .toArray требует для преобразования из ArrayList в массив строк? Следует ли подсчитывать количество результатов и оптимально инициализировать новую строку[‹num_of_results›]? - person AutoM8R; 26.07.2011
comment
Параметр toArray имеет две цели: первая — сообщить тип возвращаемого массива. Вторая (необязательная) цель — сохранить результат: если массив, который вы передаете, достаточно велик, результат будет возвращен в этом массиве. Если это не так, будет создан новый массив. - person trutheality; 26.07.2011

Если account_name_array является ArrayList, вам нужно преобразовать его в String[] и передать его адаптеру.

String[] account_names = account_name_array.toArray(new String[account_name_array.size()]);
account_name_adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, account_names);
person connoisseur    schedule 26.07.2011

У меня была аналогичная проблема, и вместо того, чтобы переходить от списка к счетчику, я просто изменил способ извлечения из моей базы данных, я написал другой метод, который возвращал количество строк в моей базе данных:

public int RowCount() {
    String count = "Select COUNT(_id) from " + TABLE_NAME;
    return (int) db.compileStatement(count).simpleQueryForLong();
}

Затем я объявил массив:

String []myArray = new String[db.RowCount()];

Затем я заполнил этот массив с помощью курсора, как кажется, вы уже знаете, как это сделать.

person Adam Storm    schedule 26.07.2011
comment
Спасибо, однако на данный момент я хотел бы сохранить его как ArrayList, чтобы я мог использовать в нем функции списка. - person AutoM8R; 26.07.2011