2017-02-22 4 views
1

Ich verwende eine Zwei-Wege-Datenbindung für eine Bearbeitungsaktivität. Ich versuche, das Kesseln zu vermeiden, und ich muss wissen, wann sich die Daten bei dieser Aktivität geändert haben. Ich habe einen TextWatcher für EditText erstellt, der perfekt funktioniert. Jetzt möchte ich dasselbe mit einem Spinner machen. So habe ich eine SpinnerWatcher Klasse erstellt, verweisen sie in meiner Modellansicht (POJO) und in meinem Layout. Alles kompiliert und läuft, aber ich bekomme nicht die erwarteten Ergebnisse. Die ZeileSpinner AdapterView.OnItemSelectedListener funktioniert nicht

hasDataChanged = true; 

wird nie ausgeführt. Ich möchte den SetOnItemSelectedListener in der Layoutdatei und der Logik im ViewModel angeben, nicht in der Aktivität.

Hier ist meine SpinnerWatcher Klasse:

public abstract class MySpinnerWatcher implements AdapterView.OnItemSelectedListener { 
@Override 
public void onItemSelected(AdapterView<?> parent, View v, int position, long id) { 
// TODO Auto-generated method stub 
} 
@Override 
public void onNothingSelected(AdapterView<?> arg0) { 
// TODO Auto-generated method stub 
} 
public abstract void onItemSelected(AdapterView newValue); 
} 

Hier ist meine Ansicht Modell:

public class Diver extends BaseObservable { 
... 
@Bindable 
public AdapterView.OnItemSelectedListener getOnSpinnerChanged() { 
    return new MySpinnerWatcher() { 
     @Override 
     public void onItemSelected(AdapterView newValue) { 
      // This never gets executed 
      hasDataChanged = true; 
     } 
    }; 
} 
} 

Hier mein Layout ist:

<android.support.v7.widget.AppCompatSpinner 
android:id="@+id/spinnerGender" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:entries="@array/gender_arrays" 
android:prompt="@string/gender_prompt" 
app:setOnItemSelectedListener="@{diverdb.getOnSpinnerChanged}" 
style="@style/Widget.AppCompat.Spinner.Underlined"/> 

Jede Idee, wie man das Feuer onItemSelected() wenn der Wert im Spinner geändert wird?

Antwort

1

konnte ich meinen Code beheben.

Hier ist mein Spinner Watcher Klasse:

public class MySpinnerWatcher implements AdapterView.OnItemSelectedListener { 
@Override 
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
    // TODO Auto-generated method stub 
} 

@Override 
public void onNothingSelected(AdapterView<?> arg0) { 
    // TODO Auto-generated method stub 
} 

}

Hier ist meine Ansicht Modell:

<fr.ganfra.materialspinner.MaterialSpinner 
       android:id="@+id/spinnerDiveType" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:selectedItemPosition="@={dive.diveTypePosition}" 
       app:ms_floatingLabelColor="@color/blue" 
       app:ms_multiline="true" 
       app:ms_enableFloatingLabel="true" 
       app:ms_enableErrorLabel="false" 
       app:ms_floatingLabelText="Dive Type" 
       app:ms_hint="Dive Type" 
       app:setOnItemSelectedListener="@{dive.getOnSpinnerChangedDiveType}" 
       app:adapter="@{dive.AdapterDiveType}" 
       /> 
:

@Bindable 
public AdapterView.OnItemSelectedListener getOnSpinnerChangedDiveType() { 
    return new MySpinnerWatcher() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View v, int position, long id) { 
      super.onItemSelected(parent, v, position, id); 
      // The Hint is in the list at item 0 
      if (position != 0 && position + 1 != mDiveTypePosition){ 
       mHasDataChanged = true; 
       // The Hint is in the list at item 0 
       DiveType diveType = (DiveType) parent.getAdapter().getItem(position + 1); 
       mDiveType = diveType.getDiveType(); 
      } 
     } 
    }; 
} 

Und hier mein Plan ist

Verwandte Themen