기본적으로 다른 탭의 응용 프로그램에서 이러한 항목을 올바르게 수신하고 있습니다. 이 탭은 실제로 "새"탭입니다. 서버의 모든 항목을 표시해야합니다.Recyclerview는 중첩 된 SingleValueEvent 때문에 firebase의 항목을 복제합니다.
모든 데이터를 수신 코드 :
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 위 이상에서는 목록의 동영상 항목이 스스로 복제하는 것을 볼 수 있습니다. ** 참고 : 오디오 자체가 중복되지 않습니다.
이 기능의 특성상 이러한 현상이 발생할 수 있음을 이해할 수 있습니다. 나는
pullDataFromFirebase 시리즈의 첫 번째 기능입니다 ("오디오")
에 OnCreateView에 전화 드렸습니다. 이들은 파이어베이스 함수이며 내 로컬 RecyclerView를 채울 수 있습니다. A 동기이기 때문에 이러한 방식으로 호출해야합니다. 주문 때문에 이런 일이 발생했다고 생각합니다. (Audio first, Video, Event) 중첩 된 for 루프의 동작을 복제합니다.
아마도 내가 틀렸어. 제안 사항?
EDIT : 배열 개체의 각 구성원에게 고유 한 ID 인 String을 Item 개체에 추가 할 수있는 방법을 발견했습니다.이 방법은 최적은 아니지만 문제를 해결할 수 있습니다. (아직 확인하지 않았다.)
데이터베이스 구조와 원하는 정확한 값을 추가하십시오. –
@AlexMamo 답장을 보내 주셔서 감사합니다. https://imgur.com/a/HpJW3 다음은 데이터의 스크린 샷입니다. 여기에서 볼 수 있습니다 오디오 카테고리 아래의 오디오 항목. 동영상이 동일하게 작성되었습니다. 이벤트는보다 직선적이며 .. '이벤트'바로 아래에 있습니다. – WhiteNinja
나는 많은 것을 이해할 수 없다. 루트를 포함하여 더 자세한 스크린 샷이 필요합니다. 또한 나는 당신의 언어로 된 단어들을 포함하고 있지 않습니다. 왜냐하면 나는 그것들을 쓸 수 없기 때문입니다. 또한 정확한 값을 얻으려면 예를 들어 알려주십시오. –