使用带有MVP的rxJava的GoogleMaps

时间:2018-10-28 14:52:48

标签: android google-maps rx-java dagger-2 android-mvp

我有一个应用程序,从现在起,我的api会列出一个列表。现在,我正在检测recyclerView上的onClick,并想打开一个GoogleMaps,其标记位于我单击的项目上(我有经度和纬度)。 是否有一个很好的方法可以使用它的存储库,用例,模型等?

问题是我在ModelView上的坐标是它的位置,猫的类型也是id。

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

希望您能理解我的问题。

我要遵循的一个示例是:GitHub repository这就是我作为列表所拥有的,然后在单击某个项目时应打开地图。

编辑

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

然后我创建了一个合同:

interface Presenter{
        fun onMapReady()
    }

    interface View{
        fun focusOnItem(latitude: Double, longitude: Double)
        fun putMarkers(mList)
    }

然后,我不知道在演示者上使用rxJava的地方,因为我需要等到为演示者设置诸如视图和数据之类的东西之后,当我填满所有内容之后,首先开始做putMarkers,然后focusOnItem,但我对此感到困惑。

所以我现在正在做的是来自mapActivity我设置了列表,然后我想开始做这项工作。

TL; DR

自开始以来,我有一个活动(与Github repo几乎是相同的,然后我需要将列表传递给其他活动,由于匕首不知道,所以我最终向主持人做了一个设置者该列表是这样,我现在的问题是如何使用rxJava设置所有MVP以加载地图并在其上加载标记。它还应该缩放到单击的元素,但是我已经有了位置。

使用简单的伪指令,如果您说服自己这样做,那么我会接受您的回答是正确的,我只需要弄清楚如何在rxJava中做到这一点即可。

2 个答案:

答案 0 :(得分:2)

您不应将大量数据从一个活动传递到另一个活动,因为您很容易达到它们之间可能传递的最大数据量。

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

总体而言,呼叫链如下所示:

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

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

  3. 下载的项目在“视图”中显示为列表(在我们的示例中为“活动”)。
  4. 当用户单击项目时,此单击将发送到ItemsListPresenter,然后发送一个调用以导航到MapsView,并将选定的项目ID作为参数传递。
  5. 打开MapActivity,获取传递的项目ID。
  6. MapPresenter在其构造函数(或设置器)中获得选定的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();
    }

}

答案 1 :(得分:0)

因此,我实际上不建议人们再用这种方式构建事物(我现在将适配器从视图中分离出来,并让主持人对两者进行协调),但是我的新样本是Kotlin + Coroutines,因此可能对您没有帮助你。

这里是旧的开源AlarmManager应用程序,希望可以至少演示您所寻找的内容。那时我还不是RxJava的专业人士,所以请注意,它可能不是针对错误处理和内存管理的最佳选择。

https://github.com/BracketCove/PosTrainer