Mortar ライブラリを使用して、1 つのアクティビティ内に同じビューのインスタンスをいくつか持つことは可能ですか? この場合、アクティビティのスコープを初期化する方法は? または、ビューごとに別のスコープを作成する必要がありますか?
私が欲しいもの:
MyActivity - MyView (id:1) - MyView (id:2)
試してみましたが、Presenter の onLoad/onSave がすべてめちゃくちゃになってしまいました。
子のサブスコープを設定する必要はありません。または、実際には、それは常に最適化です。
プレゼンターは常にシングルトンである必要があるため、同じタイプのプレゼンターを一度に表示する複数のビューが必要な場合は、ビューごとにシングルトンを作成する必要があります。たとえば、Presenter の基本クラスを作成し、個々のビュー タイプのサブクラスを作成したり、バインディング アノテーションを使用したりできます (@Inject @TheBlueOne MyPresenter presenter; など)。
すべてが同じタイプのプレゼンターを必要とするサブビューのリストを作成するなど、より動的なことをしている場合は、親ビューのプレゼンターをサブプレゼンターのファクトリーにすることができます。1つの考え:
ParentView {
void addRow(int id) {
MyRowView newRow = new MyRowView(getContext(), presenter);
newRow.setId(id);
addChild(newRow);
}
}
ChildView {
final ParentPresenter parentPresenter;
ChildPresenter presenter;
public ChildView(Context context, ParentPresenter parentPresenter) {
super(context);
this.parentPresenter = parentPresenter;
}
protected void onAttachedToWindow() {
super.onAttachedToWindow();
presenter = parentPresenter.getChild(getId());
presenter.takeView(this);
}
protected void onDetachedFromWindow() {
presenter.dropView(this);
super.onDetachedFromWindow();
}
}
@Singleton
ParentPresenter {
final Map<Integer, ChildPresenter> childrens = new HashMap<>();
final Provider<ChildPresenter> childrensProvider;
@Inject
ParentPresenter(Provider<ChildPresenter> childrensProvider) {
this.childrensProvider = childrensProvider;
}
ChildPresenter getChild(int id) {
ChildPresenter child = childrens.get(id);
if (childPresenter == null) {
child = childrensProvider.get();
childrens.put(id, child);
}
return child;
}
}