Как я уже упоминал в комментариях, уникального способа добиться этого не существует, но в идеале и очень конкретно для вашей проблемы с потоком Master / Detail, давайте проанализируем предоставленный по умолчанию пример:
ItemDetialActivity
обрабатывает создание и отображение фрагментов, FAB и действия меню. Обратите внимание, что с пользовательскими данными ничего не связано, только "системные" дескрипторы. Я, например, пытаюсь ограничить ответственность действий навигацией и вещами, которых действительно нельзя избежать, например, обработкой кнопок меню. Теперь ItemListActivity
, похоже, нарушает этот принцип, потому что заботится об отображении списка (примеры Google только создают путаницу -IMHO- между этим разделением задач), я бы создал отдельный фрагмент, содержащий RecyclerView
и его адаптер.
Теперь перейдем к мелочам. Вот скелет очень высокого уровня, я надеюсь, вы сможете его использовать. Проверьте это, внедрите и вернитесь, если возникнут вопросы:
public interface BaseView {
LifecycleOwner lifecycleOwner();
/* perform actions that affect a basic screen status, like hide/show progress bars and errors,
animate views, etc. */
}
public class BaseRepo {
// will contain LiveData instances which will postValues()
}
public class FooRepo extends BaseRepo {
/* will contain access to database and networking functions, either by creating instance methods
or enforcing with an interface, it's up to you. */
}
public class BaseModel<P extends BasePresenter> extends ViewModel {
protected final FooRepo fooRepo; // optional, can be on concretes
<T> void subscribe(LiveData<T> liveData, Observer<T> observer) {
liveData.observe(view.lifecycleOwner(), observer);
}
<T> void unsubscribe(LiveData<T> liveData, Observer<T> observer) {
if (liveData != null) {
liveData.removeObserver(observer);
}
}
...
}
public abstract class BasePresenter<M extends BaseModel, V extends BaseView> implements LifecycleObserver {
protected V view;
protected M model;
public void setModel(M model) {
this.model = model;
}
public final void attachView(V view, Lifecycle lifecycle) {
this.view = view;
lifecycle.addObserver(this);
}
public void setPresenter(P presenter) {
this.presenter = presenter;
this.presenter.setModel(this);
}
...
}
public abstract class BaseFragment implements BaseView {
/* generics is highly encouraged here, I've seen examples of both BasePresenter<P>
and BaseView<P> */
protected P presenter;
/* You should bind layers here, or in the concrete class,
either with Dagger, reflection, or some other way */
@Override
public LifecycleOwner lifecycleOwner() {
return this;
}
...
}
Теперь для каждого конкретного экрана вы должны создать презентатора, модель и фрагмент, производные от баз, и выполнить на них специфические особенности. Я надеюсь, что это помогает.
person
Chisko
schedule
18.06.2018