Android: как привязать счетчик к списку настраиваемых объектов?


126

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

Приложение содержит список ArrayList

Где Пользователь - объект с идентификатором и именем:

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

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

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

Спасибо!


Используйте метод setVisibility и установите для него INVISIBLE developer.android.com/reference/android/view/…
andoni90

Ответы:


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
Есть ли элегантный способ доступа к определенным меткам (для сравнения с selectedVal), чтобы можно было избежать жесткого кодирования строковых меток в коде?
Anti Earth

Это случай дублирования данных, и его следует избегать.
Биной ​​Бабу

18
Это так неправильно с точки зрения масштабируемости - это означает, что ваши «объекты» никогда не могут быть динамическими - плохая практика
Srneczek

1
@Bostone Я не проверял время, но думаю, в данном случае это неактуально. Адаптеры есть по какой-то причине, и я уверен, что дело не в изменении SDK во времени. Это одна из причин, по которой они изначально создали адаптеры. Таким образом, вы можете обслуживать список сложных объектов, поэтому, на мой взгляд, это всегда было плохой практикой, которую можно использовать только в очень простых случаях, но это не делает ее хорошей практикой.
Срнечек

3
@ Bob'sBurgers, вы упускаете суть. Я никогда не говорил, что это не работает, я сказал, что это плохая практика, и я прав в этом. глобальные переменные или код в одном очень, очень длинном файле тоже работают, вы знаете ... Кстати, вы должны комментировать старые темы, потому что они все еще появляются в сегодняшних поисках, и 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 и ничего не делаю. Единственное, что изменится, - это если я изменю размер текста TextView из SpinAdapter. Есть ли способ сохранить стиль / тему счетчика по умолчанию, но загрузить такие значения?
lantonis

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

3
+1 для этой строки :) User user = adapter.getItem (position);
Ахмад Алхатиб

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

93

Самое простое решение

Изучив различные решения SO, я обнаружил, что следующее является самым простым и чистым решением для заполнения файла Spinnercustom 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.
    }
}    

разреш / макет / 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" />

разреш / макет / 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 изменяется. В большинстве случаев значение счетчика нужно только после последующего нажатия кнопки, например « Отправить» или « Сохранить» , а не сразу после изменения счетчика, и если этого можно избежать, это обеспечивает гораздо более простое решение.
Джошуа Пинтер

Я обнаружил, что это работает, и, просто поместив последнюю строку в другое место, вы можете обойти описанную «проблему» @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;
}
}

Также я думаю, что вы можете заменить List на Array, поэтому вам не нужно делать toArray в List, но у меня был List ..... :)


3

Чтобы понять трюк, нужно знать, как работают адаптеры в целом и ArrayAdapter в частности.

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

Итак, два вопроса, на которые отвечает адаптер:

  1. Какой виджет или составное представление необходимо связать со структурой данных (объектом вашего класса) для определенного индекса?
  2. Как извлечь данные из структуры данных (объект вашего класса) и как установить поля, то есть EditTextвиджета или составного представления, в соответствии с этими данными?

Ответы ArrayAdapter:

  • Каждый виджет (то есть row.xmlOR 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;
        }
    };

А затем вы можете использовать этот код (я не мог поместить Category [] в конструктор адаптера, потому что данные загружаются отдельно).

Обратите внимание, что адаптер adapter.addAll (items) обновляет счетчик, вызывая 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.