Android: Bagaimana cara mengikat spinner ke daftar objek khusus?

126

Di antarmuka pengguna harus ada pemintal yang berisi beberapa nama (nama terlihat) dan setiap nama memiliki ID sendiri (ID tidak sama dengan urutan tampilan). Ketika pengguna memilih nama dari daftar, variabel currentID harus diubah.

Aplikasi ini berisi ArrayList

Di mana Pengguna adalah objek dengan ID dan nama:

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

Yang tidak saya ketahui adalah cara membuat pemintal yang menampilkan daftar nama pengguna dan mengikat item pemintal ke ID sehingga ketika item pemintal dipilih / diubah variabel currentID diatur ke nilai yang sesuai.

Saya akan sangat menghargai jika ada yang bisa menunjukkan solusi dari masalah yang dijelaskan atau memberikan tautan apa pun yang berguna untuk menyelesaikan masalah.

Terima kasih!

Niko Gamulin
sumber
Gunakan metode setVisibility dan atur ke INVISIBLE developer.android.com/reference/android/view/…
andoni90

Jawaban:

42

Anda dapat melihat jawaban ini . Anda juga dapat menggunakan adaptor khusus, tetapi solusi di bawah ini baik untuk kasus sederhana.

Berikut ini kiriman ulang:

Jadi jika Anda datang ke sini karena Anda ingin memiliki label dan nilai di Spinner - inilah cara saya melakukannya:

  1. Cukup buat Spinnerseperti biasa
  2. Tentukan 2 array ukuran yang sama dalam array.xmlfile Anda - satu array untuk label, satu array untuk nilai
  3. Atur Spinnerdengan Andaandroid:entries="@array/labels"
  4. Saat Anda membutuhkan nilai, lakukan sesuatu seperti ini (tidak, Anda tidak perlu mengaitkannya):

      String selectedVal = getResources().getStringArray(R.array.values)[spinner.getSelectedItemPosition()];
Bostone
sumber
2
Apakah ada cara yang elegan untuk mengakses label yang ditentukan (untuk perbandingan denganVal yang dipilih), sehingga orang dapat menghindari pengkodean keras label string dalam kode?
Anti Earth
Ini adalah kasus duplikasi data dan harus dihindari.
Binoy Babu
18
Jadi salah dari sudut pandang skalabilitas - itu berarti "objek" Anda tidak pernah bisa dinamis - praktik buruk
Srneczek
1
@Bostone Saya tidak memeriksa waktu tetapi saya pikir itu tidak relevan dalam kasus ini. Adaptor ada untuk beberapa alasan dan saya yakin ini bukan tentang perubahan SDK dalam waktu. Ini adalah salah satu alasan mengapa mereka menciptakan adaptor di tempat pertama. Jadi Anda dapat menyajikan daftar objek yang kompleks, jadi ini menurut saya selalu merupakan praktik buruk yang hanya dapat digunakan dalam kasus yang sangat sederhana tetapi itu tidak menjadikannya praktik yang baik.
Srneczek
3
@ Bob'sBurgers Anda kehilangan intinya. Saya tidak pernah mengatakan itu tidak berfungsi. Saya mengatakan itu adalah praktik yang buruk dan saya benar tentang itu. variabel global atau kode dalam 1 file yang sangat, sangat panjang juga berfungsi lho ... Btw Anda harus mengomentari utas lama karena masih muncul di pencarian hari ini dan ppl akan menggunakan jawaban yang salah (todays) yang salah.
Srneczek
344

Saya tahu utasnya sudah tua, tetapi untuk berjaga-jaga ...

Objek pengguna:

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

Adaptor Spinner Kustom (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;
    }
}

Dan implementasinya:

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) {  }
        });
    }
}
Joaquin Alberto
sumber
43
Ini harus menjadi jawaban yang diterima. Membuat adaptor khusus jelas merupakan cara yang harus dilakukan.
jamesc
11
Ini bekerja dengan baik. Sangat bagus. Tapi satu masalah. Spinner sekarang mengubah gayanya. Saya mencoba mengatur xml baru untuk mengubah paddings, ukuran teks tetapi tidak ada yang terjadi. Saya mengubah spinner itu sendiri dari xml dan tetap tidak ada. Satu-satunya hal yang berubah adalah jika saya mengubah ukuran teks dari TextView dari dalam SpinAdapter. Apakah ada cara untuk mempertahankan gaya / tema pemintal default tetapi memuat nilai semacam ini?
lantonis
Saya sudah melakukan ini, tetapi saya mendapatkan jumlah lag yang luar biasa. Sementara saya baru menambahkan 3 kali. Saya mengembang tampilan untuk membuat tata letak saya, hanya berisi Ikon dan teks. Logcat mengkonfirmasi saya dengan mengatakan Skipped 317 frames! The application may be doing too much work on its main thread.Ada ide?
CularBytes
3
+1 untuk baris ini :) Pengguna pengguna = adapter.getItem (posisi);
Ahmad Alkhatib
2
Hanya modifikasi untuk menggunakan kembali tampilan, alih-alih membuat TextView baru, itu harus dilakukan seperti ini: TextView label = (TextView) super.getView (position, convertView, parent)
jackcar
93

Solusi paling sederhana

Setelah menjelajahi berbagai solusi pada SO, saya menemukan yang berikut ini sebagai solusi paling sederhana dan terbersih untuk mengisi Spinnerdengan kebiasaan Objects. Inilah implementasi lengkapnya:

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>

Dalam Aktivitas Anda

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) {
    }
});
Joshua Pinter
sumber
Satu peringatan kecil adalah bahwa ini tidak mengatur currentIDsegera setelah nilai Spinner berubah. Sebagian besar waktu Anda hanya memerlukan nilai Spinner setelah menekan tombol, seperti Kirim atau Simpan , tidak segera setelah Spinner berubah dan jika dapat dihindari, ini memberikan solusi yang lebih sederhana.
Joshua Pinter
Saya menemukan ini berfungsi, dan hanya dengan meletakkan baris terakhir di tempat lain, Anda dapat menyiasati "masalah" yang dijelaskan oleh @JoshPinter.
x13
@ x13 Benar. Yang perlu Anda lakukan untuk mendapatkan nilai pada perubahan adalah mengatur pendengar "saat perubahan" dan kemudian melakukan getSelectedItem()panggilan itu. Terima kasih atas tipnya.
Joshua Pinter
4
3 tahun telah berlalu dan bekerja luar biasa! Tidak dapat percaya bahwa orang terlalu rumit hal sederhana ini.
Juan De la Cruz
1
@JuanDelaCruz Android dan java memudahkan rumitnya hal-hal. Penyederhanaan untuk menang!
Joshua Pinter
53

Untuk solusi sederhana, Anda bisa menimpa "toString" di objek Anda

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

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

dan kemudian Anda dapat menggunakan:

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

Dengan cara ini pemintal Anda hanya akan menampilkan nama pengguna.

SpyZip
sumber
Bagaimana cara mengatur pemintal pada EDIT ke item yang dipilih yang mengembalikan respons?
Arnold Brown
9

Sejauh ini cara paling sederhana yang saya temukan:

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

Sekarang Anda dapat menempelkan objek apa pun di pemintal Anda, dan itu akan menampilkan label yang ditentukan.

NielW
sumber
8

Hanya sedikit perubahan pada jawaban Joaquin Alberto yang dapat menyelesaikan masalah gaya. Cukup ganti fungsi getDropDownView di adaptor khusus seperti di bawah ini,

@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;
    }
Tirtharup Bhattacharyya
sumber
1
jawaban ini sebenarnya tidak menjawab pertanyaan, tetapi menunjuk beberapa hal penting yang berhubungan dengan jawaban ini
Sruit A.Suk
6

Bekerja dengan baik untuk saya, kode yang diperlukan di sekitar getResource () adalah sebagai berikut:

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
        }

    });

Hanya perlu memastikan (sendiri) nilai-nilai dalam dua array disejajarkan dengan benar!

Sonja
sumber
5

terinspirasi oleh Joaquin Alberto, ini bekerja untuk saya:

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;
    }
}
Annamaria
sumber
5

Berdasarkan sampel Joaquin Alberto (terima kasih), tetapi itu bekerja untuk semua jenis (Anda harus menerapkan toString () dalam jenis, sehingga Anda dapat memformat 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;
}
}

Juga saya pikir Anda dapat mengganti Daftar dengan Array sehingga Anda tidak perlu melakukan toArray di Daftar, tetapi saya punya Daftar ..... :)

Alberto Ricart
sumber
3

Untuk memahami triknya, kita harus tahu, bagaimana Adapters bekerja secara umum dan ArrayAdapter secara khusus.

Adapters: adalah objek yang dapat mengikat struktur data ke widget, maka widget ini menampilkan data itu dalam Daftar atau dalam Spinner.

Jadi dua pertanyaan yang dijawab Adaptor adalah:

  1. Widget atau tampilan komposit mana yang perlu dikaitkan dengan struktur data (objek kelas Anda) untuk indeks tertentu?
  2. Bagaimana cara mengekstrak data dari struktur data (objek kelas Anda) dan cara mengatur bidang, yaitu EditTexttampilan widget atau komposit menurut data ini?

Jawaban ArrayAdapter adalah:

  • Setiap widget (yaitu row.xmlATAU android.R.layout.simple_spinner_item) untuk indeks apa pun adalah sama, dan meningkat dari sumber daya yang IDnya diberikan kepada konstruktor ArrayAdapter.
  • Setiap widget diharapkan menjadi instance dari TextView (atau turunan). Metode widget .setText()akan digunakan dengan format string dari item dalam struktur data pendukung. Format string akan diperoleh dengan memohon .toString()pada item.

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

  }

}

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

Ini berfungsi dengan baik, semoga bermanfaat.

Parag Ghetiya
sumber
2

Obyek kustom saya adalah

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

        }
    }
}

Saya juga ingin mengatur objek ini sebagai sumber adaptor saya ke pemintal saya tanpa memperluas ArrayAdapter sehingga apa yang saya lakukan adalah.

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

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

Sekarang Anda akan dapat melihat hasil di pemintal Anda, triknya adalah untuk menimpa objek kustomtoString() Anda , jadi nilai apa pun yang ingin Anda tampilkan di pemintal cukup kembalikan dalam metode ini.

DeltaCap019
sumber
0

Saya pikir solusi terbaik adalah "Solusi Sederhana" oleh Josh Pinter .

Ini bekerja untuk saya:

//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();
    }

}
lopradi
sumber
0

Jika Anda tidak memerlukan kelas yang terpisah, maksud saya hanya adaptor sederhana yang dipetakan pada objek Anda. Ini kode saya berdasarkan fungsi ArrayAdapter yang disediakan.

Dan karena Anda mungkin perlu menambahkan item setelah pembuatan adaptor (mis. Pemuatan basis data item asinkron).

Sederhana namun efisien.

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

Dan kemudian Anda dapat menggunakan kode ini (saya tidak bisa memasukkan Category [] dalam konstruktor adaptor karena data dimuat secara terpisah).

Perhatikan bahwa adaptor.addAll (item) menyegarkan pemintal dengan memanggil notifyDataSetChanged () di internal.

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

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

Melakukan:

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
            }
        }
Juliano Moraes
sumber
3
Anda masih memperpanjang kelas di sini. Anda hanya melakukannya dengan objek anonim.
FutureShocked