Android-recyclerView返回相同项目的几倍

时间:2018-12-10 05:04:30

标签: java android firebase loops android-recyclerview

我正在尝试获取Firebase数据,但问题是它多次返回相同的数据。

imageRef = database.getInstance().getReference("Users").child(userid);
imageRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {


            for (DataSnapshot mData : dataSnapshot.child("images").getChildren()) {

                for (DataSnapshot mDataTwo: dataSnapshot.child("locations").getChildren()) {

                    ItemData itemData = new ItemData();

                    String mImages = mData.getValue(String.class);
                    String mLocations = mDataTwo.getValue(String.class);

                    itemData.setImages(mImages);
                    itemData.setLocations(mLocations);

                    data.add(itemData);

                }

            }
            adapter.notifyDataSetChanged();

        }

更新:

这是我的数据库结构。

"Users" : {

"X7aVfZH5oZbIaeyLm9FAjOSr5Gd2" : {
  "images" : {
    "urlImages1" : "https://firebasestorage.googleapis.com/v0/b/anthiefy.appspot.com/o/X7aVfZH5oZbIaeyLm9FAjOSr5Gd2%2FImages%2FImg1.jpg?alt=media&token=e26fd6a2-2be7-4a01-920e-0aed1fe06436",
    "urlImages2" : "https://firebasestorage.googleapis.com/v0/b/anthiefy.appspot.com/o/X7aVfZH5oZbIaeyLm9FAjOSr5Gd2%2FImages%2FImg2.jpg?alt=media&token=40165918-3b46-4b22-b0ef-255965b7855d",
    "urlImages3" : "https://firebasestorage.googleapis.com/v0/b/anthiefy.appspot.com/o/X7aVfZH5oZbIaeyLm9FAjOSr5Gd2%2FImages%2FImg3.jpg?alt=media&token=cfd7d00d-9b1a-44fd-80d4-a2947f7de743",
    "urlImages4" : "https://firebasestorage.googleapis.com/v0/b/anthiefy.appspot.com/o/X7aVfZH5oZbIaeyLm9FAjOSr5Gd2%2FImages%2FImg4.jpg?alt=media&token=995419a7-70f7-4330-b046-d06a4d54453e",
    "urlImages6" : "https://firebasestorage.googleapis.com/v0/b/anthiefy.appspot.com/o/X7aVfZH5oZbIaeyLm9FAjOSr5Gd2%2FImages%2FImg6.jpg?alt=media&token=ee6f566a-a9e5-4e8f-9d53-64d3f3bc97a6",
    "urlImages7" : "https://firebasestorage.googleapis.com/v0/b/anthiefy.appspot.com/o/X7aVfZH5oZbIaeyLm9FAjOSr5Gd2%2FImages%2FImg7.jpg?alt=media&token=883a3321-fbba-49bd-aae3-14b005b4cc5b"
  },
  "locations" : {
    "locations1" : "14.2830817 -89.7263953",
    "locations2" : "14.2661424 -89.7220017",
    "locations3" : "14.2846352 -89.7251991",
    "locations4" : "14.2684987 -89.7266704",
    "locations5" : "14.2684987 -89.7266704",
    "locations6" : "14.2684987 -89.7266704",
    "locations7" : "14.2684987 -89.7266704"
  }

我尝试了许多方法,我也寻求了解决方案,但没有任何财富。如果有人可以帮助我,非常感谢。

2 个答案:

答案 0 :(得分:3)

您需要在控制进入循环之前清除数据对象。 应用程序中发生的事情是,firebase数据库上发生任何更改时,它将所有现有数据提供给移动设备,因此,每当您在云上更改任何内容时,冗余数据也会进入DataSnapShot对象,因此您需要清除ArrayList或已列出的列表视为“数据”。

答案 1 :(得分:0)

您要做的是针对每个图像迭代每个位置并创建该Item的对象。

    List<String> images=new ArrayList<>();
    List<String> locations=new ArrayList<>();
    for (DataSnapshot mData : dataSnapshot.child("images").getChildren()) {
        String image = mData.getValue(String.class);
        images.add(image);


    }
    for (DataSnapshot mDataTwo: dataSnapshot.child("locations").getChildren()) {
        String location = mDataTwo.getValue(String.class);
        locations.add(location);
    }
    if (images.size()==locations.size()){
        for (int i=0;i<locations.size();i++){
            String image=images.get(i);
            String location=locations.get(i);
            ItemData itemData = new ItemData();
            itemData.setImages(image);
            itemData.setLocations(location);
            data.add(itemData);
        }
        adapter.notifyDataSetChanged();
    }

尝试此代码。会帮你的。