Создание цепочки нескольких преобразований.switchMap из одного источника LiveData - PullRequest
0 голосов
/ 30 апреля 2020

Я изучаю Android для школьного проекта, мы должны использовать Java, и мы не можем использовать какие-либо внешние библиотеки. Я создаю приложение отслеживания загрузки курса студента колледжа. В настоящее время я работаю над действием, которое будет детализировать информацию для Course, выбранного пользователем. Мне нужно иметь возможность извлекать несколько результатов из базы данных, когда пользователь выбирает Course: Mentor (Инструктор), LiveData List из Assessment с и LiveData List из Note s. В настоящее время у меня есть 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 Adapter s.

У меня такое чувство, что я могу использовать что-то вроде MediatorLiveData, но я действительно не совсем понимаю, как чтобы правильно использовать его, даже после просмотра многих ресурсов в Интернете. Я новичок в Android, это мой самый первый Android проект, поэтому я знаю, что мне есть чему поучиться, и я полностью открыт для критики в отношении дизайнерских решений.

Большое спасибо за ваша помощь!

1 Ответ

0 голосов
/ 01 мая 2020

Хорошо, я смог это понять! Добавив MutableLiveData<Long> для хранения идентификатора, используемого для извлечения Course из базы данных, я могу установить значение из getCourseById(long id), которое запускает первый Transformations.switchMap, чтобы получить CURRENT_COURSE, который запускает другие Transformations.switchMap s для COURSE_MENTOR, COURSE_ASSESSMENTS и COURSE_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}
...