【问题标题】:Filter geoFire queries by certain criteria before populating viewHolder in Android在 Android 中填充 viewHolder 之前,按特定条件过滤 geoFire 查询
【发布时间】:2017-07-20 23:07:30
【问题描述】:

我已成功实施 geoFire 以从用户区域内的主 firebase 节点获取条目的键。

然后我尝试将这些键存储在一个新的唯一节点中,以便以后使用它们来填充 viewHolder,因为这似乎是最佳实践。

问题是我不希望存储在唯一节点中的所有对象都实际填充 viewHolder;我只想要其中的一部分。

如果我在 populateViewHolder 方法中进行过滤,例如,

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    SwarmReport retrievedModel = dataSnapshot.getValue(SwarmReport.class);
    if(!retrievedModel.isClaimed()){
        viewHolder.bindSwarmReport(retrievedModel);
    }
}

我在 viewHolder 中得到一些空白的项目。

如果我尝试在设置 FirebaseAdapter 之前进行过滤,例如在我的 addGeoQueryEventListener 方法中,我必须添加一个 addListenerForSingleValueEvent 来检查我打算过滤的条件:

public void onKeyEntered(String key, GeoLocation location) {
    claimCheckKey = key;
    final DatabaseReference claimCheckRef = FirebaseDatabase.getInstance().getReference("all").child(key);
    claimCheckRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            SwarmReport claimCheckSwarmReport = dataSnapshot.getValue(SwarmReport.class);
            if (!claimCheckSwarmReport.isClaimed()){
                swarmReportIds.add(claimCheckKey);
            }
        }

似乎onGeoQueryReadyaddListenerForSingleValueEvent in onKeyEntered 完成之前执行。关于如何让onGeoQueryReady 等待所有 swarmReportIds.add(claimCheckKey) 完成的任何建议?

如果有帮助,这里是我的 firebase 结构的快照:

【问题讨论】:

  • 我能做些什么来澄清这个问题吗?
  • 您找到问题的答案了吗?

标签: android firebase firebase-realtime-database geofire event-listener


【解决方案1】:

我不太了解您要达到的目标,但我会猜测并说您不仅想要最接近的key,而且还想根据其他一些标准过滤最接近的key,例如,最近的餐厅然后价格,

我为实现此目的所做的解决方法(仍在寻找更好的选择)是在 onDatachange 方法内设置一个标志,我在 onKeyentered 方法内调用该标志,比较该节点内的条目,(为了我们会说价格)

更新

  @Override
        public void onKeyEntered(final String key, GeoLocation location) {
     final DatabaseReference db = FirebaseDatabase.getInstance().getReference("<your ref>"+key);
     db.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {


                    for (DataSnapshot ds : dataSnapshot.getChildren()) {


                        String dishPrice=ds.getValue(String.class);
                        int price=Integer.parseInt(dishPrice);



                            if (price<=12) {

                                isMatch=true;

                            }


                    }
                    if(isMatch){
                        getRestaurants(key);
                    }
                    isMatch=false;


                }

onDataChange 的每个循环之外,我设置为仅在函数为真时执行填充我的adapterarraylist 的函数

getRestaurants 方法

    private void getRestaurants(final String id) {

   final DatabaseReference temp=FirebaseDatabase.getInstance().getRef("<your 
 ref>"+id)
          temp.child(id).addListenerForSingleValueEvent(new 
          ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {


                    Restaurant restaurant = dataSnapshot.getValue(Restaurant.class);  
                    restaurant.setName(restaurant.getName());
                    restaurant.setImageUri(restaurant.getImageUri());
                    restaurant.setUid(id);


                    //add elemens to arraylist


                        resList.add(restaurant);
                        adapter.notifyDataSetChanged();


                }

另一个建议是在云上创建一个功能,(再次假设)在您的情况下,您所需要的只是监控“声明”的值是否发生变化,因此您可以设置onUpdateevent 触发器或和onWrite 并检查 onChanged() 中的值并获取当前值(真/假),然后您可以使用 geoFire 查询并获得用户的关闭并根据值更新他们的节点。

Event Triggers

Cloud Functions

【讨论】:

  • 非常感谢,@omar A.R!这给了我一个很好的线索!我可以看看你的 getRestaurants() 方法吗?
  • 实际上查看更多关于 onDatachange 方法的代码也会很有帮助!
  • 请原谅我有几个星期无法处理这个项目。我现在可以再次专注于它。我很困惑 resList 如何与适配器交互......适配器是否可以访问 resList?适配器是 FirebaseRecyclerAdapter 类型的吗??
  • 适配器的类型可以是 FirebaseRecyclerAdapter 或任何 Recyclerviewadapter 类
猜你喜欢
  • 2019-01-14
  • 2012-07-26
  • 2018-08-06
  • 1970-01-01
  • 2017-05-26
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
相关资源
最近更新 更多