GoogleMaps с использованием rxJava с MVP - PullRequest
0 голосов
/ 28 октября 2018

У меня есть приложение, которое теперь у меня есть список, заполненный из моего API.Теперь я определяю onClick на recyclerView и хочу открыть GoogleMaps с маркером, сфокусированным на элементе, на который я нажал (у меня есть lat и long).Есть ли хороший подход для этого с его репозиторием, сценариями использования, моделью и т. Д.?

Дело в том, что у меня в ModelView есть координаты, где он находится, и тип cat, а также id.

Дело в том, что я не знаю, что отправить в другое действие, потому что каждый раз, когда я делаю вызов API, меняются данные, поэтому я не знаю, нужно ли мне его где-то хранить, а затем показывать данные изlistView, а затем создайте кнопку обновления на mapActivity, где я могу перезапустить данные из API.

Надеюсь, вы понимаете мою проблему.

Вот пример, которому я следую: GitHub репозиторий это то, что у меня есть в виде списка, затем при нажатии на элемент он должен открыть карту.

РЕДАКТИРОВАТЬ

В итоге я прошел список, когда я нажал наэлемент из списка (если у вас есть другой способ, пожалуйста, не стесняйтесь, сообщите мне)

Тогда я создал контракт, который это:

interface Presenter{
        fun onMapReady()
    }

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

Тогда я не знаю, где использовать rxJava на моем докладчике, потому чтоИспользование Мне нужно подождать, пока я не установлю вещи для своего докладчика, такие как представления и данные, и когда я заполнил все, затем сначала начал делать putMarkers, затем focusOnItem, но я застрял на этом.

Итак, что я сейчас делаю, так это от mapActivity. Я установил список и затем хочу начать работу.

TL; DR

С момента запуска Iбыло действие (это почти то же самое из Github репо , а затем мне нужно передать список к моей другой деятельности, я закончил делать сеттер для докладчика, потому что кинжал не знал об этом списке так,Теперь моя проблема заключается в том, как настроить все MVP с помощью rxJava для загрузки карты и загрузки на нее маркеров. Также следует увеличить масштаб до элемента, по которому щелкнули, но у меня уже есть местоположение.

С помощьюпросто псевдо, если вы убедите себя сделать это таким образом, я приму ваш ответ как правильный, мне просто нужно выяснить, как это сделать в rxJava.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Вы не должны передавать большие объемы данных из одного занятия в другое, так как вы можете легко достичь максимального количества, которое может быть передано между ними.

Вместо этого вам лучше сохранять данные в своей модели, классифицированнойдля одного действия (например, тот, который содержит список), а затем передать другой идентификатор только некоторый элемент.Второе действие (точнее, его ведущий) должно взять идентификатор и запросить требуемый объект из модели.

В целом цепочка вызовов будет выглядеть следующим образом:

  1. Деятельность со списком элементов загружает эти элементы при его создании.Загрузка инициируется в ItemsListPresenter, который вызывает Interactor / UseCase или непосредственно в репозиторий.

  2. Загруженные элементы каким-то образом кэшируются с использованием репозитория.

  3. загруженные элементы отображаются в виде списка в представлении (в нашем случае - Activity).
  4. Когда пользователь нажимает на элемент, этот щелчок отправляется в ItemsListPresenter, и он отправляет вызов для перехода в MapsView, передавая выбранный элемент.Идентификатор элемента в качестве параметра.
  5. Открывается MapActivity, берется переданный идентификатор элемента.
  6. MapPresenter получает выбранный идентификатор в своем конструкторе (или установщике)
  7. MapPresenter получает всеточки из модели (в нашем случае с использованием Interactor / UseCase или непосредственно из репозитория) и их отображение.
  8. MapPresenter позволяет сфокусироваться на выбранной точке (где точка берется из модели по ее идентификатору)

В результате нам удается открыть экран, который будет содержать все точки и будет сфокусирован на выбранном пользователем.

Здесь вы можете найти простое приложение Earthquakes, созданное на основе подхода «Чистая архитектура» и использующее шаблон MVP и RxJava 2: https://github.com/Gaket/Earthquakes

Upd:

Чтобы быть немного более точным, вы можете сделать это так (псевдокод):

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

}
0 голосов
/ 08 ноября 2018

Итак, я на самом деле не рекомендую, чтобы люди строили вещи таким образом (я теперь отсоединяю адаптер от вида, и координатор докладчика оба), но мои новые образцы - Kotlin + Coroutines, так что, вероятно, это не поможетyou.

Вот старое приложение AlarmManager с открытым исходным кодом, которое, мы надеемся, должно продемонстрировать хотя бы часть того, что вы ищете.В то время я не был профессионалом в RxJava, так что будьте осторожны, так как это может быть неоптимально для обработки ошибок и управления памятью.

https://github.com/BracketCove/PosTrainer

...