Я показываю маркеры в радиусе, основываясь на текущем местоположении пользователя, и я хотел бы загрузить предварительно установленное количество маркеров с сервера, когда я начинаю работу с фрагментом карт, и загружать больше по мере необходимости - в идеале загружать 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");
}
}
Так что в основном я хотел бы знать, существует ли стандартизированный способ загрузки большего количества маркеров карты с сервера с ограничением и смещением, как в обзоре переработчика.