Android开发Android开发经验谈Android技术知识

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

2020-04-23  本文已影响0人  InFatuated

需求中,有接口返回非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内容了。

上一篇下一篇

猜你喜欢

热点阅读