Search code examples
androiddata-bindingspinnerviewmodel

How to bind Spinner data using view model (DataBinding)


I'm beginner to data binding.I'm trying to get spinner items from my view model using data binding and set the values in android:entries ,But the thing is my spinner didn't showing items.

Here is my layout

<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>

Here is my view model class

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();
}
 }

and here is my Fragment's onViewCreated method where I initialize the binding

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

Solution

  • Problem here is you are not setting value to spinerInspecion you are assigning it a new LiveData. This is why observer never get called on the instance. Modify your method as:-

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

    and then set value as :-

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