迫击炮:在一个活动中有几个相同视图的实例

时间:2014-10-20 21:29:22

标签: android mortar

是否可以在一个带有Mortar库的Activity中包含相同视图的几个实例? 在这种情况下如何初始化Activity的范围? 或者应该以某种方式为每个视图创建一个单独的范围?

我想要的是什么:

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

我已经尝试了,但我的演讲者onLoad / onSave都搞砸了。

1 个答案:

答案 0 :(得分:0)

没有必要为孩子设置子范围。或者,真的,这始终是一种优化。

演示者总是必须是一个单身人士,所以如果你需要同时有多个视图显示相同类型的Presenter,你需要做一些事情来为每个视图制作一个单例。例如。您可以拥有Presenter的基类并具有各个视图类型的子类,或者可以使用绑定注释(例如@Inject @TheBlueOne MyPresenter presenter;)。

如果您正在做一些更动态的事情,比如制作一个所有需要相同类型的演示者的子视图列表,您可以使父视图的演示者成为子演示者的工厂。一想法:

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;
  }
}