遇到问题:
MVVM模式下需要用到ViewModel加载网络请求数据拿到数据,通过DataBinding绑定数据源到布局中,但当UI布局比较复杂时,需要抽出可复用的UI组件,使用<include>标签进行布局引入,进行ui优化。
但当需要填充同一viewModel的数据源时,如果两个布局同时引入该viewModel,并不能进行数据同步,反而是用了两个互不影响的viewModel数据源,无法进行数据共享。
解决方法:
实现思路:将主布局的viewModel传递给子布局,共用一个ViewModel实例对象。
<include layout="@layout/injuries_drug_view"
app:viewModelChild="@{viewModel}"/>
需要注意:
Activity对应的主layout文件中的viewModel对应需要被引入的文件的viewModel:activity_injuries_layout.xml
<data>
<variable
name="viewModel"
type="com.chiatai.iorder.module.breedmanagement.injuries.InjuriesViewModel" />
</data>
其中:app:viewModel对应布局injuries_drug_view引入的viewModel
<data>
<variable
name="viewModelChild"
type="com.chiatai.iorder.module.breedmanagement.injuries.InjuriesViewModel" />
</data>
app:viewModelChild = injuries_drug_view中引入的com.chiatai.iorder.module.breedmanagement.injuries.InjuriesViewModel的name
@{viewModel} 表明将Activity中的主layout的viewModel传递给子布局中的app:viewModel(name)。
实现目标
这样,在子布局中的ViewModel和主布局就能拿到同样的数据源,从而进行相关操作。例如:injuries_drug_view.xml中
<TextView
android:id="@+id/chooseUseDrug"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="12dp"
android:background="@drawable/shape_border_gray"
android:gravity="center_vertical"
android:paddingLeft="12dp"
android:text='@{!viewModel.isSelectedSymptomDesc?"请选择":viewModel.selectSymptomDesc.productName}'
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/useDrug"
app:layout_constraintTop_toTopOf="parent"
tools:text="请选择" />
网友评论