以spinner舉例,首先定義一個(gè)在model
object SPModel : BaseObservable(){
var pos = false
@Bindable
get(){
return field
}
set(value){
field = value
notifyPropertyChanged(BR.pos)
}
}
pos即spinner的selected position
然后給用BindingAdapter給spinner賦值
@JvmStatic
@BindingAdapter("selectedPos")
fun setSelectedPos(sp:Spinner,pos:Int){
sp.setSelection(pos)
}
這個(gè)時(shí)候,當(dāng)我們修改model的pos的值的時(shí)候,spinner的選中項(xiàng)就會(huì)變成對(duì)應(yīng)position的項(xiàng)
然后需要對(duì)spinner進(jìn)行反向綁定,即用 Databinding對(duì)onItemSelectedListener進(jìn)行監(jiān)聽(tīng)
@JvmStatic
@InverseBindingAdapter(attribute = "selectedPos",event = "posAttrChanged")
fun getSelectedPos(sp:Spinner){
return sp.selectedItemPosition
}
@JvmStatic
@BindingAdapter("posAttrChanged")
fun setSPChanged(sp:Spinner,lis:InverseBindingListener){
sp.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
lis.onChange()
}
override fun onNothingSelected(parent: AdapterView<*>?) { }
}
}
這個(gè)BindingAdapter對(duì)應(yīng)的即是InverseBindingAdapter中的event,所以value需要與InverseBindingAdapter中的event一致
最后則是xml中添加屬性,根目錄添加 xmlns:bind="http://schemas.android.com/tools"
xmlns:bind="http://schemas.android.com/tools"
<Spinner
android:layout_width = "300dp"
android:layout_width = "60dp"
android:entries = "@array/test"
bind:selectedPos = "@={model.pos}"
/>