2017-11-15 14 views
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以上では、リスト内のビデオアイテムも同じように複製されています。 ** NOTE:オーディオはそれ自身を複製していません。

私はこれが機能の性質のために起こっていることを理解できます。私は

pullDataFromFirebaseシリーズの最初の関数である( "オーディオ")

にOnCreateViewに呼びかけています。 これらはfirebase関数であり、私のローカルRecyclerViewを取り込むために、私はA-synchronousであるため、このように呼び出す必要があります。 これは注文のために起こっていると思います。 (最初のオーディオからビデオ、そしてイベント)、それはネストされたforループの動作を複製しています。

多分私は間違っています。 提案?

EDIT:私は、Itemオブジェクトに配列リストの各メンバの一意のIDであるStringを追加できます。これは最適ではありませんが、問題を解決することができます。 (まだチェックしていない)

+0

データベースの構造と正確な値を追加してください。 –

+0

@AlexMamo返事をありがとう。 https://imgur.com/a/HpJW3 これらはデータのスクリーンショットです ここをクリックしてくださいオーディオカテゴリの下のオーディオアイテム。 動画は同じものを組みました イベントはより簡単です。「イベント」のすぐ下にあります。 – WhiteNinja

+0

分かりません。あなたのルートを含め、より詳細なスクリーンショットが必要です。私はそれらを書くことができないので、また、あなたの言語で単語を含んでいません。また、あなたが得たい正確な値を例で教えてください。 –

答えて

0

ああ私の神! 私はそれがとてもシンプルで、それが私から逃げ出したとは信じられません。 答えは:

ロジックを理解するために:

ネストされたOnDataChangeのは、私が集まってること「のために」の後にある所望の機能を実行するための2つの場所(つまり、ローカルrecyclerview上で動作します)ありそれにサーバからの情報とItem.classと配列リストを読み込みます。 2番目の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または実際にネストされたスタイルの関数で「再生」するときは、極端に注意してください。

ありがとうございました。

関連する問題