Вот несколько комментариев по вашему коду:
1. Дочерние фрагменты связаны общим классом Model - это как раз и есть связность. В предолженном мной варианте, дочерние фрагменты совершенно независимы и могу находится в разных модулях.
2. У Вас ListFragment умеет только сообщать о том, что выбран элемент. Ему не надо надо уметь читать listId из ListViewModel. Это нарушение I из SOLID.
3. Из пункта 2 вытекает то же самое для ListViewModel - она может только писать в Model. Опять нарушается I из SOLID - чтение должно быть недоступно.
4. Тоже самое для DetailsViewModel, ей не нужно уметь изменять listId
5. DetailsViewModel подписывается на Model, но не отписывается. Т.к. жизненный цикл Model потенциально может быть шире, можно получить утечку.
6. DetailsFragment не отписывается от DetailsViewModel - может быть утечка
7. Оба фрагемента сразу добавляются в иерархию, хотя логичнее добавлять по мере надобности: выбрали элемент - открыли детали - нажали Назад - закрыли.
1. Нет, фрагменты знают только про свою view model, про собственно Model нет
2. Ок, уберем геттер из ListViewModel.listId property
3. см п. 2
4. А она и не меняет, ее лист ид проперть рид онли
5. Нуу, я ж не писал полноценное приложение, я знаю, что не отписывается. Реализовать это можно элементарно в fragment lifecycle. A так-то можно и полноценную message bus замутить
6. Почему? Время жизни DetailsViewModel равно жизни фрагмента, пока существует фрагмент, существует и она. Без фрагмента она не существует. Если фрагмент уничтожается, ну да, вью модель надо отписывать от событий модели. Но зачем фрагменту отписываться от вью модели?
7. Втыкать фрагмент в существующую иерархию View это сильно дольше, чем прятать его, если мне не изменяет память.
По поводу I из SOLID - а где вы там specific interfaces увидели-то? Это данные, при чем тут интерфейсы. Это I - оно про узкую специализацию именно интерфейцев, типа вместо одного ISaveLoadVerifyAndUpload должно быть 4