title: Android BindingAdapter order of execution?
body: <p>I need to understand how the Data Binding Library determine the order of execution for its BindingAdapters. If I have two BindingAdapters for a View and if the View has both the attributes corresponding to those BindingAdapters, how will it determine which adapter will be executed first? I ask because the order of execution matters in my case.</p>
  
  <p>I have the following BindingAdapter/s:</p>
  
  <pre><code>public class SpinnerBindingAdapter {
  
      @BindingAdapter(value = {"entries"})
      public static void setEntries(Spinner spinner, List&lt;? extends SpinnerItem&gt; spinnerItems) {
  
          for (int i = 0; i &lt; spinnerItems.size(); i++) {
              spinnerItems.get(i).setIndex(i);
          }
          ArrayAdapter&lt;? extends SpinnerItem&gt; adapter =
                  new ArrayAdapter&lt;&gt;(spinner.getContext(), R.layout.spinner_item, spinnerItems);
          spinner.setAdapter(adapter);
      }
  
      @InverseBindingAdapter(attribute = "selectedItem", event = "selectedItemAttrChanged")
      public static Object getSelectedItem(Spinner spinner) {
  
          Object selectedItem = spinner.getSelectedItem();
  
          return selectedItem;
      }
  
      @BindingAdapter(value = {"selectedItem"})
      public static void setSelectedItem(Spinner spinner, SpinnerItem spinnerItem) {
          if (spinner.getAdapter() == null) {
              return;
          }
          // Other code omitted for simplicity
      }
  
      @BindingAdapter(value = {"selectedItemAttrChanged"}, requireAll = false)
      public static void setOnItemSelectedListener(Spinner spinner, final InverseBindingListener selectedItemChange) {
          if (selectedItemChange == null) {
              spinner.setOnItemSelectedListener(null);
          } else {
              spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
  
                  @Override
                  public void onItemSelected(AdapterView&lt;?&gt; parent, View view, int position, long id) {
                      selectedItemChange.onChange();
                  }
  
                  @Override
                  public void onNothingSelected(AdapterView&lt;?&gt; parent) {
  
                  }
              });
          }
      }
  }
  </code></pre>
  
  <p>And here is how I populate the Spinner and set the selection:</p>
  
  <pre><code>&lt;Spinner
      android:id="@+id/spinner_system_activity_edit_tracker_unit"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="fill_horizontal"
      app:entries="@{DatabaseModel.queryForAll()}"
      app:selectedItem="@={object.selectedItem}"/&gt;
  </code></pre>
  
  <p>DatabaseModel.queryForAll is a static method that queries the database and returns a list of objects which is then given to the BindingAdapter. The BindingAdapter takes this list, update each of its item with an index and set it as an adapter for the spinner.</p>
  
  <p>For whatever reason, the "setSelectedItem" BindingAdapter always gets called first. This is undesirable, because I need the entries to be initialised first. If its not initialised first then spinner.getAdapter() will be null when setSelectedItem is first called. Which means that previous saved selection will not be restored.</p>