我有一个应用程序,从现在起,我的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我设置了列表,然后我想开始做这项工作。
自开始以来,我有一个活动(与Github repo几乎是相同的,然后我需要将列表传递给其他活动,由于匕首不知道,所以我最终向主持人做了一个设置者该列表是这样,我现在的问题是如何使用rxJava设置所有MVP以加载地图并在其上加载标记。它还应该缩放到单击的元素,但是我已经有了位置。
使用简单的伪指令,如果您说服自己这样做,那么我会接受您的回答是正确的,我只需要弄清楚如何在rxJava中做到这一点即可。
答案 0 :(得分:2)
您不应将大量数据从一个活动传递到另一个活动,因为您很容易达到它们之间可能传递的最大数据量。
相反,您最好将数据保存在针对一个活动分类的模型中(例如,一个包含列表的活动),然后仅将某些项目ID传递给另一个。第二个Activity(更准确地说,是它的演示者)应该获取ID并从模型中查询所需的对象。
总体而言,呼叫链如下所示:
带有项目列表的活动在创建时会下载该项目。下载是在ItemsListPresenter中启动的,它调用Interactor / UseCase或直接调用存储库。
使用存储库以某种方式缓存下载的项目。
因此,我们设法打开一个包含所有点的屏幕,并将其集中在用户选择的一个点上。
您可以在此处找到一个基于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的专业人士,所以请注意,它可能不是针对错误处理和内存管理的最佳选择。