for循环从firebase数据库返回错误的用户名但正确的坐标

时间:2017-09-23 07:34:05

标签: android firebase firebase-realtime-database

我使用列表视图从数据库中的tlocation节点显示教师,该教师与学生选择的主题相同。现在我在检索数据时遇到了问题,它给了我同一主题的2个用户坐标,但显示的名称相同。

这是我的数据库结构 enter image description here

这是我的代码

 scref = db.getReference("users");
 tref = db.getReference("tlocation");
 sref = db.getReference("slocation");

 ul.clear();

 scref.addValueEventListener(new ValueEventListener() {
 @Override
 public void onDataChange(DataSnapshot dataSnapshot) {

 ps = dataSnapshot.child(un).child("position").getValue().toString();

 if (ps.equalsIgnoreCase("student")){

 Query q = tref.orderByChild("subject").equalTo(ssubject);
 q.addValueEventListener(new ValueEventListener() {
           @Override
 public void onDataChange(DataSnapshot dataSnapshot) {
           for (DataSnapshot u: dataSnapshot.getChildren()) {
                 susername = u.getKey();

 tref.child(susername).addValueEventListener(new ValueEventListener() {
 @Override
 public void onDataChange(DataSnapshot dataSnapshot) {
        sula = dataSnapshot.child("latitude").getValue().toString();
        sulo = dataSnapshot.child("longitude").getValue().toString();

        Location cl1 = new Location("");
        lat1 =  Float.parseFloat(la);
        lon1 = Float.parseFloat(lo);
        cl1.setLatitude(lat1);
        cl1.setLongitude(lon1);

        Location cl2 = new Location("");
        lat2 =  Float.parseFloat(sula);
        lon2 = Float.parseFloat(sulo);
        cl2.setLatitude(lat2);
        cl2.setLongitude(lon2);

        float distance = cl1.distanceTo(cl2);
        int i = 0;
  ul.add(new UserLocationData(i++, susername, String.valueOf(distance)));

  sla = new searchList(getApplicationContext(), ul);
              searchlist.setAdapter(sla);

         }



                                        @Override
                                        public void onCancelled(DatabaseError databaseError) {

                                        }
                                    });
                                }


                            }

                            @Override
         public void onCancelled(DatabaseError databaseError) {

                            }
                        });

                    }else if (ps.equalsIgnoreCase("tutor")){



                    }

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });// end of scref

这是我的结果 enter image description here

所以请就这个问题向我提出建议。谢谢。

1 个答案:

答案 0 :(得分:0)

有时它会发生。 addValueEventListener获取两次调用。如果你不想重复值,你可以清除addValueEventListener方法中的ArrayList值。这样你就不会得到重复的价值。如果你对同一个ArrayList有多个addValueEventListener,你也可以设置一个if条件。