Recyclerview复制来自firebase的项目,因为嵌套的SingleValueEvent

时间:2017-11-15 19:09:02

标签: android database firebase android-recyclerview duplicates

基本上我正在其他标签上的应用中正确接收这些项目。 这个标签实际上是" new"标签。它应该显示服务器中的所有项目。

接收所有数据的代码:

 private void pullDataFromFirebase(String dataType) {

    switch (dataType) {
        case "Audio":
            database = FirebaseDatabase.getInstance().getReference("Audio Categories");
            database.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    audioCategories = new ArrayList<Category>();

                    Category category = new Category();

                    for (DataSnapshot catData : dataSnapshot.getChildren()) {
                            category = catData.getValue(Category.class);
                        audioCategories.add(new Category(category.getImageUrl(), category.getTitle(), category.getDateOfPublish()));
                    }
                    for (int i = 0; i < audioCategories.size(); i++) {
                        catTitle = audioCategories.get(i).getTitle();
                        catRef = database.child(catTitle).child("Items");

                        catRef.addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                for (DataSnapshot data : dataSnapshot.getChildren()) {
                                    Item item = data.getValue(Item.class);
                                    item.setKindOfItem("Audio");
                                    item.setLinkToEvent("Audio item doesn't have a link");
                                    items.add(new Item(item.getImageUrl(), item.getTitle(), item.getSummary(), item.getembeddedIDOrPowerLinkID(),item.getLinkToEvent(),item.getKey(), item.getDateOfPublish(), item.getKindOfItem()));
                                }
                                pullDataFromFirebase("Video");
                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {
                            }
                        });
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                }

            });

            break;
        case "Video":

            database = FirebaseDatabase.getInstance().getReference("Video Categories");
            database.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    videoCategories = new ArrayList<Category>();

                    Category category = new Category();

                    for (DataSnapshot catData : dataSnapshot.getChildren()) {
                        category = catData.getValue(Category.class);
                        videoCategories.add(new Category(category.getImageUrl(), category.getTitle(), category.getDateOfPublish()));
                    }
                    for (int i = 0; i < videoCategories.size(); i++) {
                        catTitle = videoCategories.get(i).getTitle();
                        catRef = database.child(catTitle).child("Items");

                        catRef.addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                if (dataSnapshot.exists()){
                                    for (DataSnapshot data : dataSnapshot.getChildren()) {
                                        Item item = data.getValue(Item.class);
                                        item.setKindOfItem("Video");
                                        item.setLinkToEvent("Video item doesn't have a link");
                                        items.add(new Item(item.getImageUrl(), item.getTitle(), item.getSummary(), item.getembeddedIDOrPowerLinkID(),item.getLinkToEvent(),item.getKey(), item.getDateOfPublish(), item.getKindOfItem()));
                                    }
                                    pullDataFromFirebase("Event");
                                } else {
                                    Log.i("VIDEO_CAT_EMPTY","One of the video categories is empty.");
                                }
                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {
                            }
                        });
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                }

            });

            break;
        case "Event":
            DatabaseReference database;
            database = FirebaseDatabase.getInstance().getReference("Events");

            database.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    for (DataSnapshot data : dataSnapshot.getChildren()) {
                        Item item = data.getValue(Item.class);
                        item.setKindOfItem("Event");
                        items.add(new Item(item.getImageUrl(), item.getTitle(), item.getSummary(), item.getembeddedIDOrPowerLinkID(),item.getLinkToEvent(),item.getKey(), item.getDateOfPublish(), item.getKindOfItem()));
                    }
                    setNewsRecyclerView();

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                }
            });
            break;
    }
}

在撰写这篇文章时,我正在进一步调查,现在我知道在我在我的应用程序中上传新的音频类别后,这种情况正在发生。 第一个音频类别只是复制事件项目,从2及以上我可以看到列表中的视频项目也是重复的。 **注意:音频不能自行复制。

我可以理解,由于功能的性质,这种情况正在发生。我正在调用OnCreateView到

  

pullDataFromFirebase(&#34;音频&#34)

这是该系列中的第一个功能。 这些是firebase函数,并填充我的本地RecyclerView我必须这样调用它们,因为它们是A同步的。 我认为这是因为订单而发生的。 (首先是音频然后是视频然后是事件)它正在复制嵌套for循环的行为。

也许我错了。 建议?

编辑:我可能找到了一种方法,我可以向Item对象添加一个String,它是数组列表中每个成员的唯一ID ...这不是最优的,但它可以解决问题。 (还没有检查过。)

1 个答案:

答案 0 :(得分:0)

哦,天啊! 我无法相信它是如此简单,它从我身边溜走了。 答案是:

理解逻辑:

嵌套的OnDataChange有两个地方可以执行所需的功能(可以在本地的recyclerview上工作),这些地方位于“for”之后,我正在从服务器收集来自服务器的信息并填充Item.class和数组列表。 我已经执行了pullDataFromFirebase("Video")pullDataFromFirebase("Event") 在第二个OnDataChange上,它实际上是一个语法错误,在某些情况下(取决于服务器中的当前数据情况)导致这两个函数的倍增。

代码示例:

            case "Video":

            database = FirebaseDatabase.getInstance().getReference("Video Categories");
            database.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if (dataSnapshot.exists()) {
                        videoCategories = new ArrayList<Category>();
                        Category category = new Category();

                        for (DataSnapshot catData : dataSnapshot.getChildren()) {
                            category = catData.getValue(Category.class);
                            videoCategories.add(new Category(category.getImageUrl(), category.getTitle(), category.getDateOfPublish()));
                        }
                        for (int i = 0; i < videoCategories.size(); i++) {
                            catTitle = videoCategories.get(i).getTitle();
                            catRef = database.child(catTitle).child("Items");

                            catRef.addListenerForSingleValueEvent(new ValueEventListener() {
                                @Override
                                public void onDataChange(DataSnapshot dataSnapshot) {
                                    if (dataSnapshot.exists()) {
                                        for (DataSnapshot data : dataSnapshot.getChildren()) {
                                            Item item = data.getValue(Item.class);
                                            item.setKindOfItem("Video");
                                            item.setLinkToEvent("Video item doesn't have a link");
                                            items.add(new Item(item.getImageUrl(), item.getTitle(), item.getSummary(), item.getembeddedIDOrPowerLinkID(), item.getLinkToEvent(), item.getKey(), item.getDateOfPublish(), item.getKindOfItem()));
                                        }
           **************THE FUNCTION WAS LOCATED HERE ***************

                                    } else {
                                        Log.i("ONE_OR_MORE_VIDEO_EMPTY", "One or more of the categories are empty.");
                                    }
                                }

                                @Override
                                public void onCancelled(DatabaseError databaseError) {
                                }
                            });
                        }
                    } else {
                        Log.i("VIDEO_CAT_EMPTY", "There are no video categories to show");
                    }

      **************Actually the Function Should Be here ***************

                    pullDataFromFirebase("Event");
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {
                }

            });

那么我们可以从中学到什么呢? 当您使用嵌套的SingleValueEventListener或实际上任何嵌套式函数“播放”时,请非常小心。

再次感谢Alex。