0

기본적으로 다른 탭의 응용 프로그램에서 이러한 항목을 올바르게 수신하고 있습니다. 이 탭은 실제로 "새"탭입니다. 서버의 모든 항목을 표시해야합니다.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 개체에 추가 할 수있는 방법을 발견했습니다.이 방법은 최적은 아니지만 문제를 해결할 수 있습니다. (아직 확인하지 않았다.)

+0

데이터베이스 구조와 원하는 정확한 값을 추가하십시오. –

+0

@AlexMamo 답장을 보내 주셔서 감사합니다. https://imgur.com/a/HpJW3 다음은 데이터의 스크린 샷입니다. 여기에서 볼 수 있습니다 오디오 카테고리 아래의 오디오 항목. 동영상이 동일하게 작성되었습니다. 이벤트는보다 직선적이며 .. '이벤트'바로 아래에 있습니다. – WhiteNinja

+0

나는 많은 것을 이해할 수 없다. 루트를 포함하여 더 자세한 스크린 샷이 필요합니다. 또한 나는 당신의 언어로 된 단어들을 포함하고 있지 않습니다. 왜냐하면 나는 그것들을 쓸 수 없기 때문입니다. 또한 정확한 값을 얻으려면 예를 들어 알려주십시오. –

답변

0

오 세상에! 나는 그것이 매우 간단하고 그것이 나에게서 빠져 나갔다는 것을 믿을 수 없다. 대답은 :

이 논리를 이해하기 :

중첩 OnDataChange는 내가 수집하고있어 그 "에 대한"다음에있는 원하는 기능 (즉, 로컬 recyclerview에서 작동)을 실행하는 두 곳이있다 서버의 정보와 Item.class 및 배열 목록을 채 웁니다. 두 번째 OnDataChange에 pullDataFromFirebase("Video")pullDataFromFirebase("Event") 두 가지를 모두 실행했습니다. 실제로이 경우 두 가지 기능을 곱한 구문 오류가 발생합니다 (서버의 현재 데이터 상황에 따라 다름). 코드에서

예 :

  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.

관련 문제