Android: Làm thế nào để liên kết spinner vào danh sách đối tượng tùy chỉnh?


126

Trong giao diện người dùng phải có một spinner chứa một số tên (tên hiển thị) và mỗi tên có ID riêng (ID không bằng chuỗi hiển thị). Khi người dùng chọn tên từ danh sách, biến currentID phải được thay đổi.

Ứng dụng này chứa ArrayList

Trong đó Người dùng là một đối tượng có ID và tên:

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

Những gì tôi không biết là làm thế nào để tạo một spinner hiển thị danh sách tên người dùng và liên kết các mục của spinner với ID để khi mục spinner được chọn / thay đổi, thì biếnID được đặt thành giá trị phù hợp.

Tôi sẽ đánh giá cao nếu bất cứ ai có thể chỉ ra giải pháp của vấn đề được mô tả hoặc cung cấp bất kỳ liên kết hữu ích nào để giải quyết vấn đề.

Cảm ơn!


Sử dụng phương thức setVisibility và đặt nó thành INVISIBLE developer.android.com/reference/android/view/
mẹo

Câu trả lời:


42

Bạn có thể nhìn vào câu trả lời này . Bạn cũng có thể đi với một bộ chuyển đổi tùy chỉnh, nhưng giải pháp dưới đây là tốt cho các trường hợp đơn giản.

Đây là một bài đăng lại:

Vì vậy, nếu bạn đến đây vì bạn muốn có cả nhãn và giá trị trong Spinner - đây là cách tôi đã làm:

  1. Chỉ cần tạo Spinnertheo cách thông thường của bạn
  2. Xác định 2 mảng kích thước bằng nhau trong array.xmltệp của bạn - một mảng cho nhãn, một mảng cho các giá trị
  3. Đặt của bạn Spinnervớiandroid:entries="@array/labels"
  4. Khi bạn cần một giá trị, hãy làm một cái gì đó như thế này (không, bạn không phải xâu chuỗi nó):

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

2
Có một cách thanh lịch để truy cập các nhãn được xác định (để so sánh với selectVal), vì vậy người ta có thể tránh mã hóa cứng các nhãn chuỗi trong mã?
Chống Trái đất

Đây là một trường hợp trùng lặp dữ liệu và nên tránh.
Binoy Babu

18
Rất sai từ quan điểm về khả năng mở rộng - điều đó có nghĩa là "đối tượng" của bạn không bao giờ có thể năng động - thực hành tồi
Srneczek

1
@Bostone Tôi không kiểm tra thời gian nhưng tôi nghĩ nó không liên quan trong trường hợp này. Bộ điều hợp có ở đó vì một số lý do và tôi cá rằng đây không phải là về sự thay đổi SDK theo thời gian. Đó là một trong những lý do tại sao họ tạo ra bộ điều hợp ở nơi đầu tiên. Vì vậy, bạn có thể phục vụ danh sách các đối tượng phức tạp, vì vậy theo tôi, đây luôn là thực tiễn tồi chỉ có thể sử dụng được trong những trường hợp rất đơn giản nhưng điều đó không làm cho nó trở thành thông lệ tốt.
Srneczek

3
@ Bob'sBurgers bạn đang thiếu điểm. Tôi chưa bao giờ nói nó không hoạt động Tôi nói đó là một thực tế tồi tệ và tôi đúng về điều đó. Các biến toàn cục hoặc mã trong 1 tệp rất dài đang hoạt động quá bạn biết đấy ... Btw bạn nên bình luận về các chủ đề cũ bởi vì chúng vẫn xuất hiện trong các tìm kiếm ngày nay và ppl sẽ sử dụng các câu trả lời sai (ngày nay).
Srneczek

344

Tôi biết chủ đề đã cũ, nhưng chỉ trong trường hợp ...

Đối tượng người dùng:

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

Bộ điều hợp Spinner tùy chỉnh (ArrayAd CHƯƠNG)

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

Và việc thực hiện:

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
Đây phải là câu trả lời được chấp nhận. Tạo một bộ chuyển đổi tùy chỉnh chắc chắn là cách để đi.
jamesc

11
Điều này làm việc tốt. Rất đẹp. Nhưng một vấn đề. Các spinner bây giờ thay đổi phong cách của nó. Tôi cố gắng đặt xml mới để thay đổi phần đệm, kích thước văn bản nhưng không có gì xảy ra. Tôi tự thay đổi spinner từ xml và không có gì. Điều duy nhất thay đổi là nếu tôi thay đổi kích thước văn bản của TextView từ bên trong SpinAd CHƯƠNG. Có một wa để giữ kiểu / chủ đề mặc định của spinner nhưng tải các loại giá trị này không?
lantonis

Tôi đã làm điều này, nhưng tôi nhận được độ trễ rất lớn. Trong khi tôi chỉ cần thêm 3 lần. Tôi đã làm tăng một khung nhìn để tạo bố cục của mình, nó chỉ chứa một Biểu tượng và văn bản. Logcat xác nhận tôi bằng cách nói Skipped 317 frames! The application may be doing too much work on its main thread.bất kỳ ý tưởng?
CularBytes

3
+1 cho dòng này :) Người dùng người dùng = adapter.getItem (vị trí);
Ahmad Alkhatib

2
Chỉ cần sửa đổi để sử dụng lại chế độ xem, thay vì tạo TextView mới, bạn nên thực hiện như sau: TextView nhãn = (TextView) super.getView (vị trí, convertView, cha mẹ)
jackcar

93

Giải pháp đơn giản nhất

Sau khi tìm kiếm các giải pháp khác nhau trên SO, tôi thấy sau đây là giải pháp đơn giản và gọn gàng nhất để tạo ra một Spinnertùy chỉnh Objects. Đây là cách thực hiện đầy đủ:

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>

Trong hoạt động của bạn

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

Một lưu ý nhỏ là điều này không đặt currentIDngay khi giá trị Spinner thay đổi. Hầu hết thời gian bạn chỉ cần giá trị của Spinner sau khi nhấn nút, chẳng hạn như Gửi hoặc Lưu , không phải ngay sau khi Spinner thay đổi và nếu có thể tránh được, điều này cung cấp giải pháp đơn giản hơn nhiều.
Joshua Pinter

Tôi thấy điều này có hiệu quả và chỉ cần đặt dòng cuối cùng vào một nơi khác, bạn có thể giải quyết "vấn đề" @JoshPinter mô tả.
x13

@ x13 Đúng vậy. Tất cả những gì bạn cần làm để có được giá trị khi thay đổi là thiết lập trình nghe "thay đổi" và sau đó thực hiện getSelectedItem()cuộc gọi trong đó. Cảm ơn vì tiền hỗ trợ.
Joshua Pinter

4
3 năm đã trôi qua và hoạt động thật tuyệt vời! Không thể tin rằng mọi người lại quá phức tạp với điều đơn giản này.
Juan De la Cruz

1
@JuanDelaCruz Android và java giúp bạn dễ dàng khắc phục mọi thứ. Đơn giản hóa để giành chiến thắng!
Joshua Pinter

53

Đối với các giải pháp đơn giản, bạn chỉ có thể ghi đè "toString" trong đối tượng của mình

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

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

và sau đó bạn có thể sử dụng:

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

Bằng cách này, spinner của bạn sẽ chỉ hiển thị tên người dùng.


Làm cách nào để đặt công cụ quay vòng trên EDIT thành mục đã chọn trả về phản hồi?
Arnold Brown

9

Cho đến nay, cách đơn giản nhất mà tôi đã tìm thấy:

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

Bây giờ bạn có thể dán bất kỳ đối tượng nào trong spinner của mình và nó sẽ hiển thị nhãn được chỉ định.


8

Chỉ cần một điều chỉnh nhỏ cho câu trả lời của Joaquin Alberto có thể giải quyết vấn đề về kiểu dáng. Chỉ cần thay thế chức năng getDropDownView trong bộ điều hợp tùy chỉnh như bên dưới,

@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
câu trả lời này không thực sự trả lời câu hỏi, nhưng nó chỉ ra một số điều quan trọng liên quan đến câu trả lời này
Snut A.Suk

6

Hoạt động tốt với tôi, mã cần thiết xung quanh điều getResource () như sau:

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
        }

    });

Chỉ cần đảm bảo (một mình) các giá trị trong hai mảng được căn chỉnh chính xác!


5

lấy cảm hứng từ Joaquin Alberto, điều này làm việc cho tôi:

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

Dựa trên mẫu Joaquin Alberto (cảm ơn), nhưng nó hoạt động với bất kỳ loại nào (bạn nên triển khai loại toString () để bạn có thể định dạng đầu ra.

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

Ngoài ra tôi nghĩ rằng bạn có thể thay thế Danh sách theo Mảng nên bạn không cần phải thực hiện trong Danh sách, nhưng tôi đã có Danh sách ..... :)


3

Để hiểu được mánh khóe, người ta phải biết, bộ điều hợp hoạt động nói chung và ArrayAd CHƯƠNG nói riêng như thế nào.

Bộ điều hợp: là các đối tượng có khả năng liên kết cấu trúc dữ liệu với các widget, sau đó các widget này sẽ hiển thị dữ liệu đó trong Danh sách hoặc trong Spinner.

Vì vậy, hai câu hỏi mà một câu trả lời của Adaptor là:

  1. Tiện ích hoặc chế độ xem tổng hợp nào cần được liên kết với cấu trúc dữ liệu (đối tượng lớp của bạn) cho một chỉ mục nhất định?
  2. Làm cách nào để trích xuất dữ liệu từ cấu trúc dữ liệu (đối tượng lớp của bạn) và cách đặt (các) trường tức là EditTextcủa tiện ích hoặc chế độ xem tổng hợp theo dữ liệu này?

Câu trả lời của ArrayAd CHƯƠNG là:

  • Mỗi tiện ích (tức là row.xmlOR android.R.layout.simple_spinner_item) cho bất kỳ chỉ mục nào đều giống nhau và được thổi phồng từ tài nguyên có ID được trao cho hàm tạo của ArrayAd CHƯƠNG.
  • Mỗi widget được dự kiến ​​là một phiên bản của TextView (hoặc hậu duệ). .setText()Phương thức của widget sẽ được sử dụng với định dạng chuỗi của mục trong cấu trúc dữ liệu hỗ trợ. Định dạng chuỗi sẽ có được bằng cách gọi .toString()trên mục.

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>

tệp chính

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

Nó hoạt động đúng, tôi hy vọng nó hữu ích.


2

Đối tượng tùy chỉnh của tôi là

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

        }
    }
}

Tôi cũng muốn đặt đối tượng này làm nguồn bộ điều hợp cho công cụ quay vòng của mình mà không cần mở rộng ArrayAd CHƯƠNG để làm những gì tôi đã làm.

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

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

Bây giờ Bạn sẽ có thể thấy kết quả trong công cụ quay vòng của mình, mẹo là ghi đè lên đối tượng tùy chỉnh củatoString() bạn , vì vậy giá trị nào bạn muốn hiển thị trong công cụ quay vòng chỉ cần trả về điều đó trong phương thức này.


0

Tôi nghĩ rằng giải pháp tốt nhất là "Giải pháp đơn giản nhất" của Josh Pinter .

Điều này làm việc cho tôi:

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

Nếu bạn không cần một lớp riêng biệt, ý tôi chỉ là một bộ điều hợp đơn giản được ánh xạ trên đối tượng của bạn. Đây là mã của tôi dựa trên các hàm ArrayAd CHƯƠNG được cung cấp.

Và bởi vì bạn có thể cần thêm mục sau khi tạo bộ điều hợp (ví dụ: tải cơ sở dữ liệu không đồng bộ).

Đơn giản nhưng hiệu quả.

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

Và sau đó, bạn có thể sử dụng mã này (tôi không thể đặt Danh mục [] trong trình tạo bộ điều hợp vì dữ liệu được tải riêng biệt).

Lưu ý rằng adapter.add ALL (mục) làm mới spinner bằng cách gọi notifyDataSetChanged () trong nội bộ.

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

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

-1

Làm:

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
Bạn vẫn đang mở rộng một lớp học ở đây. Bạn chỉ đang làm điều đó với một đối tượng ẩn danh.
Tương lai
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.