基本上我正在其他标签上的应用中正确接收这些项目。 这个标签实际上是" 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 ...这不是最优的,但它可以解决问题。 (还没有检查过。)答案 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。