Ваш гео-запрос правильно ищет ключи в пределах 3 километров от заданного местоположения:
firebaseDatabase=FirebaseDatabase.getInstance().getReference("Users");
GeoFire geoFire=new GeoFire(firebaseDatabase.child("locals"));
final GeoQuery geoQuery=geoFire.queryAtLocation(new GeoLocation(latitude,longitude),3);
Но затем, когда GeoFire находит ключ в этом диапазоне и вызывает onKeyEntered
, вы добавляете ValueEventListener
к весь узел Users
:
geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
@Override
public void onKeyEntered(final String key, GeoLocation location) {
firebaseDatabase.addValueEventListener(new ValueEventListener() {
Таким образом, для каждого ключа в пределах диапазона геоквери вы загружаете всех пользователей. Если в диапазоне несколько ключей, вы загружаете всех пользователей для каждого ключа и каждый раз создаете адаптер. В лучшем случае это грязно и расточительно, но я думаю, что в этом случае и ваш код не выполняет то, что вы хотите.
Лучше всего предположить, что каждый ключ в гео-запросе идентифицирует узел в Users
, и вы хотите загружать этот пользовательский узел каждый раз, когда вызывается ваш метод onKeyEntered
. Таким образом, когда в пределах диапазона геоквери существует несколько ключей, вы загружаете каждого пользователя в этом диапазоне по одному.
Если это так, вам понадобится этот слушатель внутри onKeyEntered
:
firebaseDatabase.child(key).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Users my=dataSnapshot.getValue(My.class);
list.add(my);
adapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException(); // never ignore possible errors
}
});
Некоторые из изменений, которые я сделал здесь:
- Вместо загрузки всех пользователей, это загружает одного пользователя для каждого ключа, который находится (или входит) в диапазон геоквери.
- Используйте
addListenerForSingleValueEvent
вместо непрерывного слушателя. Таким образом, вы получаете данные для пользователя только один раз, вместо того, чтобы постоянно добавлять все больше и больше слушателей. - Позвоните
adapter.notifyDataSetChanged();
вместо создания нового адаптера для каждого ключа, попадающего в диапазон геоквери.
Что вам еще нужно сделать:
- Инициализировать адаптер только один раз, за пределами
onKeyEntered
, передав ему list
.
Затем, когда срабатывает onKeyEntered
и вы загружаете данные этого пользователя, вы добавляете их в list
и сообщаете адаптеру, что ему нужно перекрасить с adapter.notifyDataSetChanged()
.