链式多变换.switchMap关闭一个LiveData源。

问题描述 投票:0回答:1

我正在学习Android的学校项目,我们必须使用Java,不能使用任何外部库。我正在创建一个大学生课程负担跟踪应用。目前,我正在做的活动将详细记录一个 Course 由用户选择。我需要在用户选择了一个或多个数据库结果时,能够获取多个数据库结果。Course签名: Mentor (教官),a LiveData ListAssessments,和a LiveData ListNotes. 我目前有一个 Transformations.switchMap 设,并努力使 Course Mentor. 然而,似乎 LiveData 只能有一个这样的变换观察者。这是我的代码。

CourseDetailViewModel

LiveData<Course> currentCourse;
LiveData<Mentor> courseMentor;
LiveData<List<Assessment>> courseAssessments;
LiveData<List<Note>> courseNotes;
final CourseDetailRepository REPO;

public CourseDetailViewModel(@NonNull Application application) {

    REPO = new CourseDetailRepository(application);
}

public LiveData<Course> getCurrentCourse(long id) {

    if (currentCourse == null) {
        currentCourse = REPO.getCourseById(id);
    }

    // I'm dong the Transformations here because I tried in the Constructor but because currentCourse
    // was null, the transformation wasn't kicking off.
    // the courseMentor Transformation works, the others don't seem to fire.
    courseMentor = Transformations.switchMap(curentCourse, course -> 
        REPO.getMentorById(course.getMentorId()));

    courseAssessments = Transformations.switchMap(currentCourse, course -> 
        REPO.getAssessmentsByCourse(course.getCourseId()));

    courseNotes = Transformations.switchMap(currentCourse, course -> 
        REPO.getNotesByCourse(course.getCourseId())));

    return this.currentCourse;
}

public LiveData<Mentor> getCourseMentor() { return this.courseMentor }

public LiveData<List<Assessment>> getCourseAssessments() { return this.courseAssessments }

public LiveData<List<Note>> getCourseNotes() { return this.courseNotes }

然后我观察到这些 LiveData 我的 CourseDetailActivity 来填充用户界面。Mentor 填充一个设置选择一个 Spinner, List<Assessment>List<Note> 传入各自的 RecyclerView Adapters.

我有一种感觉,我可以用这样的东西 MediatorLiveData 但是,我真的不完全了解如何正确使用它,即使在网上查阅了很多资源。我是Android新手,这是我的第一个Android项目,所以我知道我有很多东西要学,我完全愿意接受对设计决策的批评。

非常感谢你的帮助!

java android transformation android-livedata switchmap
1个回答
0
投票

好了,我能够弄明白了! 通过添加一个 MutableLiveData<Long> 的ID,用来保存用于检索的 Course 的值,我可以从数据库中设置。getCourseById(long id) 触发了第一个 Transformations.switchMap 以获得 CURRENT_COURSE 衬托出其他 Transformations.switchMapCOURSE_MENTOR, COURSE_ASSESSMENTSCOURSE_NOTES.

有人曾在其他地方建议我把身份证通过 ViewModel Constructor 并使用自定义 ViewModelFactory这是我将来会考虑的事情。现在,我需要把这个提交;)。)

我希望这能帮助别人

课程详情查看模型(CourseDetailViewModel)

final MutableLiveData<Long> CURRENT_COURSE_ID;
final LiveData<Course> CURRENT_COURSE;
final LiveData<Mentor> COURSE_MENTOR;
final LiveData<List<Assessment>> COURSE_ASSESSMENTS;
final LiveData<List<Note>> COURSE_NOTES;
final CourseDetailRepository REPO;

public CourseDetailViewModel(@NonNull Application application) {

    REPO = new CourseDetailRepository(application);

    CURRENT_COURSE_ID = new MutableLiveData<>();

    CURRENT_COURSE = Transformations.switchMap(CURRENT_COURSE_ID, 
        COURSE_ID -> REPO.getCourseById(COURSE_ID));

    COURSE_MENTOR = Transformations.switchMap(CURRENT_COURSE, 
        COURSE -> REPO.getMentorById(COURSE.getMentorId()));

    COURSE_ASSESSMENTS = Transformations.switchMap(CURRENT_COURSE, 
        COURSE -> REPO.getAssessmentsByCourse(COURSE.getCourseId()));

    COURSE_NOTES = Transformations.switchMap(CURRENT_COURSE, 
        COURSE -> REPO.getNotesByCourse(COURSE.getCourseId())));
}

public LiveData<Course> getCurrentCourse(long id) {
    CURRENT_COURSE_ID.setValue(id);
    return this.CURRENT_COURSE;
}

public LiveData<Mentor> getCourseMentor() { return this.COURSE_MENTOR}

public LiveData<List<Assessment>> getCourseAssessments() { return this.COURSE_ASSESSMENTS}

public LiveData<List<Note>> getCourseNotes() { return this.COURSE_NOTES}
© www.soinside.com 2019 - 2024. All rights reserved.