Firebase RecyclerView显示一项

bea*_*der 5 java android firebase-realtime-database firebaseui

在我的数据库中,我有包含多首歌曲的条目。这是数据库的外观,以及显示内容:

  "DjSunGazer" : {
    "song" : {
      "-LmHrkYkU1qD2GND9wY2" : "Blaya - Cash",
      "-LmHrlalIVUStU6nqBJI" : "Blaya - Cash",
      "-LmHrmRRXy4UYoF7DNZz" : "Taylor Swift - You Need to Calm Down"
    }
  },
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

在我的应用程序中,我能够使用哈希图为每首独特的歌曲分配一个计数器。现在,在Firebase RecyclerView适配器中,它仅显示数据库中的最后一个条目。这是代码:

            query = mProfileDatabase.child(djName);

            FirebaseRecyclerOptions<DataSnapshot> firebaseRecyclerOptions =
                    new FirebaseRecyclerOptions.Builder<DataSnapshot>()
                    .setQuery(query, new SnapshotParser<DataSnapshot>(){
                        @NonNull
                        @Override
                        public DataSnapshot parseSnapshot(@NonNull DataSnapshot snapshot)
                        {
                            return snapshot;
                        }
                    }).build();

            final HashMap<String, Integer> songCounts = new HashMap<String, Integer>();

            firebaseRecyclerAdapter =
                    new FirebaseRecyclerAdapter<DataSnapshot, ResultsViewHolder>(firebaseRecyclerOptions)
                    {

                        @Override
                        protected void onBindViewHolder(@NonNull ResultsViewHolder holder, int position, @NonNull DataSnapshot model)
                        {
                            List<String> sArr = new ArrayList<String>();
                            for(DataSnapshot snapshot : model.getChildren())
                            {
                                sArr.add(snapshot.getValue(String.class));
                            }


                            for(int i = 0; i < sArr.size(); i++)
                            {
                                String eachSong = sArr.get(i);
                                if(songCounts.containsKey(eachSong))
                                {
                                    int count = songCounts.get(eachSong);
                                    songCounts.put(eachSong, count + 1);
                                }
                                else
                                {
                                    songCounts.put(eachSong, 1);
                                }
                            }

                            Collection<String> name = songCounts.keySet();
                            Collection<Integer> ctn = songCounts.values();

                            for(String s2 : name)
                            {
                                Log.d("INFO", s2);
                                DisplaySong ds = new DisplaySong(s2);
                                ds.setSong(s2);
                                holder.setDJNameView(ds);
                            }
                            for(Integer i : ctn)
                            {
                                holder.setBadgeCount(i);
                            }
                        }


                        @NonNull
                        @Override
                        public ResultsViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i)
                        {
                            View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.djname_item, viewGroup, false);
                            return new ResultsViewHolder(view);
                        }
                    };
            firebaseRecyclerAdapter.startListening();
            recyclerView.setAdapter(firebaseRecyclerAdapter);
            songCounts.clear();
Run Code Online (Sandbox Code Playgroud)

我不仅希望在recyclerview中显示为“ Rick Ross-Gold Roses(feat.Drake)”的值,并带有1个徽章表示数据库中仅出现一次,我希望它显示“ Ginuwine-So Anxious”(3)为远低于第一个条目。这已经在我的songCounts HashMap中进行了计算和处理。谢谢!

编辑添加了dj_name_item.xml

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="8dp">

        <TextView
            android:id="@+id/song_result_dj"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginLeft="30dp"
            android:layout_marginRight="30dp" />
        <TextView
            android:id="@+id/song_badge"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_gravity="right|end|top"
            android:layout_marginTop="3dp"
            android:layout_marginEnd="-5dp"
            android:layout_marginRight="15dp"
            android:background="@drawable/badge_background"
            android:gravity="center"
            android:padding="3dp"
            android:paddingRight="15dp"
            android:text="0"
            android:textColor="@android:color/white"
            android:textSize="10sp" />
    </RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

编辑:添加了如何将数据插入

FirebaseDatabase.getInstance().getReference().child(djName).child("song").push().setValue(songName);
Run Code Online (Sandbox Code Playgroud)

Sub*_*sed 3

问题出在你的 json 结构上。在这种情况下,您希望对歌曲使用 json 数组,并且可能有一个Song对象。现在,它们可能被解析为一首单独的“歌曲”,这实际上是一首String. 像下面的 json 结构这样的东西将是按预期工作的开始:

  "DjSunGazer" : {
    "songs" : [
      { "id" : "-LmHrkYkU1qD2GND9wY2", "name" : "Ginuwine - So Anxious" },
      { "id" : "-LmHrlalIVUStU6nqBJI", "name" : "Ginuwine - So Anxious" },
      { "id" : "-LmHrmRRXy4UYoF7DNZz", "name" : "Ginuwine - So Anxious" },
      { "id" : "-LmHrpZzOKOtY_8AGQ_S", "name" : "Rick Ross - Gold Roses (feat. Drake) }"
    ]
  }
Run Code Online (Sandbox Code Playgroud)

我仍然建议进一步更新 json 结构,这样更容易解析。现在看来您将艺术家的名字作为歌曲集的关键值,我认为这也会导致问题或使事情变得比需要的更加困难。