基本的に、これらのアイテムを他のタブのアプリケーションで正しく受け取ります。 このタブは実際には「新規」タブです。サーバーからのすべての項目を表示する必要があります。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を追加できます。これは最適ではありませんが、問題を解決することができます。 (まだチェックしていない)
データベースの構造と正確な値を追加してください。 –
@AlexMamo返事をありがとう。 https://imgur.com/a/HpJW3 これらはデータのスクリーンショットです ここをクリックしてくださいオーディオカテゴリの下のオーディオアイテム。 動画は同じものを組みました イベントはより簡単です。「イベント」のすぐ下にあります。 – WhiteNinja
分かりません。あなたのルートを含め、より詳細なスクリーンショットが必要です。私はそれらを書くことができないので、また、あなたの言語で単語を含んでいません。また、あなたが得たい正確な値を例で教えてください。 –