2017-12-29 71 views
5

私はLiveDataでAndroid MVVMアーキテクチャを使用しています。私はこのオブジェクトフィールドでのLiveDataの更新

public class User { 
    private String firstName; 
    private String lastName; 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
} 

のような物を持っており、私の見解モデルは、ユーザーオブジェクトに提出された一部のオブザーバーが通知を受ける変更したときに、私は確認することができますどのようにこの

public class InfoViewModel extends AndroidViewModel { 
    MutableLiveData<User> user = new MutableLiveData<>(); 

    public InfoViewModel(@NonNull Application application) { 
     super(application); 
     User user = new User(); 
     user.setFirstName("Alireza"); 
     user.setLastName("Ahmadi"); 

     this.user.setValue(user); 
    } 

    public LiveData<User> getUser(){ 
     return user; 
    } 

    public void change(){ 
     user.getValue().setFirstName(user.getValue().getFirstName() + " A "); 
    } 
} 

のように見えますか?私のViewModelでは、このデータを別のオブジェクトに保存し、Stringのようなプライマリ値を使用しないことが重要です。

答えて

3

私はこのためにアンドロイドが推奨するような任意のベストプラクティスがあるとは思わないを持つべきオブジェクトから一つだけのフィールドを更新する代わりに、オブジェクト全体を更新します。私はより清潔な&の定型コードを使用しない方法を使用することをお勧めします。

あなたは、以下の方法で行くことができLiveDataと一緒に結合アンドロイドのデータを使用している場合:

あなたのPOJOオブジェクトはあなたがすでにどのクラスを持つことになる。この

public class User extends BaseObservable { 
    private String firstName; 
    private String lastName; 

    @Bindable 
    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
     notifyPropertyChanged(BR.firstName); 
    } 

    @Bindable 
    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
     notifyPropertyChanged(BR.lastName); 
    } 
} 

のようになります。プロパティが変更されるたびに通知します。したがって、MutableLiveDataのこのプロパティ変更コールバックを使用して、オブザーバに通知することができます。あなたは、あなたがする必要があるすべてはあなたが両方のビュー& LiveDataを通知することができ

public class InfoViewModel extends AndroidViewModel { 

    CustomMutableLiveData<User> user = new CustomMutableLiveData<>(); 
----- 
----- 

だから、これを行うことによって、あなたのビューモデルに代わりMutableLiveDataのこのCustomMutableLiveDataを使用しているそして、この

public class CustomMutableLiveData<T extends BaseObservable> 
     extends MutableLiveData<T> { 


    @Override 
    public void setValue(T value) { 
     super.setValue(value); 

     //listen to property changes 
     value.addOnPropertyChangedCallback(callback); 
    } 

    Observable.OnPropertyChangedCallback callback = new Observable.OnPropertyChangedCallback() { 
     @Override 
     public void onPropertyChanged(Observable sender, int propertyId) { 

      //Trigger LiveData observer on change of any property in object 
      setValue(getValue()); 

     } 
    }; 


} 

のカスタムMutableLiveDataを作成することができます既存のコードをほとんど変更していないオブザーバー。希望があれば

0

あなたのご意見は、setValueをご利用ください。 user.getValue().setFirstName(user.getValue().getFirstName() + " A ");あなたのオブザーバーは通知されません!

ビューモデル

public MutableLiveData<User> getUser() { 
    return user; 
} 

アクティビティ/フラグメント

mModel = ViewModelProviders.of(this).get(InfoViewModel.class); 
mModel.getUser().observe(this, s -> { 
    // User has been modified 
}); 

どこかにあなたの活動/フラグメント

でこれはオブザーバートリガーされます:あなたWA場合

mModel.getUser().setValue(user); 

をNTあなたが倍数MutableLiveData<String>

// View Model 
private MutableLiveData<String>   firstName; 
private MutableLiveData<String>   lastName; 

//Somewhere in your code 
mModel.getFirstName().setValue(user.getValue().getFirstName() + " A "); 
mModel.getFirstName().observe(this, s -> { 
    // Firstname has been modified 
}); 
関連する問題