思路:
初始化Spinner时,Spinner会默认选择第一项。此时将第一项隐藏不显示,给人产生一种默认未选择任何值的感觉。
自定义 Spinner
使用原生Spinner控件时,该控件在连续点击同一个Item时,会触发setSelection方法,但不会触选择监听事件。所以此处我们可以重写setSelection方法,并手动调用监听事件。
package com.daliang.daliangbao.views;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.Spinner;
@SuppressLint("AppCompatCustomView")
public class MySpinner extends Spinner {
private static final String TAG = "ybz_spinner";
private int lastPosition = 0;
public MySpinner(Context context, int mode) {
super(context, mode);
}
public MySpinner(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MySpinner(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public MySpinner(Context context, AttributeSet attrs, int defStyleAttr, int mode) {
super(context, attrs, defStyleAttr, mode);
}
// 一个 item 选中的时候,总是会触发 setSelection 方法
// 所以在这个方法中,我们记录并检查上一次的selection position 就行了,如果是相同的,手动调用监听即可
@Override
public void setSelection(int position, boolean animate) {
super.setSelection(position, animate);
if (position == lastPosition){
if (getOnItemSelectedListener() != null)
getOnItemSelectedListener().onItemSelected(this, getChildAt(position), position, 0);
}
lastPosition = position;
}
@Override
public void setSelection(int position) {
super.setSelection(position);
if (getOnItemSelectedListener() != null)
getOnItemSelectedListener().onItemSelected(this, getChildAt(position), position, 0);
}
lastPosition = position;
}
}
使用方法
private fun initSpinner() {
var isSpinnerFirst = true //是否是第一次选择的标志 初始化时会默认执行一次选择
var selectedView: View? = null // 被选择的子view
spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onNothingSelected(parent: AdapterView?) {
}
override fun onItemSelected(parent: AdapterView?, view: View?, position: Int, id: Long) {
if (isSpinnerFirst) {
// 初始化时不显示
view?.visibility = View.INVISIBLE
} else {
// 手动选择后显示布局
view?.visibility = View.VISIBLE
}
selectedView = view
isSpinnerFirst = false
}
}
//判断被选择的view是否处于显示状态,是则取值
if (selectedView?.visibility == View.VISIBLE)
Toast.makeText(this, spinner.selectedItemPosition.toString(), Toast.LENGTH_SHORT).show()
}