我正在尝试做以下事情:
我有一个应用程序,我知道我的位置(例如,示例4。我也有定义的半径。我希望它在地图下方的适配器中显示半径范围内的所有结果(例如,它应该仅显示1和5-4是我的位置,因此我不需要显示它)。
现在,我试图显示的数字是我在Cloud Firestore数据库中拥有的用户。为了在地图上显示它们,我需要执行查询以检查某些条件,然后还要检查它们是否在定义的半径内。如果它们都具有条件并且在半径内,我希望将它们添加到适配器中。
我使用以下代码实现它:
db.collection("Users").document(document.getData().get( "UserID" ).toString()).collection( "Location" ).get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document2 : task.getResult()) {
Object BookLat = document2.getData().get( "Lat" );
Object BookLon = document2.getData().get( "Lon" );
float distance = CalculateDistance(Lat, Lon, BookLat, BookLon);
if (distance <=Radius){
MapPersonAdapter mapPersonAdapter = new MapPersonAdapter( LocationsActivity.this,document.getData().get( "UserID" ).toString(), distance );
lvPerson.setAdapter( mapPersonAdapter );
MapPerson mapPerson = MapPerson.Result(document.getData().get( "UserID" ).toString(), distance);
mapPersonAdapter.add( mapPerson );
mapPersonAdapter.notifyDataSetChanged();
}
}
} else {
Log.d("ERROR", "Error getting documents: ", task.getException());
}
}
});
这里是问题的开始。
1)由于我需要检查每个查询的距离,因此需要一个一个地添加到我的适配器中。结果导致我无法将所有结果保存在某个数组中,然后插入适配器(由于[C0]的void
类)。
2)我需要使用其中的变量(async task
)来制作适配器MapPersonAdapter,因为我需要使用适配器的UserID,distance
:
viewHolder
其中定义于:
viewHolder.tvPersonName.setText(person.getPersonName( personID ));
这导致我必须在查询中初始化适配器。
这两个问题迫使我在查询本身内部初始化适配器,这最终导致了一个主要问题,因为适配器覆盖了视图(总是返回位置0),因此适配器仅显示最后一个结果。
是否有任何方法可以创建在for循环内调用并保存所有结果的适配器? (请记住,它在异步任务中,要在查询之外获取结果非常复杂)。
谢谢
我希望它在地图下方的适配器中显示半径范围内的所有结果(例如,它应该仅显示1,而5-4是我的位置,因此不需要显示)。
当前,您无法使用地理位置查询Cloud Firestore数据库。 Firestore不支持GeoPoint查询。解决此问题的唯一方法是使用public static String getPersonName(String personID) {
// PART FOR DISPLAYING PROFILE NAME//
FirebaseFirestore db = FirebaseFirestore.getInstance();
CollectionReference username = db.collection( "Users" ).document(personID).collection( "UserData" );
username.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
personname = document.getString( "username" );
}
} else {
Log.d(TAG, "Error getting documents: ", task.getException());
}
}
});
return personname;
}
。还有一个非常有用的geohashes,Frank van Puffelen在其中详细解释了同一主题。
此外,如果您使用的是Android,还有一个名为video的库可以帮助您获取特定半径内的附近位置。
此外,Firebase API是异步的,因此您不能将从数据库获取的数据作为方法的重用而返回。快速解决此问题的方法是仅在GeoFirestore library for Android方法内使用personname
的值,否则,我建议您从onComplete()
看到我的anwser的最后一部分,其中我已经解释了如何使用自定义回调完成操作。您也可以查看此post以获得更好的理解。