Spinner存储非String类型数据的应用

作者: InFatuated | 来源:发表于2020-04-23 14:40 被阅读0次

    需求中,有接口返回非String类型数据,且要储存入Spinner控件内进行交互。

    这样要求的原因是我们在Spinner中显示给用户我们想要显示的值,而在之后对应Spinner控件的数据调用时,可以给后台传递其对应的另外的一个数字。说的通俗点,就相当于给Spinner绑定一个map类型的键值对数据,或者一对多属性的类型数据。

    这里打个比方

    
    public class Teacher{
    
      private String name;
    
      private String age;
    
    }
    
    

    我们显示的是Teacher.name

    而在传递数据调用接口时,用的确实Teacher.age

    问题是一旦如此做了,会发现显示结果中,Spinner中的文本都会变成数据索引,而非我们所想要的某个属性的内容

    首先挂上自用的自定义Spinner控件代码:

    
    /**
     * 基于Baseitemview 样式的 单Spinner选择框
     * Created on 2019/3/21.
     */
    
    public class BaseSpinnerMapItemView<D> extends ConstraintLayout {
    
        Context mContext;
    
        List<D> data;
        @BindView(R.id.tv_main_title)
        TextView tvMainTitle;
        @BindView(R.id.sp_base_spinner)
        Spinner spBaseSpinner;
        @BindView(R.id.iv_right)
        ImageView iv_right;
    
        public BaseSpinnerMapItemView(Context context, AttributeSet attrs) {
            super(context, attrs);
            mContext = context;
            LayoutInflater.from(context).inflate(R.layout.v2view_spinner_base_item, this, true);
            ButterKnife.bind(this, this);
            //设置自定义属性,保存标题文本内容
            TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.BaseSpinnerMapItemView);
            String mainTitle = attributes.getString(R.styleable.BaseSpinnerMapItemView_mainTitleSpinnerMap);
            if (!TextUtils.isEmpty(mainTitle)) {
                tvMainTitle.setText(mainTitle);
            } else {
                tvMainTitle.setText("");
            }
    
        }
    
        public void setDatas(String title, List<D> data) {
            tvMainTitle.setText(title);
            this.data = data;
            //选中样式
            ArrayAdapter<D> spinnerAdapter = new ArrayAdapter<>(mContext,
                    R.layout.v2view_select_textview_spinner, data);
            //下拉样式
            spinnerAdapter.setDropDownViewResource(R.layout.v2view_drop_textview_spinner);
            spBaseSpinner.setAdapter(spinnerAdapter);
        }
        public void setDatas( List<D> data) {
            this.data = data;
            //选中样式
            ArrayAdapter<D> spinnerAdapter = new ArrayAdapter<>(mContext,
                    R.layout.v2view_select_textview_spinner, data);
            //下拉样式
            spinnerAdapter.setDropDownViewResource(R.layout.v2view_drop_textview_spinner);
            spBaseSpinner.setAdapter(spinnerAdapter);
        }
    
        public void setSpinnerVisibility(int visibility) {
            spBaseSpinner.setVisibility(visibility);
            iv_right.setVisibility(visibility);
        }
    
        public int getSelectItemPosition() {
            return spBaseSpinner.getSelectedItemPosition();
        }
    
        public Object getSelectItem() {
            return spBaseSpinner.getSelectedItem();
        }
    
        public void setFindByItem(String name) {
            for (int i = 0; data != null && i < data.size(); i++) {
                if (name.equals(data.get(i).toString())) {
                    spBaseSpinner.setSelection(i);
                    return;
                }
            }
        }
    
        public void setCheckItem(int pos) {
            spBaseSpinner.setSelection(pos);
        }
    
        public void setEnable(boolean isis) {
            spBaseSpinner.setEnabled(isis);
        }
    
    }
    
    

    布局文件:

    
    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white">
    
        <android.support.constraint.Guideline
            android:id="@+id/guideline"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.5" />
    
        <View
            android:id="@+id/v_line"
            android:layout_width="match_parent"
            android:layout_height="1px"
            android:background="#E9E9E9"
            app:layout_constraintBottom_toBottomOf="parent" />
    
        <TextView
            android:id="@+id/tv_main_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingLeft="16dp"
            android:paddingTop="10dp"
            android:paddingRight="32dp"
            android:paddingBottom="10dp"
            android:text="主标题"
            android:textSize="16sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <Spinner
            android:id="@+id/sp_base_spinner"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginRight="16dp"
            android:background="@drawable/border_time_spinner"
            android:paddingLeft="4dp"
            android:paddingTop="6dp"
            android:paddingBottom="6dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toRightOf="@+id/guideline"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <ImageView
            android:id="@+id/iv_right"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="4dp"
            android:src="@drawable/app_spinner"
            app:layout_constraintBottom_toBottomOf="@id/sp_base_spinner"
            app:layout_constraintRight_toRightOf="@+id/sp_base_spinner"
            app:layout_constraintTop_toTopOf="@+id/sp_base_spinner" />
    
    </android.support.constraint.ConstraintLayout>
    

    用以保存spinner标题文本的自定义文件属性:

    
    <declare-styleable name="BaseSpinnerMapItemView">
    
    <attr name="mainTitleSpinnerMap" format="string" />
    
    </declare-styleable>
    
    

    接下来主要看存储内容的数据类型代码,如果想要让Spinner显示自己想要的数据内容,我们复写其toString()方法就好,因为Spinner默认的显示文本内容就是对应数据的toString()的返回值。

    看代码:

    
    BaseSpinnerMapItemView bsp_map = new BaseSpinnerMapItemView ();
    
    List<ProcessBean> processList= new ArrayList();
    
    bsp_map.setDatas(processList);
    
    
    
    public class ProcessBean implements Serializable {
        private String name;
        private String value;
        private String type;
    
        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 getType() {
            return type;
        }
    
        public void setType(String type) {
            this.type = type;
        }
        //重点,重写toString()方法
        @Override
        public String toString() {
            return name;
        }
    }
    

    这样我们就可以在Spinner中获得并显示返回数据中ProcessBean.name内容了。

    相关文章

      网友评论

        本文标题:Spinner存储非String类型数据的应用

        本文链接:https://www.haomeiwen.com/subject/btqaihtx.html