Настройка идентификатора для элементов счетчика

#android #spinner

#Android #счетчик

Вопрос:

У меня есть массив строк, которыми я заполняю объект счетчика. Тем не менее, я хотел бы прикрепить идентификатор к каждому элементу счетчика, поэтому, когда пользователь выбирает элемент, у меня есть его идентификатор, который можно использовать для сохранения в какой-либо другой части данных. Как я могу это сделать?

Комментарии:

1. Я не понимаю, счетчик или позиция массива недостаточны для использования в качестве идентификатора?

2. Это идентификатор, специфичный для элемента в счетчике. Это может быть 1; это может быть 93847549387925187. Это первичный ключ базы данных.

3. Эндрю, у меня такая же проблема … если вы получили ответ на свой вопрос, пожалуйста, помогите мне….

Ответ №1:

Создайте класс StringWithTag и используйте вместо имени строки в списке вот так :-

 public class StringWithTag {
    public String string;
    public Object tag;

    public StringWithTag(String stringPart, Object tagPart) {
        string = stringPart;
        tag = tagPart;
    }

    @Override
    public String toString() {
        return string;
    }
}
  

в части добавления элементов в счетчик :-

 List<StringWithTag> list = new ArrayList<StringWithTag>();
list.add(new StringWithTag("Oldman", "12345"));
list.add(new StringWithTag("Umpire", "987654"));
list.add(new StringWithTag("Squad", "ABCDEE"));
ArrayAdapter<StringWithTag> adap = new ArrayAdapter<StringWithTag> (this, android.R.layout.simple_spinner_item, list);
....
....
  

в прослушивателе :-

 public void onItemSelected(AdapterView<?> parant, View v, int pos, long id) {
    StringWithTag s = (StringWithTag) parant.getItemAtPosition(pos);
    Object tag = s.tag;
}
  

вуаля!
}

Комментарии:

1. @Robert… ошибка… StringWithTag — это нечто, созданное, как в первом блоке кода выше.

2. Это решение является элегантным и совершенным! Это также реализует ключевое значение счетчика, такое как HTML <select>

3. Именно то, что я искал. Спасибо @mfc

4. Сработало хорошо. Я всегда предпочитаю встроенную структуру, однако Android в этом отношении ее не хватает.

5. @Violet, все классы наследуются от Object, а toString — это метод, унаследованный от Object

Ответ №2:

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

 Spinner spinner = (Spinner) findViewById(R.id.spinner);
ArrayAdapter<MyObject> adapter = ... // initialize the adapter
adapter.setDropDownViewResource(android.R.layout.some_view);
spinner.setAdapter(adapter);
  

и когда элемент выбран

 public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
    MyObject selected = parent.getItemAtPosition(pos);
    // save any data relevant with selected item   
}
  

Если вы храните свои данные в базе данных, вы можете использовать CursorAdapter и в onItemSelected для извлечения идентификатора выбранного элемента из курсора.

Комментарии:

1. Если я использую CursorAdapter, как мне сообщить ему, что столбец «name» предназначен для текста, который отображается в списке?

Ответ №3:

Я не думаю, что вы можете прикрепить произвольный идентификатор к элементам ресурса текстового массива, если это то, что вы используете.

Я думаю, что самым простым способом прикрепить такой идентификатор было бы либо жестко запрограммировать (если вы используете статический текстовый ресурс), либо динамически создать (если вы получаете строки во время выполнения) сопоставление из (Позиция строки в массиве)-> (первичный ключ).

РЕДАКТИРОВАТЬ: С другой стороны, в Mojo Risin есть смысл — вам следует проверить, делает ли CursorAdapter API уже то, что вам нужно для вас.

Ответ №4:

Эндрю Привет, прошло много времени, но это стоит написать.

Вы можете установить тег для каждой строки при раздувании spinnerLayout в SpinnerAdapter:

 spinnerView = inflater.inflate(spinnerLayout, parent, false);
spinnerView.setTag("Your Tag");
  

И тогда вы можете получить тег с:

 yourSpinner.getSelectedView().getTag();
  

Ответ №5:

Я думаю, что лучшее решение — добавить еще один счетчик и заполнить его идентификаторами, но сделать его видимым, чтобы он исчез

Комментарии:

1. я так не думаю … если у вас есть массив объектов, которые вы хотите отобразить в spinner, вам будет проще получить доступ к выбранному идентификатору из этого массива объектов, чем к значению в другом spinner.