Ответ 1
Я думаю, этот пост поможет вам Android: как связать spinner с пользовательским списком объектов?
У этого автора вопроса есть то же требование, что и вы
Я уверен, что этого много, и я нашел некоторые вопросы, похожие на них, но никто не получил монету для меня. Я надеюсь, что кто-то сможет мне помочь.
Что я хочу сделать, это предоставить пользователю выпадающий список (список) вкусов Vanilla, Chocolate, Strawberry.
Когда пользователь выбрал аромат по своему выбору, я хочу, чтобы значение Strawberry было возвращено 10.
Strawberry = 10
Chocolate = 20
Vanilla = 30
Я родом из фона vb.net, поэтому считаю, что это невероятно сложно работать с тем, что мне нужны массивы и прочее для этого?
Может ли кто-нибудь упростить вещи для меня и, возможно, поделиться каким-то кодом?
Я думаю, этот пост поможет вам Android: как связать spinner с пользовательским списком объектов?
У этого автора вопроса есть то же требование, что и вы
вы можете попробовать это
ArrayAdapter<String> SpinerAdapter;
String[] arrayItems = {"Strawberry","Chocolate","Vanilla"};
final int[] actualValues={10,20,30};
SpinerAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_dropdown_item, arrayItems);
spinner.setAdapter(SpinerAdapter);
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
int thePrice=actualValues[ arg2];
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
вот код:
TextView textView=(TextView) findViewById(R.id.textView1);
Spinner spinner=(Spinner) findViewById(R.id.spinner1);
spinner.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item,quantity));
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
if(arg2==0){
textView.setText("Strawberry = 10");
}else if(arg2==1){
textView.setText("Chocolate = 20");
}else if(arg2==2){
textView.setText("Vanilla = 30");
}
}
public void onNothingSelected(AdapterView<?> arg0) {
}
});
String[] quantity={"Strawberry","Chocolate","Vanilla"};
и файл xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Spinner
android:id="@+id/spinner1"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
Использование Enums сохраняет чистоту и предоставляет объектно-ориентированный интерфейс, не сохраняя данные. И по внешнему виду вы используете постоянные значения для каждого из ваших "ароматов" (например, Strawberry = 10
).
Итак, начните с создания "Пакета" или каталога с именем enums
. Мы сохраним все ваши enums
там.
Затем создайте новый файл, который называется Flavour
:
<сильные > перечислений /Flavour.java
public enum Flavour {
STRAWBERRY("Strawberry", 10),
CHOCOLATE("Chocolate", 20),
VANILLA("Vanilla", 30);
private String displayString;
private int value;
private Flavour ( String displayString, int value) {
this.displayString = displayString;
this.value = value;
}
@Override
public String toString() {
return displayString;
}
public String displayString() { return displayString; }
public String value() { return value; }
public static Flavour fromDisplayString( String displayString) {
if ( displayString != null ) {
for ( Flavour flavour : Flavour.values() ) {
if ( displayString.equalsIgnoreCase( flavour.displayString ) ) {
return flavour;
}
}
}
throw new IllegalArgumentException("No Flavour with display string " + displayString + " found");
}
public static Flavour fromValue( int value) {
if (value != null) {
for (Flavour flavour : Flavour.values()) {
if (value.equals(flavour.value)) {
return flavour;
}
}
}
throw new IllegalArgumentException("No Flavour with value " + value + " found");
}
}
Я оставлю остальную часть материала адаптера, чтобы сделать это, но ключевые части:
Используйте Flavour.values()
, чтобы получить массив Flavors для вашего адаптера Spinner.
toString()
будет автоматически вызываться, когда Spinner будет заполняться, так что ваша отображаемая строка (или то, что вы вернете в этом методе) будет отображаться.
При сохранении значения вы можете использовать это:
( (Flavour) spinner.getSelectedItem() ).value();
Вы можете создать экземпляр массива ArrayAdapter с типом объекта данных. Затем Spinner будет удерживать ваш полный объект данных вместо String. Отображаемые значения будут определяться методом toString() ваших объектов данных.
Пример:
List<Project> allProjects = ...;
ArrayAdapter<Project> spinnerAdapter = new ArrayAdapter<Project>(this, android.R.layout.simple_spinner_item,allProjects.toArray(new Project[allProjects.size()]));
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(spinnerAdapter);
spinner.setOnItemSelectedListener(this);
...
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Log.i(AppConst.TAG, "ItemSelected:" + position + " id: " + id);
Project selectedProject = (Project)getSpinner().getSelectedItem();
currentTask = selectedProject.toString();
Log.i(AppConst.TAG, "Selected Project:" + selectedProject.getId());
...
}