GoogleMaps使用rxJava和MVP

Stu*_*DTO 6 android google-maps rx-java dagger-2 android-mvp

我有一个应用程序,从现在开始我的api填充了一个列表.现在我正在检测onClick recyclerView,我想打开GoogleMaps一个标记,专注于我点击的项目(我有lat和long).有没有一个很好的方法用它的存储库,用例,模型等来做到这一点?

事情就是我在我的ModelView上有它的坐标,以及cat的类型,也就是id.

问题是我不知道要向其他活动发送什么,因为每次我进行api调用时数据都会发生变化,所以我不知道是否必须将它存储在任何地方,然后从listView显示数据然后创建一个刷新我可以从api重新启动数据的mapActivity上的按钮.

希望你能理解我的问题.

我正在关注的一个例子是:GitHub存储库这是我作为列表所拥有的,然后当点击一个项目时它应该打开地图.

编辑

当我点击列表中的某个项目时,我最终通过了列表(如果您有任何其他方式,请随时告诉我)

然后我创建了一个合同:

interface Presenter{
        fun onMapReady()
    }

    interface View{
        fun focusOnItem(latitude: Double, longitude: Double)
        fun putMarkers(mList)
    }
Run Code Online (Sandbox Code Playgroud)

然后我不知道rxJava我的演示者在哪里使用,因为我需要等到我为我的演示者设置视图和数据的东西,当我填满所有然后首先开始做putMarkers,然后focusOnItem,但我坚持这个.

所以我现在正在做的是从mapActivity我设置列表然后我想开始做这个工作.

TL; DR

从开始我有一个活动(从Github仓库几乎相同,然后我需要将列表传递给我的其他活动,我最终做了一个设置者到一个演示者,因为匕首不知道该列表所以,我的问题现在我如何用rxJava设置所有MVP来加载地图并在其上加载标记.它还应该缩放到点击的元素但我已经有了位置.

有了一个简单的伪如果你说服自己这样做我会接受你的答案是正确的,我只需要弄明白如何在rxJava中做到这一点.

Gak*_*ket 2

您不应该将大量数据从一个活动传递到另一个活动,因为您可以轻松达到它们之间可以传递的最大数据量。

相反,您应该更好地将数据保存在为一个活动分类的模型中(例如,包含列表的活动),然后仅将某些项目 ID 传递给另一个活动。第二个 Activity(更准确地说,它的演示者)应该获取 id 并从模型中查询所需的对象。

总的来说,调用链将如下所示:

  1. 具有项目列表的活动会在创建该项目时下载该项目。下载在调用 Interactor/UseCase 或直接存储库的 ItemsListPresenter 中启动。

  2. 使用存储库以某种方式缓存下载的项目。

  3. 下载的项目在视图中显示为列表(在我们的例子中为“活动”)。
  4. 当用户单击项目时,此单击将发送到 ItemsListPresenter,并发送一个调用以导航到 MapsView,并将所选项目 ID 作为参数传递。
  5. MapActivity被打开,传入的item id被获取。
  6. MapPresenter 在其构造函数(或 setter)中获取选定的 id
  7. MapPresenter 从模型中获取所有点(在我们的例子中使用 Interactor/UseCase 或直接存储库)并显示它们。
  8. MapPresenter 使视图聚焦于选定的点(该点通过其 id 从模型中获取)

结果,我们设法打开一个包含所有点的屏幕,并将重点关注用户选择的点。

您可以在这里找到一个基于 Clean Architecture 方法并使用 MVP 模式和 RxJava 2 创建的简单 Earthquakes 应用程序: https: //github.com/Gaket/Earthquakes

更新:

更准确地说,你可以这样做(伪代码):

class Presenter extends IPresenter {

   Model model;
   View view;
   List<Item> elements;
   Item selectedElement;

   void setSelectedItem(String id) {
      element = model.getElement(id);
   }

   void start() {
      // if you need to make an api call - do it here
      model.getElements().subscribe(elements -> this.elements = elements);
   }

   void onMapReady() {
      view.showElements(elements);
      view.focus(selectedElement);
   }
}

class MapActivity implements View {
    IPresenter presenter;

    void onCreate(...) {
        // start your map fragment
        String id = // get id from Intent
        presenter.setSelectedItem(id);
        presenter.start();
    }

    void putMarkers(List<Item> elements) {
        // put your markers as usual
    }

    void focusOnItem(Element element) {
        // and focus works the same. The only question is if you want to send an Element object here or particular coordinates. Both variants work.
    }

    @Override
    void onMapReady(GoogleMap map) {
         // save map
         presenter.onMapReady();
    }

}
Run Code Online (Sandbox Code Playgroud)