Android: Як прив’язати спінер до спеціального списку об’єктів?


126

В інтерфейсі користувача повинен бути спінер, який містить деякі імена (імена видно) і кожне ім’я має свій ідентифікатор (ідентифікатори не рівні послідовності відображення). Коли користувач вибирає ім'я зі списку, змінну currentID слід змінити.

Додаток містить ArrayList

Де користувач - об’єкт з ідентифікатором та іменем:

public class User{
        public int ID;
        public String name;
    }

Я не знаю, як створити спінер, який відображає список імен користувачів та прив'язує елементи спінера до ідентифікаторів, тож коли пункт спинера вибирається / змінюється, змінна currentID встановлюється на відповідне значення.

Буду вдячний, якщо хтось може показати рішення описаної проблеми або надати будь-яке посилання, корисне для вирішення проблеми.

Дякую!


Скористайтеся методом setVisibility і встановіть його на
НЕВИДИМАНІ

Відповіді:


42

Ви можете подивитися на цю відповідь . Ви також можете скористатися спеціальним адаптером, але рішення, наведене нижче, чудово підходить для простих випадків.

Ось повторна публікація:

Тож якщо ви приїхали сюди, тому що хочете мати як ярлики, так і значення у Spinner - ось як я це зробив:

  1. Просто створіть свій Spinnerзвичний спосіб
  2. Визначте у вашому array.xmlфайлі 2 масиви однакового розміру - один масив для міток, один масив для значень
  3. Встановіть свій Spinnerзandroid:entries="@array/labels"
  4. Коли вам потрібне значення, зробіть щось подібне (ні, вам не доведеться це ланцюжок):

      String selectedVal = getResources().getStringArray(R.array.values)[spinner.getSelectedItemPosition()];

2
Чи є елегантний спосіб отримати доступ до визначених міток (для порівняння з вибранимVal), щоб уникнути жорсткого кодування рядкових міток у коді?
Анти Земля

Це випадок дублювання даних і цього слід уникати.
Біной Бабу

18
Так неправильно з точки зору масштабованості - це означає, що ваші "об'єкти" ніколи не можуть бути динамічними - погана практика
Srneczek

1
@Bostone Я не перевіряв час, але вважаю, що це не має значення в цьому випадку. Перехідники є чомусь там, і я думаю, що це не про зміну SDK у часі. Це одна з причин, чому вони створили адаптери на першому місці. Таким чином, ви можете подавати список складних об'єктів, тому, на мою думку, це завжди було поганою практикою, придатним для використання у дуже простих випадках, але це не робить його гарною практикою.
Srneczek

3
@ Bob'sBurgers Ви пропустите точку. Я ніколи не казав, що це не працює. Я сказав, що це погана практика, і я маю рацію з цього приводу. Глобальні змінні чи код у 1 дуже-дуже довгому файлі теж працюють. Ви знаєте ... До речі, ви повинні коментувати старі теми, тому що вони все ще з’являються в пошуках сьогодні, а ppl використовуватиме ці (сьогоднішні) помилкові відповіді.
Srneczek

344

Я знаю, що нитка стара, але про всяк випадок ...

Об'єкт користувача:

public class User{

    private int _id;
    private String _name;

    public User(){
        this._id = 0;
        this._name = "";
    }

    public void setId(int id){
        this._id = id;
    }

    public int getId(){
        return this._id;
    }

    public void setName(String name){
        this._name = name;
    }

    public String getName(){
        return this._name;
    }
}

Спеціальний адаптер спінера (ArrayAdapter)

public class SpinAdapter extends ArrayAdapter<User>{

    // Your sent context
    private Context context;
    // Your custom values for the spinner (User)
    private User[] values;

    public SpinAdapter(Context context, int textViewResourceId,
            User[] values) {
        super(context, textViewResourceId, values);
        this.context = context;
        this.values = values;
    }

    @Override
    public int getCount(){
       return values.length;
    }

    @Override
    public User getItem(int position){
       return values[position];
    }

    @Override
    public long getItemId(int position){
       return position;
    }


    // And the "magic" goes here
    // This is for the "passive" state of the spinner
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // I created a dynamic TextView here, but you can reference your own  custom layout for each spinner item
        TextView label = (TextView) super.getView(position, convertView, parent);
        label.setTextColor(Color.BLACK);
        // Then you can get the current item using the values array (Users array) and the current position
        // You can NOW reference each method you has created in your bean object (User class)
        label.setText(values[position].getName());

        // And finally return your dynamic (or custom) view for each spinner item
        return label;
    }

    // And here is when the "chooser" is popped up
    // Normally is the same view, but you can customize it if you want
    @Override
    public View getDropDownView(int position, View convertView,
            ViewGroup parent) {
        TextView label = (TextView) super.getDropDownView(position, convertView, parent);
        label.setTextColor(Color.BLACK);
        label.setText(values[position].getName());

        return label;
    }
}

І реалізатор:

public class Main extends Activity {
    // You spinner view
    private Spinner mySpinner;
    // Custom Spinner adapter (ArrayAdapter<User>)
    // You can define as a private to use it in the all class
    // This is the object that is going to do the "magic"
    private SpinAdapter adapter;

        @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Create the Users array
        // You can get this retrieving from an external source
        User[] users = new User[2];

        users[0] = new User();
        users[0].setId(1);
        users[0].setName("Joaquin");

        users[1] = new User();
        users[1].setId(2);
        users[1].setName("Alberto");

        // Initialize the adapter sending the current context
        // Send the simple_spinner_item layout
        // And finally send the Users array (Your data)
        adapter = new SpinAdapter(Main.this,
            android.R.layout.simple_spinner_item,
            users);
        mySpinner = (Spinner) findViewById(R.id.miSpinner);
        mySpinner.setAdapter(adapter); // Set the custom adapter to the spinner
        // You can create an anonymous listener to handle the event when is selected an spinner item
        mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view,
                    int position, long id) {
                // Here you get the current item (a User object) that is selected by its position
                User user = adapter.getItem(position);
                // Here you can do the action you want to...
                Toast.makeText(Main.this, "ID: " + user.getId() + "\nName: " + user.getName(),
                    Toast.LENGTH_SHORT).show();
            }
            @Override
            public void onNothingSelected(AdapterView<?> adapter) {  }
        });
    }
}

43
Це має бути прийнятою відповіддю. Створення користувацького адаптера - це безумовно шлях.
jamesc

11
Це спрацювало чудово. Дуже хороша. Але одна проблема. Тепер спінер змінив свій стиль. Я намагаюся встановити новий xml, щоб змінити прокладки, розмір тексту, але нічого не відбувається. Я змінюю спінер на самому xml і stil нічого. Єдине, що змінюється - це якщо я зміню розмір тексту TextView зсередини SpinAdapter. Чи є wa, щоб зберегти стиль / тему спінера за замовчуванням, але завантажувати такі значення?
Лантоніс

Я це робив, але отримую величезну кількість відставання. Поки я просто додаю 3 рази. Я зробив перегляд, щоб зробити свій макет, він містить лише значок та текст. Logcat підтверджує мене, кажучи Skipped 317 frames! The application may be doing too much work on its main thread.Будь-які ідеї?
CularBytes

3
+1 для цього рядка :) User user = adapter.getItem (позиція);
Ахмад Алхатіб

2
Просто модифікація для повторного використання перегляду, замість створення нового TextView, воно повинно робити так: TextView label = (TextView) super.getView (позиція, convertView, батьківський)
jackcar

93

Найпростіше рішення

Переглянувши різні рішення на SO, я виявив наступне, що є найпростішим та найчистішим рішенням для заповнення Spinnerз користувачемObjects . Ось повна реалізація:

User.java

public class User{
    public int ID;
    public String name;

    @Override
    public String toString() {
        return this.name; // What to display in the Spinner list.
    }
}    

res / layout / spinner.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:textSize="14sp"
    android:textColor="#FFFFFF"
    android:spinnerMode="dialog" />

res / layout / your_activity_view.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/user" />

</LinearLayout>

У вашій діяльності

List<User> users = User.all(); // This example assumes you're getting all Users but adjust it for your Class and needs.
ArrayAdapter userAdapter = new ArrayAdapter(this, R.layout.spinner, users);

Spinner userSpinner = (Spinner) findViewById(R.id.user);
userSpinner.setAdapter(userAdapter);
userSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        // Get the value selected by the user
        // e.g. to store it as a field or immediately call a method
        User user = (User) parent.getSelectedItem();
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
    }
});

Одне невелике застереження полягає в тому, що це не встановлює значення, currentIDяк тільки змінюється значення Spinner . Більшу частину часу вам потрібно лише значення Spinner після подальшого натискання кнопки, наприклад, Надіслати або Зберегти , не відразу після зміни Spinner, і якщо цього можна уникнути, це забезпечує набагато простіше рішення.
Джошуа Пінтер

Я виявив, що це працює, і просто помістивши останній рядок десь в іншому місці, ви можете обійти описану "проблему" @JoshPinter.
x13

@ x13 Це правильно. Все, що вам потрібно зробити, щоб отримати значення змін, це налаштувати слухач "на зміну", а потім поставити getSelectedItem()дзвінок у це. Дякую за пораду.
Джошуа Пінтер

4
Минуло 3 роки і працює чудово! Не можу повірити, що люди надмірно ускладнюють цю просту річ.
Хуан Де ла Крус

1
@JuanDelaCruz Android та java полегшують занадто складні речі. Спрощення для виграшу!
Джошуа Пінтер

53

Для простих рішень ви можете просто переписати "toString" у вашому об'єкті

public class User{
    public int ID;
    public String name;

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

і тоді ви можете використовувати:

ArrayAdapter<User> dataAdapter = new ArrayAdapter<User>(mContext, android.R.layout.simple_spinner_item, listOfUsers);

Таким чином ваш спінер показуватиме лише імена користувачів.


Як встановити спінер на EDIT на вибраний елемент, який повертається у відповідь?
Арнольд Браун

9

На сьогодні найпростіший спосіб, який я знайшов:

@Override
public String toString() {
    return this.label;           
}

Тепер ви можете вклеїти будь-який предмет у ваш спінер, і він відобразить вказану мітку.


8

Лише невеликий твір на відповідь Хоакіна Альберто може вирішити проблему стилю. Просто замініть функцію getDropDownView у спеціальному адаптері, як показано нижче,

@Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        View v = super.getDropDownView(position, convertView, parent);
        TextView tv = ((TextView) v);
        tv.setText(values[position].getName());
        tv.setTextColor(Color.BLACK);
        return v;
    }

1
ця відповідь насправді не відповідає на питання, але вказує на деякі важливі речі, які стосуються цієї відповіді
Sruit A.Suk

6

Для мене добре працює, потрібний код навколо getResource ():

spinner = (Spinner) findViewById(R.id.spinner);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> spinner, View v,
                int arg2, long arg3) {
            String selectedVal = getResources().getStringArray(R.array.compass_rate_values)[spinner.getSelectedItemPosition()];
            //Do something with the value
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub
        }

    });

Просто потрібно переконатись (власноруч), що значення у двох масивах вирівняні належним чином!


5

натхненний Хоакін Альберто, це працювало для мене:

public class SpinAdapter extends ArrayAdapter<User>{


    public SpinAdapter(Context context, int textViewResourceId,
            User[] values) {
        super(context, textViewResourceId, values);
    }



    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        TextView label = (TextView) super.getView(position, convertView, parent);
        label.setTextColor(Color.BLACK);
        label.setText(this.getItem(position).getName());
        return label;
    }

    @Override
    public View getDropDownView(int position, View convertView,ViewGroup parent) {
        TextView label = (TextView) super.getView(position, convertView, parent);
        label.setTextColor(Color.BLACK);
        label.setText(this.getItem(position).getName());
        return label;
    }
}

5

На основі зразка Хоакін Альберто (спасибі), але він працює для будь-якого типу (ви повинні реалізувати toString () у тип, щоб ви могли форматувати вихід.

import java.util.List;

import android.content.Context;
import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class SpinAdapter<T> extends ArrayAdapter<T> {
private Context context;
private List<T> values;

public SpinAdapter(Context context, int textViewResourceId, List<T> values) {
    super(context, textViewResourceId, values);
    this.context = context;
    this.values = values;
}

public int getCount() {
    return values.size();
}

public T getItem(int position) {
    return values.get(position);
}

public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    TextView label = new TextView(context);
    label.setTextColor(Color.BLACK);
    label.setText(values.toArray(new Object[values.size()])[position]
            .toString());
    return label;
}

@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
    TextView label = new TextView(context);
    label.setTextColor(Color.BLACK);
    label.setText(values.toArray(new Object[values.size()])[position]
            .toString());

    return label;
}
}

Крім того, я думаю, що ви можете замінити Список на Array, тому вам не потрібно робити toArray у списку, але у мене був список ..... :)


3

Щоб зрозуміти хитрість, треба знати, як працюють адаптери взагалі та ArrayAdapter зокрема.

Адаптери: це об'єкти, які здатні прив'язувати структури даних до віджетів, тоді ці віджети відображають ці дані у Списку або в Спиннера.

Тож два питання, на які відповідає Адаптер:

  1. Який віджет або складений вигляд потрібно пов’язати зі структурою даних (об’єктом класу) для певного індексу?
  2. Як витягнути дані з структури даних (об’єкт класу) та як встановити поля (поля), тобто EditTextвіджет або складений вигляд відповідно до цих даних?

Відповіді ArrayAdapter:

  • Кожен віджет (тобто row.xml АБО android.R.layout.simple_spinner_item) для будь-якого індексу однаковий і завищений від ресурсу, ідентифікатор якого надано конструктору ArrayAdapter.
  • Очікується, що кожен віджет буде екземпляром TextView (або нащадком). Метод віджета .setText()буде використовуватися з рядковим форматом елемента в підтримуючій структурі даних. Формат рядка буде отримано шляхом виклику .toString()на елемент.

CustomListViewDemo.java

public class CustomListViewDemo extends ListActivity {
  private EfficientAdapter adap;

  private static String[] data = new String[] { "0", "1", "2", "3", "4" };

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);
    adap = new EfficientAdapter(this);
    setListAdapter(adap);
  }

  @Override
  protected void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);
    Toast.makeText(this, "Click-" + String.valueOf(position), Toast.LENGTH_SHORT).show();
  }

  public static class EfficientAdapter extends BaseAdapter implements Filterable {
    private LayoutInflater mInflater;
    private Bitmap mIcon1;
    private Context context;
    int firstpos=0;

    public EfficientAdapter(Context context) {
      // Cache the LayoutInflate to avoid asking for a new one each time.
      mInflater = LayoutInflater.from(context);
      this.context = context;
    }

    public View getView(final int position, View convertView, ViewGroup parent) {

      ViewHolder holder;

      if (convertView == null) {
        convertView = mInflater.inflate(R.layout.adaptor_content, null);

        holder = new ViewHolder();
        holder.sp = (Spinner) convertView.findViewById(R.id.spinner1);

        holder.ArrayAdapter_sp = new ArrayAdapter(parent.getContext(),android.R.layout.simple_spinner_item,data);
        holder.ArrayAdapter_sp.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        holder.sp.setAdapter( holder.ArrayAdapter_sp);
        holder.sp.setOnItemSelectedListener(new OnItemSelectedListener()
        {
            private int pos = position;
            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1,
                    int p, long arg3) 
            {
                // TODO Auto-generated method stub
                 Toast.makeText(context, "select spinner " + String.valueOf(pos)+" with value ID "+p, Toast.LENGTH_SHORT).show();    

            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0)
            {
                // TODO Auto-generated method stub

            }
        });




        convertView.setTag(holder);
      } else {

        holder = (ViewHolder) convertView.getTag();
      }


      return convertView;
    }

    static class ViewHolder 
    {

        Spinner sp;
        ArrayAdapter ArrayAdapter_sp;

    }

    @Override
    public Filter getFilter() {
      // TODO Auto-generated method stub
      return null;
    }

    @Override
    public long getItemId(int position) {
      // TODO Auto-generated method stub
      return 0;
    }

    @Override
    public int getCount() {
      // TODO Auto-generated method stub
      return data.length;
    }

    @Override
    public Object getItem(int position) {
      // TODO Auto-generated method stub
      return data[position];
    }

  }

}

adaptor_content.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/lineItem"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_vertical" >

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="314dp"
        android:layout_height="wrap_content" />

</LinearLayout>

main.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="fill_parent" android:layout_width="fill_parent"
    >

    <ListView
        android:id="@+id/android:list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginBottom="60dip"
        android:layout_marginTop="10dip"
        android:cacheColorHint="#00000000"
        android:drawSelectorOnTop="false" />

</RelativeLayout>

Працює правильно, я сподіваюся, що це корисно.


2

Мій спеціальний об’єкт

/**
 * Created by abhinav-rathore on 08-05-2015.
 */
public class CategoryTypeResponse {
    private String message;

    private int status;

    private Object[] object;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public Object[] getObject() {
        return object;
    }

    public void setObject(Object[] object) {
        this.object = object;
    }

    @Override
    public String toString() {
        return "ClassPojo [message = " + message + ", status = " + status + ", object = " + object + "]";
    }

    public static class Object {
        private String name;
        private String _id;
        private String title;
        private String desc;
        private String xhdpi;
        private String hdpi;
        private String mdpi;
        private String hint;
        private String type;
        private Brands[] brands;


        public String getId() {
            return _id;
        }

        public void setId(String id) {
            this._id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getXhdpi() {
            return xhdpi;
        }

        public void setXhdpi(String xhdpi) {
            this.xhdpi = xhdpi;
        }

        public String getHdpi() {
            return hdpi;
        }

        public void setHdpi(String hdpi) {
            this.hdpi = hdpi;
        }

        public String getMdpi() {
            return mdpi;
        }

        public void setMdpi(String mdpi) {
            this.mdpi = mdpi;
        }

        public String get_id() {
            return _id;
        }

        public void set_id(String _id) {
            this._id = _id;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getDesc() {
            return desc;
        }

        public void setDesc(String desc) {
            this.desc = desc;
        }

        public String getHint() {
            return hint;
        }

        public void setHint(String hint) {
            this.hint = hint;
        }

        public String getType() {
            return type;
        }

        public void setType(String type) {
            this.type = type;
        }

        public Brands[] getBrands() {
            return brands;
        }

        public void setBrands(Brands[] brands) {
            this.brands = brands;
        }

        @Override
        public String toString() {
            return "ClassPojo [name = " + name + "]";
        }
    }

    public static class Brands {

        private String _id;
        private String name;
        private String value;
        private String categoryid_ref;

        public String get_id() {
            return _id;
        }

        public void set_id(String _id) {
            this._id = _id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }

        public String getCategoryid_ref() {
            return categoryid_ref;
        }

        public void setCategoryid_ref(String categoryid_ref) {
            this.categoryid_ref = categoryid_ref;
        }

        @Override
        public String toString() {
            return  name;

        }
    }
}

Я також хотів встановити цей об'єкт як джерело мого адаптера для мого спінера, не розширюючи ArrayAdapter, щоб те, що я робив, було.

brandArray = mCategoryTypeResponse.getObject()[fragPosition].getBrands();

ArrayAdapter brandAdapter = new ArrayAdapter< CategoryTypeResponse.Brands>(getActivity(),
                R.layout.item_spinner, brandArray);

Тепер ви зможете побачити результати у своєму спінері, хитрість полягала в тому, щоб перекрити toString() у вашому користувальницькому об’єкті , тому те, що коли-небудь значення, яке ви хочете відобразити в спінері, просто поверне це в цьому методі.


0

Я думаю , що найкращим вирішенням цієї проблеми є «Найпростіше рішення» по Josh Пінтера .

Це працювало для мене:

//Code of the activity 
//get linearLayout
LinearLayout linearLayout = (LinearLayout ) view.findViewById(R.id.linearLayoutFragment);       

LinearLayout linearLayout = new LinearLayout(getActivity());
//display css
RelativeLayout.LayoutParams params2 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);

//create the spinner in a fragment activiy
Spinner spn = new Spinner(getActivity());

// create the adapter.
ArrayAdapter<ValorLista> spinner_adapter = new ArrayAdapter<ValorLista>(getActivity(), android.R.layout.simple_spinner_item, meta.getValorlistaList());
spinner_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
spn.setAdapter(spinner_adapter);

//set the default according to value
//spn.setSelection(spinnerPosition);

linearLayout.addView(spn, params2);
//Code of the class ValorLista

import java.io.Serializable;
import java.util.List;

public class ValorLista implements Serializable{


    /**
     * 
     */
    private static final long serialVersionUID = 4930195743192929192L;
    private int id; 
    private String valor;
    private List<Metadato> metadatoList;


    public ValorLista() {
        super();
        // TODO Auto-generated constructor stub
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getValor() {
        return valor;
    }
    public void setValor(String valor) {
        this.valor = valor;
    }
    public List<Metadato> getMetadatoList() {
        return metadatoList;
    }
    public void setMetadatoList(List<Metadato> metadatoList) {
        this.metadatoList = metadatoList;
    }

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

}

0

Якщо вам не потрібен окремий клас, я маю на увазі просто простий адаптер, відображений на вашому об’єкті. Ось мій код на основі наданих функцій ArrayAdapter.

І тому, що вам може знадобитися додати елемент після створення адаптера (наприклад, асинхронне завантаження елемента бази даних).

Простий, але ефективний.

editCategorySpinner = view.findViewById(R.id.discovery_edit_category_spinner);

// Drop down layout style - list view with radio button         
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

// attaching data adapter to spinner, as you can see i have no data at this moment
editCategorySpinner.setAdapter(dataAdapter);
final ArrayAdapter<Category> dataAdapter = new ArrayAdapter<Category>

(getActivity(), android.R.layout.simple_spinner_item, new ArrayList<Category>(0)) {


        // And the "magic" goes here
        // This is for the "passive" state of the spinner
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // I created a dynamic TextView here, but you can reference your own  custom layout for each spinner item
            TextView label = (TextView) super.getView(position, convertView, parent);
            label.setTextColor(Color.BLACK);
            // Then you can get the current item using the values array (Users array) and the current position
            // You can NOW reference each method you has created in your bean object (User class)
            Category item = getItem(position);
            label.setText(item.getName());

            // And finally return your dynamic (or custom) view for each spinner item
            return label;
        }

        // And here is when the "chooser" is popped up
        // Normally is the same view, but you can customize it if you want
        @Override
        public View getDropDownView(int position, View convertView,
                                    ViewGroup parent) {
            TextView label = (TextView) super.getDropDownView(position, convertView, parent);
            label.setTextColor(Color.BLACK);
            Category item = getItem(position);
            label.setText(item.getName());

            return label;
        }
    };

І тоді ви можете використовувати цей код (я не міг помістити Категорію [] в конструктор адаптера, оскільки дані завантажуються окремо).

Зауважте, що adapter.addAll (елементи) оновлює спінер, викликаючи notifyDataSetChanged () у внутрішній.

categoryRepository.getAll().observe(this, new Observer<List<Category>>() {

            @Override
            public void onChanged(@Nullable final List<Category> items) {
                dataAdapter.addAll(items);
            }
});

-1

Зробіть:

spinner.adapter = object: ArrayAdapter<Project>(
            container.context,
            android.R.layout.simple_spinner_dropdown_item,
            state.projects
        ) {
            override fun getDropDownView(
                position: Int,
                convertView: View?,
                parent: ViewGroup
            ): View {
                val label = super.getView(position, convertView, parent) as TextView
                label.text = getItem(position)?.title
                return label
            }

            override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
                val label = super.getView(position, convertView, parent) as TextView
                label.text = getItem(position)?.title
                return label
            }
        }

3
Ви все ще продовжуєте тут клас. Ви просто робите це з анонімним об’єктом.
FutureShocked
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.