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