Spinner 雙向綁定獲取 Item 值

前言

最近在項目中開始使用 Databinding,其中有一個需求是實現(xiàn)一個 Spinner 列表。發(fā)現(xiàn)網(wǎng)上大部分的例子都是通過 @BindingAdapter 的方式去獲取 Item 被選中的值,這樣處理起來比較麻煩。下面介紹一種簡單的方式,筆者在項目中使用了 LiveDataViewModel,以下基于此實現(xiàn)。

實現(xiàn)

首先添加 LiveDataViewModel 的依賴:

  implementation 'android.arch.lifecycle:extensions:1.1.1'
  1. 新建 SpinnerViewModel 類,來存儲 UI 相關的數(shù)據(jù)
class SpinnerViewModel : ViewModel() {

    // Spinner Adapter 需要的數(shù)據(jù)源
    val items = arrayListOf("蒼井空", "波多野結衣", "武藤蘭", "瀧澤蘿拉")

    //  條目選中的位置
    val itemPosition = MutableLiveData<Int>()

    // 選擇的條目
    private val selectItem
        get() = itemPosition.value?.let {
            items.get(it)
        }

    fun choose() {
        println("選擇的是: $selectItem")
    }
}
  1. xml 中進行綁定
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools">

    <data>

        <variable
                name="viewModel"
                type="com.i3kmsteady.databindingsample.ui.SpinnerViewModel"/>
    </data>

    <android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:padding="10dp"
            tools:context=".ui.SpinnerActivity">

        <android.support.v7.widget.AppCompatTextView
                android:id="@+id/tvName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/familiar_with"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintTop_toTopOf="parent"/>

        <android.support.v7.widget.AppCompatSpinner
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20dp"
                android:entries="@{ viewModel.items }"
                android:selectedItemPosition="@={ viewModel.itemPosition }" // 雙向綁定 @=
                app:layout_constraintLeft_toRightOf="@id/tvName"
                app:layout_constraintRight_toRightOf="parent"/>

        <Button
                android:id="@+id/btnChoose"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/your_choose"
                android:onClick="@{ () -> viewModel.choose()}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"/>

    </android.support.constraint.ConstraintLayout>
</layout>
  1. Activity 中建立聯(lián)系
class SpinnerActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_spinner)
        val viewModel = ViewModelProviders
            .of(this)
            .get(SpinnerViewModel::class.java)
        val binding: ActivitySpinnerBinding = DataBindingUtil.setContentView(this, R.layout.activity_spinner)
        binding.let {
            it.viewModel = viewModel
            it.setLifecycleOwner(this)
        }
    }
}

這樣在我們點擊按鈕的時候,就可以獲取到 Item 的值。以上代碼托管在 GitHub。

結語

實現(xiàn)特別簡單,主要是利用了 Databindig 雙向綁定的特性。在此也特別感謝 卻把清梅嗅 的指導。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容