Загрузка маркеров карты с сервера с лимитом и смещением - PullRequest
0 голосов
/ 14 января 2019

Я показываю маркеры в радиусе, основываясь на текущем местоположении пользователя, и я хотел бы загрузить предварительно установленное количество маркеров с сервера, когда я начинаю работу с фрагментом карт, и загружать больше по мере необходимости - в идеале загружать 20 маркеров / места, когда приложение запускается, затем по команде пользователя загрузить 20 на 20 больше. Это должно быть сделано вместо того, чтобы возвращать все местоположения с сервера, что потенциально может замедлить работу приложения.

Я думал об использовании кластеризации маркеров или вызывал метод, когда пользователь проводит пальцем по карте или щелкает по ней, но я не уверен, является ли это идеальным решением.

В списках я могу легко сделать что-то вроде этого RecyclerView.OnScrollListener():

listView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        int visibleItemCount = mLayoutManager.getChildCount();
        int totalItemCount = mLayoutManager.getItemCount();
        int pastVisibleItems = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition();
        if (pastVisibleItems + visibleItemCount >= totalItemCount) {
                //End of list
                fetchAllLocations(locationForDate, latitude, longitude);
            }
        }
});

Пример выше довольно прост - я попадаю в конец списка, и метод вызывается снова, и он возвращает больше мест.

Мне не удалось найти какой-либо стандартизированный способ вызова метода load more для маркеров карты.

Я бы использовал LocationListSize, чтобы сохранить количество возвращаемых местоположений, и использовал бы это в методе карты, который возвращает местоположения:

void fetchAllLocations(String LocationForDate, String latitude, String longitude) {
    TokenManager tokenManager = TokenManager.getInstance(getContext().getSharedPreferences("prefs", MODE_PRIVATE));
    ApiInterface apiService = ApiClient.createServiceWithAuth(ApiInterface.class, tokenManager);
    CallLocationsFromSQLite(LocationForDate);

    SQLiteHandler db = new SQLiteHandler(Objects.requireNonNull(getActivity()).getApplicationContext());
    HashMap<String, String> settings = db.getSettings();
    String radius, receiveFrom;
    radius = settings.get("radius");
    receiveFrom = settings.get("invites_received_from");

    LocationListSize = LocationList.size();
    String offset = String.valueOf(LocationListSize);
    String count = String.valueOf(20);

    if (isNetworkAvailable()) {
        Call<LocationsResponse> call = apiService.getLocationsForConditions(LocationForDate, radius, latitude, longitude, receiveFrom, count, offset);
        call.enqueue(new Callback<LocationsResponse>() {
            @Override
            public void onResponse(Call<LocationsResponse> call, retrofit2.Response<LocationsResponse> response) {
                Log.d(TAG, "onResponse: " + response);

                if (response.isSuccessful()) {
                    List<Location> Locations = Objects.requireNonNull(response.body()).getResults();

                    if (Locations != null) {
                        for (Location Location : Locations) {
                            setMarker(Double.parseDouble(Location.getLat()), Double.parseDouble(Location.getLon()),
                                    Location.getId(), Location.getUserName(), Location.getDateTime());
                        }
                        // Adding number of locations retrieved to current count
                        Integer numberOfOhterLocations = Locations.size();
                        LocationListSize += numberOfOhterLocations;
                    }
                } else {
                    if (response.code() == 401) {

                        ApiError apiError = ErrorUtils.converErrors(response.errorBody());
                        Log.d(TAG, "There was an error: " + apiError);
                    } else {
                        Log.d(TAG, "There was an error: " + response);
                    }
                }
            }

            @Override
            public void onFailure(Call<LocationsResponse> call, Throwable t) {
                // Log error here since request failed
                Log.e(TAG, t.toString());
            }
        });
    } else {
        Log.e(TAG, "Network not available");
    }
}

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

...