根据位置条件创建适配器

问题描述 投票:0回答:1

我正在尝试做以下事情:

enter image description here

我有一个应用程序,我知道我的位置(例如,示例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)由于我需要检查每个查询的距离,因此需要一个一个地添加到我的适配器中。结果导致我无法将所有结果保存在某个数组中,然后插入适配器(由于[C​​0]的void类)。

2)我需要使用其中的变量(async task)来制作适配器MapPersonAdapter,因为我需要使用适配器的UserID,distance

viewHolder

其中定义于:

viewHolder.tvPersonName.setText(person.getPersonName( personID )); 

这导致我必须在查询中初始化适配器。

这两个问题迫使我在查询本身内部初始化适配器,这最终导致了一个主要问题,因为适配器覆盖了视图(总是返回位置0),因此适配器仅显示最后一个结果。

是否有任何方法可以创建在for循环内调用并保存所有结果的适配器? (请记住,它在异步任务中,要在查询之外获取结果非常复杂)。

谢谢

java android firebase google-cloud-firestore android-adapter
1个回答
0
投票

我希望它在地图下方的适配器中显示半径范围内的所有结果(例如,它应该仅显示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以获得更好的理解。

© www.soinside.com 2019 - 2024. All rights reserved.