73

LiveData で Android MVVM アーキテクチャを使用しています。私はこのようなオブジェクトを持っています

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 で Strings のような主要な値を使用しないことが重要です。

4

7 に答える 7

4

redditから- @cedrickc の回答:

MutableLiveData に拡張関数を追加します。

fun <T> MutableLiveData<T>.modifyValue(transform: T.() -> T) {
   this.value = this.value?.run(transform)
}
于 2021-01-17T14:26:47.523 に答える
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
});

あなたのアクティビティ/フラグメントのどこかに

これにより、オブザーバーがトリガーされます。

mModel.getUser().setValue(user);

オブジェクト全体を更新するのではなく、オブジェクトから 1 つのフィールドのみを更新する場合は、複数のフィールドが必要です。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
});
于 2018-01-10T15:48:26.760 に答える