0

Mortar ライブラリを使用して、1 つのアクティビティ内に同じビューのインスタンスをいくつか持つことは可能ですか? この場合、アクティビティのスコープを初期化する方法は? または、ビューごとに別のスコープを作成する必要がありますか?

私が欲しいもの:

MyActivity - MyView (id:1) - MyView (id:2)

試してみましたが、Presenter の onLoad/onSave がすべてめちゃくちゃになってしまいました。

4

1 に答える 1

0

子のサブスコープを設定する必要はありません。または、実際には、それは常に最適化です。

プレゼンターは常にシングルトンである必要があるため、同じタイプのプレゼンターを一度に表示する複数のビューが必要な場合は、ビューごとにシングルトンを作成する必要があります。たとえば、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;
  }
}
于 2014-10-23T23:17:07.467 に答える