java - 根据位置条件创建Adapter

标签 java android firebase google-cloud-firestore android-adapter

我正在尝试做如下事情:

enter image description here

我有一个应用程序,并且我知道我的位置(例如,假设它是 4 号)。我也有一个定义的半径。我喜欢它在 map 下方的适配器中显示半径内的所有结果(例如,它应该只显示 1 和 5 - 4 是我的位置,所以我不需要它显示)。

现在,我尝试显示的数字是我的 Cloud Firestore 数据库中的用户。为了在 map 上显示它们,我需要执行查询来检查某些条件,然后检查它们是否在定义的半径内。如果它们都满足条件并且在半径内,我希望将它们添加到适配器中。

我使用以下代码来实现它:

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)由于我需要检查每个查询的距离,因此我需要将其一一添加到我的适配器中。这导致我无法将所有结果保存在某个数组中,然后插入到适配器(由于异步任务void类)。

2) 我需要使用其中的变量 (UserID,distance) 创建适配器 MapPersonAdapter,因为在我需要使用的适配器的 viewHolder 内:

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

定义于:

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;
}

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

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

有没有办法创建这样一个适配器,在 for 循环内调用并保存所有结果? (请记住,它是在异步任务内部,在查询之外获取结果非常复杂)。

谢谢

最佳答案

I had liked it to show in an adapter below the map all the results that are inside the radius (for example it should show only 1 and 5 - 4 is my location so I don't need it to show).

目前无法使用地理位置查询 Cloud Firestore 数据库。 Firestore 不支持 GeoPoint 查询。解决这个问题的唯一方法是使用 geohashes 。还有一个非常有用的video Frank van Puffelen 详细解释了同一主题。

除此之外,如果您使用的是 Android,还有一个名为 GeoFirestore library for Android 的库这可以帮助您获取特定半径内的附近位置。

此外,Firebase API 是异步的,因此您无法将从数据库获取的数据作为方法的结果返回。解决此问题的一个快速解决方案是仅在 onComplete() 方法中使用 personname 的值,否则我建议您查看我的答案的最后部分<强> post 其中我解释了如何使用自定义回调来完成它。您还可以看看这个video 为了更好地理解。

关于java - 根据位置条件创建Adapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58281097/

相关文章:

java - 如何通过 JDBC 使用包含问号 "?"的 PostgreSQL JSON(B) 运算符

java - 我在哪里可以找到 Eclipse 中的导入文件

java - java 中 Kotlin 中 <?,?> 的等价物是什么?

javascript - 在 Firebase 控制台中记录 JSON 对象

java - 整数链表的链表,Java。

java - EclipseLink JPA 跟踪更改

调用 takeTurn() 的 Android TurnBase Multiplayer 不会生成 onTurnBasedMatch Received()

android - MediaPlayer 视频大小代号?

java - 收到 fcm 通知时更新回收器 View

firebase - 可以以相反的顺序遍历 Firebase 节点的子节点吗?