2017-12-29 22 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 "); 
    } 
} 

처럼 보인다? BTW 나 별도의 개체 에이 데이터를 유지하고 내 ViewModel에서 문자열과 같은 기본 값을 사용하지 않는 것이 중요합니다.

답변

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 "); 귀하의 관찰자는 통보되지 않습니다!

mModel.getUser().setValue(user); 

당신이 WA 경우 : 이것은 관찰자를 트리거

보기 모델

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

활동/조각 활동에 어딘가에

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

/조각 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 
});