在spinner
中,为了将其选择的选项实时更新到ViewModel
,可以这么做:
1. xml文件:
<data>
<variable
name="addPostViewModel"
type="com.grad.information.addpost.ViewModelAddPost" />
</data>
<Spinner
android:id="@+id/spinner_tag"
android:layout_width="@dimen/spinner_width"
android:layout_height="@dimen/spinner_height"
android:layout_toRightOf="@id/tv_post_tag"
android:layout_below="@id/post_content"
android:layout_marginTop="@dimen/image_text_margin"
android:entries="@array/spinner"
android:textSize="@dimen/add_content_textSize">
</Spinner>
xml
中的spinner
没有直接跟ViewModel
的某个字段关联
2. 在ViewModel类中
由于要把spinner
的数据实时更新到viewModel
,所以spinner
的OnItemSelectedListener
应该放到ViewModel
文件里。
public final AdapterView.OnItemSelectedListener mOnItemSelectedListener;
public ViewModelAddPost() {
mOnItemSelectedListener = new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String tag = parent.getItemAtPosition(position).toString();
mTag.postValue(tag);//更新选择选项到liveData
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
};
}
3. 在Activity中设置spinner的监听器
Spinner
设置监听器的操作一般在Activity
中,在这里我们可以设置它的监听器为ViewModel
类里实现好的mOnItemSelectedListener
private void initView(){
if(mModelAddPost == null){
mModelAddPost = new ViewModelAddPost();
mBinding.setAddPostViewModel(mModelAddPost);
//设置spinner的监听器为ViewModel中的那个监听器
mBinding.spinnerTag.setOnItemSelectedListener(mModelAddPost.mOnItemSelectedListener);
}
mBinding.setLifecycleOwner(this);
}