onGeoQueryReady 时通知数据集更改为适配器的条件

Condition to notifyDataSetChanged to adapter when onGeoQueryReady

关于处理 geoQueries 和适配器时正确方法的一个小问题。

我在 GeoQuery 数据库中有一个用户键列表(明显有坐标),当他们进入某个范围时,我想在 ListView 中显示它们。

这是一些代码。

    usersGeoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {

        @Override
        public void onKeyEntered(String key, GeoLocation location) {

            firebaseDatabase.getReference("users").child(key).addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    User user = dataSnapshot.getValue(User.class);
                    users.add(user);
                    // if ( ??? ) 
                    mAdapter.notifyDataSetChanged();
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }

        @Override
        public void onKeyExited(String key) {
            for(Iterator<User> it = users.iterator(); it.hasNext();){
                User user = it.next();
                if(user.id == key){
                    it.remove();
                }
            }
            // if ( ??? )
            mAdapter.notifyDataSetChanged();
        }

        @Override
        public void onKeyMoved(String key, GeoLocation location) { }

        @Override
        public void onGeoQueryReady() { 
            // this actually triggers before firebase listeners
        }

        @Override
        public void onGeoQueryError(DatabaseError error) {
        }
    });

实际上,这可行,但是,当然,每次将条目添加到列表时,它都会通知对适配器的更改。所以这对性能不利。

对此有什么明智的建议吗?

谢谢!

典型的方法是对未决项目进行计数。因此,每次获得新密钥时,都会增加计数器。每次拿到对应的数据,就递减。一旦计数器为 0 并且 onGeoQueryReady 被触发,您就知道您已经获得了所有初始项目。