【问题标题】:How to bind Spinner data using view model (DataBinding)如何使用视图模型绑定 Spinner 数据(DataBinding)
【发布时间】:2020-04-17 04:10:46
【问题描述】:

我是数据绑定的初学者。我正在尝试使用数据绑定从我的视图模型中获取微调器项目,并在 android:entries 中设置值,但问题是我的微调器没有显示项目。

这是我的布局

<layout>
<data>

<import type="com.saddan.sanidadvegetalsyscomed.viewmodel.TableDataViewModel"/>

<variable
   name="model"
   type="TableDataViewModel" />

  </data>

  <androidx.constraintlayout.widget.ConstraintLayout xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="#ffffff"
android:layout_margin="20dp"
android:padding="5dp"
tools:context=".Fragment.First_Form_Fragment">


<Spinner
    style="@android:style/Widget.TextView.SpinnerItem"
    android:id="@+id/ext_tipo_inspection"
    android:layout_width="320dp"
    android:layout_height="@dimen/EditTextFieldHeight"
    android:entries="@{model.spinerInspecion}"
    />

</androidx.constraintlayout.widget.ConstraintLayout>

</layout>

这是我的视图模型类

public class TableDataViewModel extends AndroidViewModel
{

private String TAG=getClass().getSimpleName();
private UserAccessToken userAccessToken;
private SanidadDAO sanidadDAO;
private Context context;
private LiveData<List<String>> spinnerItem;
private LiveData<List<String>> spinerInspecion;


public TableDataViewModel(@NonNull Application application)
{
    super(application);
    userAccessToken=new UserAccessToken(application);
    SanidadVegetalDatabase database = SanidadVegetalDatabase.getDatabase(application);
    sanidadDAO = database.getDao();
    context=application;
    spinerInspecion=getmCommonData("tipoinspeccion");
    if(spinerInspecion!=null)
    {
        Log.d(TAG, "TableDataViewModel: yrs");
    }

}

public LiveData<List<String>> getmCommonData(String queryType)
{
    spinnerItem=sanidadDAO.getType(queryType);

    //Toast.makeText(context, ""+mCommonData, Toast.LENGTH_SHORT).show();

    return spinnerItem;
}


public LiveData<List<String>> getSpinerInspecion()
{

    return spinerInspecion;
}

public void setSpinerInspecion(LiveData<List<String>> spinerInspecion)
{
    this.spinerInspecion = spinerInspecion;
}

@Override
protected void onCleared()
{
    super.onCleared();
}
 }

这是我初始化绑定的 Fragment 的 onViewCreated 方法

tableDataViewModel= new ViewModelProvider(getActivityNonNull()).get(TableDataViewModel.class);
binding.setModel(tableDataViewModel);

【问题讨论】:

    标签: android data-binding spinner viewmodel


    【解决方案1】:

    这里的问题是您没有为spinerInspecion 设置值,而是为它分配了一个新的LiveData。这就是为什么观察者永远不会在实例上被调用的原因。将您的方法修改为:-

    public List<String> getmCommonData(String queryType) {
        spinnerItem=sanidadDAO.getType(queryType);
        return spinnerItem;
    }
    

    然后将值设置为:-

    spinerInspecion.setValue(getmCommonData("tipoinspeccion"));
    

    【讨论】:

    • 我无法启动 spinerInspecion.value 并显示无法解析值。在我看来,它适用于 kotlin。java 的任何替代方案?
    • 是的,我的错..对不起,我正在更新我的答案。使用更新的答案..
    猜你喜欢
    • 2015-02-18
    • 1970-01-01
    • 2021-11-07
    • 2013-09-25
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多