1

我正在研究如何更新一些现有代码以使用新的 Android LiveData 架构模式。希望代码示例是不言自明的,我正在努力让@IntDef / @Interface 与实时数据一起工作。我很高兴在 ViewModel 上为 SetAnsweredCorrectly、SetCheated 等创建方法,或者创建一个 MutableLiveData 属性并在代码中设置它,只是我正在努力了解如何使用除普通 Integer 之外的任何东西,它会丢失类型安全。

public class QuestionViewModel extends ViewModel {

    public static final int UNANSWERED = 0;
    public static final int ANSWERED_CORRECTLY = 1;
    public static final int ANSWERED_INCORRECTLY = 2;
    public static final int CHEATED = 3;

    @IntDef({UNANSWERED, ANSWERED_CORRECTLY, ANSWERED_INCORRECTLY, CHEATED})
    @Retention(RetentionPolicy.SOURCE)
    public @interface AnswerState{}

    private @AnswerState int answeredState;

    public Question()
    {
        this.setAnsweredState(UNANSWERED);
    }

    public @AnswerState int getAnsweredState() {
        return answeredState;
    }

    public void setAnsweredState(@AnswerState int answeredState) {
        this.answeredState = answeredState;
    }
4

2 回答 2

0

你可以这样做:
首先,你需要创建一个模型类,它的属性只能是你的状态。e.g.

class State(@AnswerState val state: Int)

之后,您可以创建LiveData刚刚创建的这种新类型的新对象。e.g.

private val _answerState = MutableLiveData(State(UNANSWERED))
val answerState: LiveData<State>
    get() = _answerState

每当您需要将值发布到时,LiveData您将执行以下操作

_answerState.postValue(State(ANSWERED_CORRECTLY))

要观察这些值,在您的Activity班级中,您将像这样注册观察者

viewModel.answerState.observe(this) {
    when (it.state) {
        // The compiler will suggest the remaining branches        
    }
}

之后点击点击,when编译alt + enter器会提示添加剩余的分支,即UNANSWERED, ANSWERED_CORRECTLY, ANSWERED_INCORRECTLY, CHEATED 在此处输入图像描述

就是这样 :) 编译器将为每个状态生成一个新分支,您可以相应地进行操作。

于 2021-12-12T07:52:05.953 回答
0

尝试这个:

ObservableField<AnswerState> observableAnswer = new ObservableField<>;
于 2018-10-16T12:40:09.523 回答