从一个 LiveData 源链接多个 Transformations.switchMap
Chaining Multiple Transformations.switchMap off of one LiveData source
我正在为学校项目学习 Android,我们必须使用 Java 并且不能使用任何外部库。我正在创建一个大学生课程负载跟踪应用程序。目前,我正在研究 activity,它将详细说明用户选择的 Course
的信息。当用户选择 Course
时,我需要能够获取多个数据库结果:Mentor
(讲师),LiveData
List
of Assessment
s,和 Note
的 LiveData
List
。我目前有一个 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 }
然后我观察 CourseDetailActivity
中的这些 LiveData
对象来填充 UI:Mentor
填充一组 Spinner
的选择,List<Assessment>
和 List<Note>
被传递到它们各自的 RecyclerView
Adapter
s.
我觉得我可以使用类似 MediatorLiveData
的东西,但是,我真的不完全理解如何正确使用它,即使在网上查阅了很多资源之后也是如此。我是 Android 的新手,这是我的第一个 Android 项目,所以我知道我有很多东西要学,而且我对设计决策的批评持开放态度。
非常感谢您的帮助!
好的,我想通了!通过添加一个 MutableLiveData<Long>
来保存用于从数据库中检索 Course
的 ID,我可以设置 getCourseById(long id)
中触发第一个 Transformations.switchMap
的值获得 CURRENT_COURSE
,这会引发 COURSE_MENTOR
、COURSE_ASSESSMENTS
和 COURSE_NOTES
.
的其他 Transformations.switchMap
有人在其他地方建议我通过 ViewModel
Constructor
传递 ID 并使用自定义 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}
我正在为学校项目学习 Android,我们必须使用 Java 并且不能使用任何外部库。我正在创建一个大学生课程负载跟踪应用程序。目前,我正在研究 activity,它将详细说明用户选择的 Course
的信息。当用户选择 Course
时,我需要能够获取多个数据库结果:Mentor
(讲师),LiveData
List
of Assessment
s,和 Note
的 LiveData
List
。我目前有一个 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 }
然后我观察 CourseDetailActivity
中的这些 LiveData
对象来填充 UI:Mentor
填充一组 Spinner
的选择,List<Assessment>
和 List<Note>
被传递到它们各自的 RecyclerView
Adapter
s.
我觉得我可以使用类似 MediatorLiveData
的东西,但是,我真的不完全理解如何正确使用它,即使在网上查阅了很多资源之后也是如此。我是 Android 的新手,这是我的第一个 Android 项目,所以我知道我有很多东西要学,而且我对设计决策的批评持开放态度。
非常感谢您的帮助!
好的,我想通了!通过添加一个 MutableLiveData<Long>
来保存用于从数据库中检索 Course
的 ID,我可以设置 getCourseById(long id)
中触发第一个 Transformations.switchMap
的值获得 CURRENT_COURSE
,这会引发 COURSE_MENTOR
、COURSE_ASSESSMENTS
和 COURSE_NOTES
.
Transformations.switchMap
有人在其他地方建议我通过 ViewModel
Constructor
传递 ID 并使用自定义 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}