Android: Döndürücü özel nesne listesine nasıl bağlanır?


126

Kullanıcı arayüzünde bazı isimler içeren (isimler görülebilir) ve her ismin kendi ID'sine sahip (ID'ler gösterim sırasına eşit değildir) bir değer değiştirici bulunmalıdır. Kullanıcı listeden adı seçtiğinde, currentID değişkeninin değiştirilmesi gerekir.

Uygulama ArrayList içerir

Kullanıcı kimliği ve adı olan bir nesne olduğunda:

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

Bilmediğim şey, kullanıcı adlarının listesini görüntüleyen ve değişen öğeleri kimliklere bağlayan bir değer değiştiricinin nasıl oluşturulacağıdır, böylece değer değiştirici öğe seçildiğinde / değiştirildiğinde, currentID değişkeni uygun değere ayarlanır.

Herhangi biri açıklanan sorunun çözümünü gösterebilir veya sorunu çözmek için yararlı herhangi bir bağlantı sağlayabilirse çok memnun olurum.

Teşekkürler!


Yanıtlar:


42

Sen olabilir bu cevaba bak . Ayrıca özel bir adaptörle de gidebilirsiniz, ancak aşağıdaki çözüm basit durumlar için uygundur.

İşte bir yeniden gönderi:

Yani buraya Spinner'da hem etiketlere hem de değerlere sahip olmak istediğiniz için geldiyseniz - işte bunu nasıl yaptım:

  1. Sadece Spinnerher zamanki yolunu yarat
  2. array.xmlDosyanızda 2 eşit boyutlu dizi tanımlayın - etiketler için bir dizi, değerler için bir dizi
  3. Kümenizle Spinnerileandroid:entries="@array/labels"
  4. Bir değere ihtiyacınız olduğunda, bunun gibi bir şey yapın (hayır, onu zincirlemek zorunda değilsiniz):

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

2
Tanımlanmış etiketlere erişmenin zarif bir yolu var mı (selectedVal ile karşılaştırma için), böylece dize etiketlerini kodda sabit kodlamaktan kaçınılabilir mi?
Anti Earth

Bu, verilerin tekrarlanması durumudur ve bundan kaçınılmalıdır.
Binoy Babu

18
Ölçeklenebilirlik açısından çok yanlış - "nesnelerinizin" asla dinamik olamayacağı anlamına geliyor - kötü uygulama
Srneczek

1
@Bostone Saate bakmadım ama bu durumda alakasız olduğunu düşünüyorum. Adaptörler bir sebepten dolayı oradalar ve bahse girerim bu zaman içindeki SDK değişikliği ile ilgili değildir. İlk etapta adaptör oluşturmalarının nedenlerinden biri budur. Böylece karmaşık nesnelerin bir listesini sunabilirsiniz, bu yüzden bence bu sadece çok basit durumlarda kullanılabilen kötü bir uygulama olmuştur, ancak bu onu iyi bir uygulama yapmaz.
Srneczek

3
@ Bob'sBurgers, noktayı kaçırıyorsunuz. Asla çalışmıyor demedim, kötü bir uygulama olduğunu söyledim ve bu konuda haklıyım. 1 çok, çok uzun dosyadaki global değişkenler veya kod da çalışıyor biliyorsunuz ... Btw eski konular hakkında yorum yapmalısınız çünkü bunlar hala bugünün aramalarında görünüyor ve ppl bu (bugünün) yanlış cevaplarını kullanacak.
Srneczek

344

İş parçacığının eski olduğunu biliyorum, ama her ihtimale karşı ...

Kullanıcı nesnesi:

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

Özel Döndürücü Adaptörü (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;
    }
}

Ve uygulama:

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
Kabul edilen cevap bu olmalıdır. Özel bir adaptör oluşturmak kesinlikle gidilecek yoldur.
jamesc

11
Bu iyi çalıştı. Çok hoş. Ama bir sorun. İplikçi şimdi tarzını değiştirdi. Dolguları, metin boyutunu değiştirmek için yeni bir xml ayarlamaya çalışıyorum ama hiçbir şey olmuyor. Döndürücüyü xml'den değiştirdim ve hala hiçbir şey yapmadım. Değişen tek şey, TextView'in metin boyutunu SpinAdapter içinden değiştirmemdir. Varsayılan döndürücü stilini / temasını koruyan ancak bu tür değerleri yükleyen bir wa var mı?
lantonis

Bunu yaptım ama çok fazla gecikme yaşıyorum. Ben sadece 3 kez eklerken. Yerleşimimi yapmak için bir görünümü şişirdim, sadece bir Simge ve metin içeriyor. Logcat, Skipped 317 frames! The application may be doing too much work on its main thread.Herhangi bir fikriniz var mı?
CularBytes

3
Bu satır için +1 :) Kullanıcı user = adapter.getItem (pozisyon);
Ahmad Alkhatib

2
Görünümü yeniden kullanmak için yapılan bir değişiklik, yeni bir TextView oluşturmak yerine şöyle yapmalıdır: TextView label = (TextView) super.getView (position, convertView, parent)
jackcar

93

En Basit Çözüm

SO'da farklı çözümleri inceledikten sonra, aşağıdakileri bir Spinnerözel ile doldurmak için en basit ve en temiz çözüm olarak buldum Objects. İşte tam uygulama:

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 / düzeni / 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 / düzeni / 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>

Faaliyetinizde

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

Bir küçük uyarı bu set olmamasıdır currentIDen kısa sürede Spinner değer değişiklikleri. Çoğu zaman Spinner'ın değerine , Spinner değiştikten hemen sonra değil, Submit veya Save gibi bir düğmeye bastıktan sonra ihtiyaç duyarsınız ve önlenebilirse, bu çok daha basit bir çözüm sağlar.
Joshua Pinter

Bunun işe yaradığını buldum ve son satırı başka bir yere koyarak, @JoshPinter'ın anlattığı "sorunun" üstesinden gelebilirsiniz.
x13

@ x13 Bu doğru. Değişimde değeri elde etmek için yapmanız gereken tek şey, bir "değişiklik üzerine" dinleyici kurmak ve ardından getSelectedItem()çağrıyı buna koymaktır . Bahşiş için teşekkürler.
Joshua Pinter

4
3 yıl geçti ve harika çalışıyor! İnsanların bu basit şeyi fazla karmaşık hale getirdiğine inanamıyorum.
Juan De la Cruz

1
@JuanDelaCruz Android ve java, işleri aşırı karmaşık hale getirmeyi kolaylaştırır. Kazanmak için basitleştirme!
Joshua Pinter

53

Basit çözümler için, nesnenizdeki "toString" in üzerine yazabilirsiniz

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

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

ve sonra kullanabilirsiniz:

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

Bu şekilde çarkınız yalnızca kullanıcı adlarını gösterecektir.


Yanıta geri dönen seçili öğeye DÜZENLE'deki döndürücü nasıl ayarlanır?
Arnold Brown

9

Bulduğum en basit yol:

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

Artık döndürücünüze herhangi bir nesneyi yapıştırabilirsiniz ve belirtilen etiketi gösterecektir.


8

Joaquin Alberto'nun cevabında yapılacak küçük bir değişiklik stil sorununu çözebilir. GetDropDownView işlevini aşağıdaki gibi özel adaptörde değiştirmeniz yeterlidir.

@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
bu cevap aslında soruyu cevaplamıyor, ancak bu cevapla ilgili bazı önemli noktalara işaret ediyor
Sruit A.Suk

6

Benim için iyi çalışıyor, getResource () şeyinin etrafında gerekli olan kod aşağıdaki gibidir:

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
        }

    });

Sadece (kendi başınıza) iki dizideki değerlerin doğru şekilde hizalandığından emin olmalısınız!


5

Joaquin Alberto'dan esinlenerek, bu benim için çalıştı:

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

Joaquin Alberto (teşekkürler) örneğine dayalıdır, ancak her tür için çalışır (türdeki toString () öğesini uygulamalısınız, böylece çıktıyı biçimlendirebilirsiniz.

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

Ayrıca List'i Array ile değiştirebileceğinizi düşünüyorum, böylece List'de toArray yapmanız gerekmez, ancak bir Listem vardı ..... :)


3

İşin püf noktasını anlamak için, genel olarak Adaptörlerin ve özel olarak ArrayAdapter'ın nasıl çalıştığını bilmek gerekir.

Bağdaştırıcılar: veri yapılarını widget'lara bağlayabilen nesnelerdir, daha sonra bu widget'lar bu verileri bir Listede veya bir Spinner'da görüntüler.

Dolayısıyla bir Adaptörün yanıtladığı iki soru şunlardır:

  1. Belirli bir dizin için hangi pencere öğesi veya bileşik görünümün bir veri yapısıyla (sınıfınızın nesnesi) ilişkilendirilmesi gerekir?
  2. Veri yapısından (sınıfınızın nesnesi) veri nasıl EditTextçıkarılır ve bu verilere göre pencere öğesi veya bileşik görünüm alanı (alanları) nasıl ayarlanır ?

ArrayAdapter yanıtları:

  • Herhangi bir dizin için her pencere öğesi (yani row.xmlOR android.R.layout.simple_spinner_item) aynıdır ve kimliği ArrayAdapter yapıcısına verilen kaynaktan şişirilir.
  • Her parçacığın bir TextView (veya nesli) örneği olması beklenir. Widget'ın .setText()yöntemi, destekleyici veri yapısındaki öğenin dize biçimi ile kullanılacaktır. Dize biçimi .toString(), öğe üzerinde çalıştırılarak elde edilecektir .

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>

Düzgün çalışıyor, umarım faydalıdır.


2

Benim özel nesnem

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

        }
    }
}

Ayrıca bu nesneyi ArrayAdapter genişletmeden döndürücüm için adaptör kaynağım olarak ayarlamak istedim, böylece yaptığım şey oldu.

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

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

Şimdi Sen bükücüsünde sonuçları görmek mümkün olacak, hile geçersiz kılmak olduğunu toString() sende özel nesne böylece hiç sadece bu yöntemde o dönmek bükücüsünde görüntülemek istediğiniz ilgili düşüncelerimize.


0

Ben en iyi çözüm olduğunu düşünüyorum "En basit Çözümü" ile Josh Pinter .

Bu benim için çalıştı:

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

Ayrılmış bir sınıfa ihtiyacınız yoksa, nesnenize eşlenen basit bir adaptörden bahsediyorum. Kodum sağlanan ArrayAdapter işlevlerine dayalı.

Adaptör oluşturduktan sonra öğe eklemeniz gerekebileceğinden (örneğin, veritabanı öğesi eşzamansız yükleme).

Basit ama etkili.

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

Ve sonra bu kodu kullanabilirsiniz (veriler ayrı olarak yüklendiğinden Kategori [] 'yi adaptör yapıcısına koyamadım).

Adapter.addAll (items) öğesinin dahili notifyDataSetChanged () öğesini çağırarak döndürücüyü yenilediğini unutmayın.

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

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

-1

Yapmak:

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
Hala burada bir sınıfı genişletiyorsunuz. Bunu sadece anonim bir nesneyle yapıyorsun.
FutureShocked
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.