AppCompatSpinner的使用
布局:
<androidx.appcompat.widget.AppCompatSpinner
android:id="@+id/spinner"
android:layout_width="200dp"
android:layout_height="40dp"
android:dropDownVerticalOffset="0dp"
android:dropDownHorizontalOffset="0dp"
android:background="@color/white"
android:spinnerMode="dropdown"
android:overlapAnchor="false"
>
</androidx.appcompat.widget.AppCompatSpinner>
其中,
dropDownVerticalOffset、dropDownHorizontalOffset是控制spinner弹出以后的相对spinner展开前布局位置的偏移量,
并不能控制弹出动画的起始位置,所以用这个组件没有达到从下方弹出的需求,我后来改用了自定义popupWindow,闲下来再看看Spinner修改动画起始位置有没有搞头。
给spinner设置适配器:
private fun setUpSpinner(){
val spinnerAdapter = ServiceSpinnerAdapter(context!!, Constants.spinnerTitles)
mSpinner.adapter = spinnerAdapter
mSpinner.gravity = Gravity.CENTER_HORIZONTAL
}
ServiceSpinnerAdapter
class ServiceSpinnerAdapter : SpinnerAdapter {
private var mContext: Context
lateinit var imageView: ImageView
private var mList = mutableListOf<String>()
constructor(context: Context, list: MutableList<String>) {
this.mContext = context
this.mList = list
}
override fun registerDataSetObserver(observer: DataSetObserver?) {}
override fun unregisterDataSetObserver(observer: DataSetObserver?) {}
override fun getCount(): Int {
return mList.size
}
override fun getItem(position: Int): Any {
return mList[position]
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun hasStableIds(): Boolean {
return false
}
/**
* Spinner收起时的布局
* 可以自定义文字 箭头图片什么的
* */
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
val rootView = LayoutInflater
.from(parent!!.context).inflate(R.layout.layout_expert_spinner_default, parent, false)
val textView = rootView.findViewById<TextView>(R.id.spinner_title)
textView.text = mList[position]
imageView = rootView.findViewById<ImageView>(R.id.iv_down_arrow)
val lp = rootView.layoutParams
lp.width = ScreenUtil.getScreenWidth(mContext) /2
lp.height = ScreenUtil.dpToPx(35)
rootView.layoutParams = lp
return rootView
}
override fun getItemViewType(position: Int): Int {
return 1
}
override fun getViewTypeCount(): Int {
return 1
}
override fun isEmpty(): Boolean {
return false
}
/**
* Spinner展开时的item布局
* */
override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup?): View {
val rootView = LayoutInflater
.from(parent!!.context).inflate(R.layout.layout_expert_spinner_drop_down, parent, false)
val textView = rootView.findViewById<TextView>(R.id.spinner_title)
textView.text = mList[position]
val lp = rootView.layoutParams
lp.width = ScreenUtil.getScreenWidth(mContext) /2
lp.height = ScreenUtil.dpToPx(35)
rootView.layoutParams = lp
return rootView
}
}
布局layout_expert_spinner_default
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp35"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:textSize="@dimen/sp14"
android:textColor="@color/expertAreaTextColor"
android:text="服务领域"
android:gravity="center"
android:id="@+id/spinner_title"/>
<ImageView
android:id="@+id/iv_down_arrow"
android:layout_width="@dimen/dp16"
android:layout_height="@dimen/dp16"
android:scaleType="fitXY"
android:src="@mipmap/icon_down_arrow"
android:layout_marginStart="@dimen/dp15"/>
</LinearLayout>
布局layout_expert_spinner_drop_down
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp35"
android:textSize="@dimen/sp14"
android:textColor="@color/expertAreaTextColor"
android:text="服务领域"
android:gravity="center"
android:id="@+id/spinner_title"
android:background="@drawable/selector_spinner_drop_down">
</TextView>
Spinner下拉列表的选中事件
mSpinner.onItemSelectedListener = object: AdapterView.OnItemSelectedListener{
override fun onNothingSelected(parent: AdapterView<*>?) {
}
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
}
}