Android: come associare lo spinner all'elenco di oggetti personalizzati?


126

Nell'interfaccia utente deve esserci uno spinner che contiene alcuni nomi (i nomi sono visibili) e ogni nome ha il proprio ID (gli ID non sono uguali alla sequenza di visualizzazione). Quando l'utente seleziona il nome dall'elenco, è necessario modificare la variabile currentID.

L'applicazione contiene ArrayList

Dove l'utente è un oggetto con ID e nome:

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

Quello che non so è come creare uno spinner che visualizzi l'elenco dei nomi dell'utente e associ gli elementi dello spinner agli ID, quindi quando l'elemento spinner è selezionato / modificato, la variabile currentID è impostata sul valore appropriato.

Gradirei se qualcuno potesse mostrare la soluzione del problema descritto o fornire qualsiasi link utile per risolvere il problema.

Grazie!


Utilizzare il metodo setVisibility e impostarlo su INVISIBLE developer.android.com/reference/android/view/…
andoni90

Risposte:


42

Puoi vedere questa risposta . Puoi anche scegliere un adattatore personalizzato, ma la soluzione seguente è adatta per casi semplici.

Ecco un nuovo post:

Quindi, se sei venuto qui perché vuoi avere sia etichette che valori nello Spinner - ecco come l'ho fatto:

  1. Crea il tuo Spinnersolito modo
  2. Definisci 2 array di uguali dimensioni nel tuo array.xmlfile: un array per le etichette, un array per i valori
  3. Imposta il tuo Spinnerconandroid:entries="@array/labels"
  4. Quando hai bisogno di un valore, fai qualcosa del genere (no, non devi incatenarlo):

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

2
Esiste un modo elegante per accedere alle etichette definite (per il confronto con SelectedVal), quindi si può evitare di codificare le etichette delle stringhe nel codice?
Anti Earth,

Questo è un caso di duplicazione dei dati e dovrebbe essere evitato.
Binoy Babu,

18
Così sbagliato dal punto di vista della scalabilità - significa che i tuoi "oggetti" non possono mai essere dinamici - cattiva pratica
Srneczek,

1
@Bostone Non ho controllato l'ora ma penso che sia irrilevante in questo caso. Gli adattatori sono lì per qualche motivo e scommetto che non si tratta di un cambio di SDK nel tempo. È uno dei motivi per cui hanno creato gli adattatori al primo posto. Quindi puoi servire un elenco di oggetti complessi, quindi secondo me è sempre stata una cattiva pratica utilizzabile solo nei casi molto semplici, ma ciò non lo rende una buona pratica.
Srneczek,

3
@ Bob'sBurgers ti manca il punto. Non ho mai detto che non funziona, ho detto che è una cattiva pratica e ho ragione. le variabili globali o il codice in 1 file molto, molto lungo funzionano anche tu lo sai ... A proposito, dovresti commentare i vecchi thread perché appaiono ancora nelle ricerche di oggi e ppl userà quelle risposte (di oggi) sbagliate.
Srneczek,

344

So che il thread è vecchio, ma per ogni evenienza ...

Oggetto utente:

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;
    }
}

Adattatore Spinner personalizzato (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;
    }
}

E l'implementazione:

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
Questa dovrebbe essere la risposta accettata. La creazione di un adattatore personalizzato è sicuramente la strada da percorrere.
Jamesc,

11
Questo ha funzionato bene. Molto bella. Ma un problema. Lo spinner ora ha cambiato stile. Provo a impostare un nuovo XML per modificare le imbottiture, le dimensioni del testo ma non succede nulla. Cambio lo spinner da solo dall'xml e non faccio niente. L'unica cosa che cambia è se cambio la dimensione del testo di TextView dall'interno di SpinAdapter. Esiste un wa per mantenere lo stile / tema di spinner predefinito ma caricare questo tipo di valori?
lantonis,

L'ho fatto, ma sto ottenendo un enorme ritardo. Mentre aggiungo solo 3 volte. Ho gonfiato una vista per creare il mio layout, contiene solo un'icona e un testo. Il logcat mi conferma dicendo Skipped 317 frames! The application may be doing too much work on its main thread.Qualche idea?
CularBytes,

3
+1 per questa riga :) Utente utente = adapter.getItem (posizione);
Ahmad Alkhatib,

2
Solo una modifica per riutilizzare la vista, invece di creare un nuovo TextView, dovrebbe fare così: TextView label = (TextView) super.getView (position, convertView, parent)
jackcar,

93

La soluzione più semplice

Dopo aver analizzato diverse soluzioni su SO, ho trovato quanto segue per essere la soluzione più semplice e pulita per popolare un Spinnercon personalizzato Objects. Ecco l'implementazione completa:

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>

Nella tua attività

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) {
    }
});

Un piccolo avvertimento è che questo non imposta non currentIDappena il valore di Spinner cambia. Il più delle volte è necessario solo il valore dello Spinner dopo aver successivamente premuto un pulsante, ad esempio Invia o Salva , non immediatamente dopo la modifica dello Spinner e, se possibile, ciò fornisce una soluzione molto più semplice.
Joshua Pinter,

Ho scoperto che funziona, e semplicemente inserendo l'ultima riga da qualche altra parte, puoi aggirare il "problema" descritto da @JoshPinter.
x13,

@ x13 È corretto. Tutto quello che devi fare per ottenere il valore in caso di modifica è impostare un listener "in modifica" e quindi inserire la getSelectedItem()chiamata. Grazie per il consiglio.
Joshua Pinter,

4
Sono passati 3 anni e funziona alla grande! Non riesco a credere che le persone complicino troppo questa cosa semplice.
Juan De la Cruz,

1
@JuanDelaCruz Android e Java rendono semplice complicare le cose. Semplificazione per la vittoria!
Joshua Pinter,

53

Per soluzioni semplici puoi semplicemente sovrascrivere "toString" nel tuo oggetto

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

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

e quindi puoi usare:

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

In questo modo il tuo spinner mostrerà solo i nomi utente.


Come impostare lo spinner su EDIT sull'elemento selezionato che ritorna in risposta?
Arnold Brown,

9

Di gran lunga il modo più semplice che ho trovato:

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

Ora puoi attaccare qualsiasi oggetto nel tuo filatore e verrà visualizzata l'etichetta specificata.


8

Solo una piccola modifica alla risposta di Joaquin Alberto può risolvere il problema di stile. Basta sostituire la funzione getDropDownView nell'adattatore personalizzato come di seguito,

@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
questa risposta in realtà non risponde alla domanda, ma indica alcune cose importanti relative a questa risposta
Sruit A.Suk

6

Funziona bene per me, il codice necessario per la cosa getResource () è il seguente:

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
        }

    });

Devi solo assicurarti (da solo) che i valori nei due array siano allineati correttamente!


5

ispirato a Joaquin Alberto, questo ha funzionato per me:

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

Basato sull'esempio di Joaquin Alberto (grazie), ma funziona per qualsiasi tipo (è necessario implementare toString () nel tipo, in modo da poter formattare l'output.

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;
}
}

Inoltre penso che tu possa sostituire List by Array, quindi non è necessario eseguire l'array in List, ma avevo un Elenco ..... :)


3

Per capire il trucco, bisogna sapere come funzionano gli adattatori in generale e ArrayAdapter in particolare.

Adattatori: sono oggetti che sono in grado di associare strutture di dati a widget, quindi questi widget visualizzano tali dati in un elenco o in uno Spinner.

Quindi le due domande a cui un Adapter risponde sono:

  1. Quale widget o vista composita deve essere associata a una struttura di dati (oggetto della tua classe) per un determinato indice?
  2. Come estrarre i dati dalla struttura dei dati (oggetto della classe) e come impostare i campi, cioè EditTextil widget o la vista composita secondo questi dati?

Le risposte di ArrayAdapter sono:

  • Ogni widget (ovvero row.xmlOR android.R.layout.simple_spinner_item) per qualsiasi indice è lo stesso ed è gonfiato dalla risorsa il cui ID è stato dato al costruttore di ArrayAdapter.
  • Ogni widget dovrebbe essere un'istanza di TextView (o discendente). Il .setText()metodo del widget verrà utilizzato con il formato stringa dell'articolo nella struttura dati di supporto. Il formato della stringa verrà ottenuto invocando .toString()l'elemento.

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>

Funziona correttamente, spero sia utile.


2

Il mio oggetto personalizzato è

/**
 * 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;

        }
    }
}

Volevo anche impostare questo oggetto come sorgente dell'adattatore sul mio filatore senza estendere ArrayAdapter in modo che ciò che facevo fosse.

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

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

Ora sarai in grado di vedere i risultati nel tuo spinner, il trucco era quello di sovrascrivere il toString() tuo oggetto personalizzato , quindi qualsiasi valore tu voglia visualizzare in spinner lo restituisce semplicemente con questo metodo.


0

Penso che la migliore soluzione sia la "Soluzione più semplice" di Josh Pinter .

Questo ha funzionato per me:

//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

Se non hai bisogno di una classe separata, intendo solo un semplice adattatore mappato sul tuo oggetto. Ecco il mio codice basato sulle funzioni di ArrayAdapter fornite.

E poiché potrebbe essere necessario aggiungere un elemento dopo la creazione dell'adattatore (ad es. Caricamento asincrono dell'elemento del database).

Semplice ma efficiente.

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;
        }
    };

E quindi puoi usare questo codice (non ho potuto inserire Categoria [] nel costruttore dell'adattatore perché i dati vengono caricati separatamente).

Si noti che adapter.addAll (items) aggiorna lo spinner chiamando notifyDataSetChanged () in interno.

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

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

-1

Fare:

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
Stai ancora estendendo un corso qui. Lo stai solo facendo con un oggetto anonimo.
FutureShocked
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.