Android : 스피너를 사용자 정의 객체 목록에 바인딩하는 방법은 무엇입니까?


126

사용자 인터페이스에는 일부 이름을 포함하는 스피너가 있어야하고 (이름이 표시됨) 각 이름에는 고유 한 ID가 있습니다 (ID는 표시 순서와 동일하지 않습니다). 사용자가 목록에서 이름을 선택하면 currentID 변수를 변경해야합니다.

응용 프로그램에 ArrayList가 포함되어 있습니다

여기서 User는 ID와 이름을 가진 객체입니다.

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

내가 모르는 것은 사용자 이름 목록을 표시하는 스피너를 만들고 스피너 항목을 ID에 바인딩하여 스피너 항목을 선택 / 변경할 때 currentID 변수가 적절한 값으로 설정되는 방법입니다.

설명 된 문제의 해결책을 보여 주거나 문제를 해결하는 데 유용한 링크를 제공 할 수 있다면 감사하겠습니다.

감사!


setVisibility 메소드를 사용하여 INVISIBLE developer.android.com/reference/android/view/…로
andoni90

답변:


42

이 답변을 볼 수 있습니다 . 사용자 정의 어댑터를 사용할 수도 있지만 아래의 솔루션은 간단한 경우에 적합합니다.

재 게시물은 다음과 같습니다.

따라서 Spinner에 레이블과 값을 모두 갖고 싶어서 여기 온다면 여기에 내가 한 방법이 있습니다.

  1. 그냥 만드는 Spinner일반적인 방법을
  2. array.xml파일 에 2 개의 동일한 크기 배열을 정의하십시오. 하나는 레이블, 하나는 값
  3. 사용자의 설정 Spinnerandroid:entries="@array/labels"
  4. 가치가 필요할 때 다음과 같이하십시오 (아니, 연결할 필요는 없습니다).

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

2
정의 된 레이블에 액세스하는 우아한 방법이 있습니까 (selectedVal과 비교하기 위해) 코드에서 문자열 레이블을 하드 코딩하는 것을 피할 수 있습니까?
Anti Earth

이것은 데이터 복제의 경우이므로 피해야합니다.
Binoy Babu

18
확장 성 관점에서 잘못
되었으므로

1
@Bostone 나는 시간을 확인하지 않았지만이 경우에는 관련이 없다고 생각합니다. 어댑터는 어떤 이유로 거기에 있으며 SDK 시간에 관한 것이 아니라고 확신합니다. 그들이 처음에 어댑터를 만든 이유 중 하나입니다. 따라서 복잡한 객체 목록을 제공 할 수 있으므로 이것은 매우 간단한 경우에만 사용할 수 있지만 항상 좋은 연습은 아닙니다.
Srneczek

3
@ Bob'sBurgers 당신은 요점을 놓치고 있습니다. 나는 그것이 작동하지 않는다고 결코 말하지 않았다. 나는 그것이 나쁜 습관이라고 말했고 나는 그것에 대해 옳다. 전역 변수 또는 코드가 1 인 매우 긴 파일도 작동합니다 ... 아직 오래된 스레드에 대해 오늘 검색에 표시되므로 ppl은 (오늘) 잘못된 답변을 사용합니다.
Srneczek

344

실이 오래되었다는 것을 알고 있지만 경우에 따라 ...

사용자 객체 :

public class User{

    private int _id;
    private String _name;

    public User(){
        this._id = 0;
        this._name = "";
    }

    public void setId(int id){
        this._id = id;
    }

    public int getId(){
        return this._id;
    }

    public void setName(String name){
        this._name = name;
    }

    public String getName(){
        return this._name;
    }
}

커스텀 스피너 어댑터 (ArrayAdapter)

public class SpinAdapter extends ArrayAdapter<User>{

    // Your sent context
    private Context context;
    // Your custom values for the spinner (User)
    private User[] values;

    public SpinAdapter(Context context, int textViewResourceId,
            User[] values) {
        super(context, textViewResourceId, values);
        this.context = context;
        this.values = values;
    }

    @Override
    public int getCount(){
       return values.length;
    }

    @Override
    public User getItem(int position){
       return values[position];
    }

    @Override
    public long getItemId(int position){
       return position;
    }


    // And the "magic" goes here
    // This is for the "passive" state of the spinner
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // I created a dynamic TextView here, but you can reference your own  custom layout for each spinner item
        TextView label = (TextView) super.getView(position, convertView, parent);
        label.setTextColor(Color.BLACK);
        // Then you can get the current item using the values array (Users array) and the current position
        // You can NOW reference each method you has created in your bean object (User class)
        label.setText(values[position].getName());

        // And finally return your dynamic (or custom) view for each spinner item
        return label;
    }

    // And here is when the "chooser" is popped up
    // Normally is the same view, but you can customize it if you want
    @Override
    public View getDropDownView(int position, View convertView,
            ViewGroup parent) {
        TextView label = (TextView) super.getDropDownView(position, convertView, parent);
        label.setTextColor(Color.BLACK);
        label.setText(values[position].getName());

        return label;
    }
}

그리고 구현 :

public class Main extends Activity {
    // You spinner view
    private Spinner mySpinner;
    // Custom Spinner adapter (ArrayAdapter<User>)
    // You can define as a private to use it in the all class
    // This is the object that is going to do the "magic"
    private SpinAdapter adapter;

        @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Create the Users array
        // You can get this retrieving from an external source
        User[] users = new User[2];

        users[0] = new User();
        users[0].setId(1);
        users[0].setName("Joaquin");

        users[1] = new User();
        users[1].setId(2);
        users[1].setName("Alberto");

        // Initialize the adapter sending the current context
        // Send the simple_spinner_item layout
        // And finally send the Users array (Your data)
        adapter = new SpinAdapter(Main.this,
            android.R.layout.simple_spinner_item,
            users);
        mySpinner = (Spinner) findViewById(R.id.miSpinner);
        mySpinner.setAdapter(adapter); // Set the custom adapter to the spinner
        // You can create an anonymous listener to handle the event when is selected an spinner item
        mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view,
                    int position, long id) {
                // Here you get the current item (a User object) that is selected by its position
                User user = adapter.getItem(position);
                // Here you can do the action you want to...
                Toast.makeText(Main.this, "ID: " + user.getId() + "\nName: " + user.getName(),
                    Toast.LENGTH_SHORT).show();
            }
            @Override
            public void onNothingSelected(AdapterView<?> adapter) {  }
        });
    }
}

43
이것이 정답입니다. 사용자 정의 어댑터를 작성하는 것이 확실합니다.
jamesc

11
이것은 잘 작동했습니다. 아주 좋아요 그러나 하나의 문제. 스피너는 이제 스타일을 변경했습니다. 패딩, 텍스트 크기를 변경하기 위해 새 XML을 설정하려고 시도하지만 아무 일도 일어나지 않습니다. 나는 스피너를 XML에서 자체적으로 변경하고 여전히 아무것도하지 않습니다. 변경되는 유일한 것은 SpinAdapter 내에서 TextView의 텍스트 크기를 변경하는 것입니다. 기본 스피너 스타일 / 테마를 유지하면서 이러한 종류의 값을로드하는 방법이 있습니까?
lantonis

나는 이것을했지만, 나는 엄청난 양의 시차를 겪고있다. 3 번만 추가하면됩니다. 레이아웃을 만들기 위해 뷰를 부풀 렸으며 아이콘과 텍스트 만 포함되어 있습니다. logcat은 Skipped 317 frames! The application may be doing too much work on its main thread.어떤 아이디어 라고 말하여 나를 확인합니다 .
CularBytes 2016 년

3
이 줄에 +1 :) 사용자 사용자 = adapter.getItem (position);
Ahmad Alkhatib

2
새 TextView를 작성하는 대신보기를 재사용하기 위해 수정하면 다음과 같이 수행됩니다. TextView label = (TextView) super.getView (position, convertView, parent)
jackcar

93

가장 간단한 솔루션

SO에서 다른 솔루션을 수색 한 후 다음을 Spinner사용자 정의로 채우기위한 가장 간단하고 깨끗한 솔루션이라는 것을 알았습니다.Objects . 전체 구현은 다음과 같습니다.

User.java

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

    @Override
    public String toString() {
        return this.name; // What to display in the Spinner list.
    }
}    

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>

당신의 활동에서

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

하나의 작은 경고는 Spinner 값이 변경 currentID되 자마자 설정하지 않는다는 것입니다 . 대부분의 경우 Spinner가 변경된 직후가 아니라 Submit 또는 Save 와 같은 버튼을 누른 후 Spinner 의 값만 필요 하며 피할 수없는 경우 훨씬 간단한 솔루션을 제공합니다.
Joshua Pinter

나는 이것이 작동한다는 것을 알았고 단순히 마지막 줄을 다른 곳에두면 @JoshPinter 설명 된 문제를 해결할 수있다.
x13

@ x13 맞습니다. 변경시 가치를 얻으려면 "변경시"리스너를 설정 한 다음 getSelectedItem()전화를 걸기 만하면됩니다. 팁 고마워.
Joshua Pinter

4
3 년이 지났고 놀랍습니다! 사람들이이 단순한 것을 지나치게 복잡하게 믿지 못합니다.
Juan De la Cruz

1
@JuanDelaCruz Android 및 Java를 사용하면 복잡한 작업을 쉽게 수행 할 수 있습니다. 승리를위한 단순화!
Joshua Pinter

53

간단한 솔루션의 경우 객체의 "toString"을 덮어 쓸 수 있습니다.

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

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

다음을 사용할 수 있습니다.

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

이렇게하면 스피너에 사용자 이름 만 표시됩니다.


응답시 반환되는 선택된 항목으로 EDIT의 스피너를 설정하는 방법은 무엇입니까?
아놀드 브라운

9

내가 찾은 가장 간단한 방법 :

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

이제 스피너에 물건을 붙일 수 있으며 지정된 레이블이 표시됩니다.


8

Joaquin Alberto의 답변을 약간만 조정하면 스타일 문제를 해결할 수 있습니다. 사용자 정의 어댑터의 getDropDownView 함수를 아래와 같이 바꾸십시오.

@Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        View v = super.getDropDownView(position, convertView, parent);
        TextView tv = ((TextView) v);
        tv.setText(values[position].getName());
        tv.setTextColor(Color.BLACK);
        return v;
    }

1
이 답변은 실제로 질문에 대한 답변이 아니지만, 중요한 답변은이 답변과 관련이 있다는 점입니다.
Sruit A.Suk

6

getResource () 주변에서 필요한 코드는 다음과 같습니다.

spinner = (Spinner) findViewById(R.id.spinner);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> spinner, View v,
                int arg2, long arg3) {
            String selectedVal = getResources().getStringArray(R.array.compass_rate_values)[spinner.getSelectedItemPosition()];
            //Do something with the value
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub
        }

    });

두 배열의 값이 올바르게 정렬되어 있는지 확인하십시오!


5

Joaquin Alberto에서 영감을 얻은 이것은 나를 위해 일했습니다.

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 (감사) 샘플을 기반으로하지만 모든 유형 (toString ()을 유형으로 구현해야 함)에 따라 출력 형식을 지정할 수 있습니다.

import java.util.List;

import android.content.Context;
import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class SpinAdapter<T> extends ArrayAdapter<T> {
private Context context;
private List<T> values;

public SpinAdapter(Context context, int textViewResourceId, List<T> values) {
    super(context, textViewResourceId, values);
    this.context = context;
    this.values = values;
}

public int getCount() {
    return values.size();
}

public T getItem(int position) {
    return values.get(position);
}

public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    TextView label = new TextView(context);
    label.setTextColor(Color.BLACK);
    label.setText(values.toArray(new Object[values.size()])[position]
            .toString());
    return label;
}

@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
    TextView label = new TextView(context);
    label.setTextColor(Color.BLACK);
    label.setText(values.toArray(new Object[values.size()])[position]
            .toString());

    return label;
}
}

또한 List로 배열을 바꿀 수 있다고 생각하므로 List에서 toArray를 수행 할 필요는 없지만 List가 있습니다 ..... :)


3

트릭을 이해하려면 어댑터가 일반적으로 작동하는 방식과 특히 ArrayAdapter가 작동하는 방식을 알아야합니다.

어댑터 : 데이터 구조를 위젯에 바인드 할 수있는 오브젝트이며,이 위젯은 해당 데이터를 List 또는 Spinner에 표시합니다.

따라서 어댑터가 대답하는 두 가지 질문은 다음과 같습니다.

  1. 특정 인덱스의 데이터 구조 (클래스의 객체)와 어떤 위젯 또는 복합 뷰를 연결해야합니까?
  2. 데이터 구조 (클래스의 객체)에서 데이터를 추출하는 방법 EditText과이 데이터에 따라 위젯 또는 복합 뷰 의 필드를 설정하는 방법은 무엇입니까?

ArrayAdapter의 답변은 다음과 같습니다.

  • 각 위젯 (즉 row.xmlORandroid.R.layout.simple_spinner_item인덱스에 대한 )은 동일하며 ID가 ArrayAdapter의 생성자에게 제공된 리소스에서 팽창됩니다.
  • 각 위젯은 TextView (또는 자손)의 인스턴스 여야합니다. 위젯의 .setText()메소드는 지원 데이터 구조에서 항목의 문자열 형식과 함께 사용됩니다. 문자열 형식은 .toString()항목 을 호출 하여 얻습니다 .

CustomListViewDemo.java

public class CustomListViewDemo extends ListActivity {
  private EfficientAdapter adap;

  private static String[] data = new String[] { "0", "1", "2", "3", "4" };

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);
    adap = new EfficientAdapter(this);
    setListAdapter(adap);
  }

  @Override
  protected void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);
    Toast.makeText(this, "Click-" + String.valueOf(position), Toast.LENGTH_SHORT).show();
  }

  public static class EfficientAdapter extends BaseAdapter implements Filterable {
    private LayoutInflater mInflater;
    private Bitmap mIcon1;
    private Context context;
    int firstpos=0;

    public EfficientAdapter(Context context) {
      // Cache the LayoutInflate to avoid asking for a new one each time.
      mInflater = LayoutInflater.from(context);
      this.context = context;
    }

    public View getView(final int position, View convertView, ViewGroup parent) {

      ViewHolder holder;

      if (convertView == null) {
        convertView = mInflater.inflate(R.layout.adaptor_content, null);

        holder = new ViewHolder();
        holder.sp = (Spinner) convertView.findViewById(R.id.spinner1);

        holder.ArrayAdapter_sp = new ArrayAdapter(parent.getContext(),android.R.layout.simple_spinner_item,data);
        holder.ArrayAdapter_sp.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        holder.sp.setAdapter( holder.ArrayAdapter_sp);
        holder.sp.setOnItemSelectedListener(new OnItemSelectedListener()
        {
            private int pos = position;
            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1,
                    int p, long arg3) 
            {
                // TODO Auto-generated method stub
                 Toast.makeText(context, "select spinner " + String.valueOf(pos)+" with value ID "+p, Toast.LENGTH_SHORT).show();    

            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0)
            {
                // TODO Auto-generated method stub

            }
        });




        convertView.setTag(holder);
      } else {

        holder = (ViewHolder) convertView.getTag();
      }


      return convertView;
    }

    static class ViewHolder 
    {

        Spinner sp;
        ArrayAdapter ArrayAdapter_sp;

    }

    @Override
    public Filter getFilter() {
      // TODO Auto-generated method stub
      return null;
    }

    @Override
    public long getItemId(int position) {
      // TODO Auto-generated method stub
      return 0;
    }

    @Override
    public int getCount() {
      // TODO Auto-generated method stub
      return data.length;
    }

    @Override
    public Object getItem(int position) {
      // TODO Auto-generated method stub
      return data[position];
    }

  }

}

adaptor_content.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/lineItem"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_vertical" >

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="314dp"
        android:layout_height="wrap_content" />

</LinearLayout>

main.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="fill_parent" android:layout_width="fill_parent"
    >

    <ListView
        android:id="@+id/android:list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginBottom="60dip"
        android:layout_marginTop="10dip"
        android:cacheColorHint="#00000000"
        android:drawSelectorOnTop="false" />

</RelativeLayout>

제대로 작동하므로 유용하기를 바랍니다.


2

내 맞춤 객체는

/**
 * Created by abhinav-rathore on 08-05-2015.
 */
public class CategoryTypeResponse {
    private String message;

    private int status;

    private Object[] object;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public Object[] getObject() {
        return object;
    }

    public void setObject(Object[] object) {
        this.object = object;
    }

    @Override
    public String toString() {
        return "ClassPojo [message = " + message + ", status = " + status + ", object = " + object + "]";
    }

    public static class Object {
        private String name;
        private String _id;
        private String title;
        private String desc;
        private String xhdpi;
        private String hdpi;
        private String mdpi;
        private String hint;
        private String type;
        private Brands[] brands;


        public String getId() {
            return _id;
        }

        public void setId(String id) {
            this._id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getXhdpi() {
            return xhdpi;
        }

        public void setXhdpi(String xhdpi) {
            this.xhdpi = xhdpi;
        }

        public String getHdpi() {
            return hdpi;
        }

        public void setHdpi(String hdpi) {
            this.hdpi = hdpi;
        }

        public String getMdpi() {
            return mdpi;
        }

        public void setMdpi(String mdpi) {
            this.mdpi = mdpi;
        }

        public String get_id() {
            return _id;
        }

        public void set_id(String _id) {
            this._id = _id;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getDesc() {
            return desc;
        }

        public void setDesc(String desc) {
            this.desc = desc;
        }

        public String getHint() {
            return hint;
        }

        public void setHint(String hint) {
            this.hint = hint;
        }

        public String getType() {
            return type;
        }

        public void setType(String type) {
            this.type = type;
        }

        public Brands[] getBrands() {
            return brands;
        }

        public void setBrands(Brands[] brands) {
            this.brands = brands;
        }

        @Override
        public String toString() {
            return "ClassPojo [name = " + name + "]";
        }
    }

    public static class Brands {

        private String _id;
        private String name;
        private String value;
        private String categoryid_ref;

        public String get_id() {
            return _id;
        }

        public void set_id(String _id) {
            this._id = _id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }

        public String getCategoryid_ref() {
            return categoryid_ref;
        }

        public void setCategoryid_ref(String categoryid_ref) {
            this.categoryid_ref = categoryid_ref;
        }

        @Override
        public String toString() {
            return  name;

        }
    }
}

또한 ArrayAdapter 를 확장하지 않고이 객체를 어댑터 소스로 내 스피너에 설정하고 싶었습니다 .

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

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

이제 스피너에서 결과를 볼 수 있습니다. 트릭은 사용자 정의 객체toString() 에서 재정의 하는 것이 되었으므로 스피너에 표시하려는 값이 무엇이든이 메소드에서 반환합니다.


0

나는 최선의 해결책이 있다고 생각 "가장 간단한 해결 방법" 에 의해 조쉬 핀터 .

이것은 나를 위해 일했다 :

//Code of the activity 
//get linearLayout
LinearLayout linearLayout = (LinearLayout ) view.findViewById(R.id.linearLayoutFragment);       

LinearLayout linearLayout = new LinearLayout(getActivity());
//display css
RelativeLayout.LayoutParams params2 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);

//create the spinner in a fragment activiy
Spinner spn = new Spinner(getActivity());

// create the adapter.
ArrayAdapter<ValorLista> spinner_adapter = new ArrayAdapter<ValorLista>(getActivity(), android.R.layout.simple_spinner_item, meta.getValorlistaList());
spinner_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
spn.setAdapter(spinner_adapter);

//set the default according to value
//spn.setSelection(spinnerPosition);

linearLayout.addView(spn, params2);
//Code of the class ValorLista

import java.io.Serializable;
import java.util.List;

public class ValorLista implements Serializable{


    /**
     * 
     */
    private static final long serialVersionUID = 4930195743192929192L;
    private int id; 
    private String valor;
    private List<Metadato> metadatoList;


    public ValorLista() {
        super();
        // TODO Auto-generated constructor stub
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getValor() {
        return valor;
    }
    public void setValor(String valor) {
        this.valor = valor;
    }
    public List<Metadato> getMetadatoList() {
        return metadatoList;
    }
    public void setMetadatoList(List<Metadato> metadatoList) {
        this.metadatoList = metadatoList;
    }

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

}

0

분리 된 클래스가 필요하지 않으면 객체에 매핑 된 간단한 어댑터를 의미합니다. 다음은 제공된 ArrayAdapter 함수를 기반으로 한 코드입니다.

그리고 어댑터 작성 후 항목을 추가해야 할 수도 있습니다 (예 : 데이터베이스 항목 비동기로드).

간단하지만 효율적입니다.

editCategorySpinner = view.findViewById(R.id.discovery_edit_category_spinner);

// Drop down layout style - list view with radio button         
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

// attaching data adapter to spinner, as you can see i have no data at this moment
editCategorySpinner.setAdapter(dataAdapter);
final ArrayAdapter<Category> dataAdapter = new ArrayAdapter<Category>

(getActivity(), android.R.layout.simple_spinner_item, new ArrayList<Category>(0)) {


        // And the "magic" goes here
        // This is for the "passive" state of the spinner
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // I created a dynamic TextView here, but you can reference your own  custom layout for each spinner item
            TextView label = (TextView) super.getView(position, convertView, parent);
            label.setTextColor(Color.BLACK);
            // Then you can get the current item using the values array (Users array) and the current position
            // You can NOW reference each method you has created in your bean object (User class)
            Category item = getItem(position);
            label.setText(item.getName());

            // And finally return your dynamic (or custom) view for each spinner item
            return label;
        }

        // And here is when the "chooser" is popped up
        // Normally is the same view, but you can customize it if you want
        @Override
        public View getDropDownView(int position, View convertView,
                                    ViewGroup parent) {
            TextView label = (TextView) super.getDropDownView(position, convertView, parent);
            label.setTextColor(Color.BLACK);
            Category item = getItem(position);
            label.setText(item.getName());

            return label;
        }
    };

그런 다음이 코드를 사용할 수 있습니다 (데이터가 분리되어로드되기 때문에 Category []를 어댑터 생성자에 넣을 수 없었습니다).

내부에서 notifyDataSetChanged ()를 호출하여 adapter.addAll (items) refresh spinner에 유의하십시오.

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

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

-1

하다:

spinner.adapter = object: ArrayAdapter<Project>(
            container.context,
            android.R.layout.simple_spinner_dropdown_item,
            state.projects
        ) {
            override fun getDropDownView(
                position: Int,
                convertView: View?,
                parent: ViewGroup
            ): View {
                val label = super.getView(position, convertView, parent) as TextView
                label.text = getItem(position)?.title
                return label
            }

            override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
                val label = super.getView(position, convertView, parent) as TextView
                label.text = getItem(position)?.title
                return label
            }
        }

3
여전히 수업을 확장하고 있습니다. 당신은 익명의 객체로 그것을하고 있습니다.
FutureShocked
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.