I am trying retrieve only the list of users who are within 3 miles of current users location. I am using a recyclerView to list the users, I am also using geofire to query the keys and I'm using firebase to store my users. When I try to retrieve only the list of users who are within 3 miles,it gives me all of the users including the ones who aren't within 3 miles. Can someone please help me fix this. Below is my code. Thanks in advance
MainClass To retrieve data
@Override
public void onSuccess(Location location) {
Double latitude=location.getLatitude();
Double longitude=location.getLongitude();
Geocoder geocoder=new Geocoder(NewsFeedActivity.this, Locale.getDefault());
firebaseDatabase=FirebaseDatabase.getInstance().getReference("Users");
GeoFire geoFire=new GeoFire(firebaseDatabase.child("locals"));
final GeoQuery geoQuery=geoFire.queryAtLocation(new GeoLocation(latitude,longitude),3);
geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
@Override
public void onKeyEntered(final String key, GeoLocation location) {
firebaseDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
list=new ArrayList<Users>();
for(DataSnapshot dataSnapshot1:dataSnapshot.getChildren()){
Users my=dataSnapshot1.getValue(My.class);
list.add(my);
}
adapter=new MyAdapter(MainActivity.this,list);
recycler.setAdapter(adapter);
adapter=new MyAdapter(MainActivity.this,list);
recycler.setAdapter(adapter);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
@Override
public void onKeyExited(String key) {
}
@Override
public void onKeyMoved(String key, GeoLocation location) {
}
@Override
public void onGeoQueryReady() {
}
@Override
public void onGeoQueryError(DatabaseError error) {
System.err.println("There was an error with this query: " + error);
}
});
Adapter class for the recyclerView
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
Context context;
private ArrayList<UserInformation> users;
public MyAdapter(Context c,ArrayList<UserInformation> u){
context=c;
users=u;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.cardview,parent,false));
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.user_name.setText(users.get(position).getBusinessname());
holder.address.setText(users.get(position).getAddress());
}
@Override
public int getItemCount() {
return users.size();
}
class MyViewHolder extends RecyclerView.ViewHolder{
TextView user_name,address;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
user_name=(TextView)itemView.findViewById(R.id.user_name);
address=(TextView)itemView.findViewById(R.id.user_address);
}
}
}
//Users Class
public class Users {
public String usersname;
public String address;
public String phonenumber;
public Users(String usersname, String address, String phonenumber) {
this.usersname = usersname;
this.address = address;
this.phonenumber = phonenumber;
}
public Users(){
}
public String getBusinessname() {
return usersname;
}
public void setBusinessname(String businessname) {
this.usersname = usersname;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhonenumber() {
return phonenumber;
}
public void setPhonenumber(String phonenumber) {
this.phonenumber = phonenumber;
}
}
I solved it with the Help of answers from Frank Van Puffelen. Here's what I did
public void onKeyEntered(final String key, GeoLocation location) {
firebaseDatabase.child(key).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Users my=dataSnapshot.getValue(Users.class);
list.add(my);
adapter=new MyAdapter(MainActivity.this,list);
recycler.setAdapter(adapter);
}