【问题标题】:Firebase RecyclerView OnDataChanged only last element is ShownFirebase RecyclerView OnDataChanged 仅显示最后一个元素
【发布时间】:2018-06-26 11:51:25
【问题描述】:

我正在开发 android 聊天应用程序,关注 this 我正在检索整个朋友列表然后根据他们的用户 ID,我从用户名、用户图像和用户状态数据库中检索用户数据如下所示。

那么现在主要的问题是什么,主要的问题在于以下代码:

        @Override
        protected void onBindViewHolder(FriendsFragment.friendsViewHolder holder, int position, Friends model) {

            final String list_User_id=getRef(position).getKey();

            mUserdatabase.child(list_User_id).addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                        UserName = dataSnapshot.child("name").getValue().toString();
                        friendsViewHolder.setName(UserName);
                        UserStatus = dataSnapshot.child("status").getValue().toString();
                        friendsViewHolder.setStatus(UserStatus);
                        thumb_img = dataSnapshot.child("thumb_img").getValue().toString();
                        friendsViewHolder.setThumbnail(thumb_img,getActivity());
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent prfile_Intent=new Intent(getActivity(),ProfileActivity.class);
                    prfile_Intent.putExtra("User_id",list_User_id);
                    startActivity(prfile_Intent);

                }
            });

它给了我一个 recyclerView 结果 其中只有最后一个元素如图所示

我用谷歌搜索它并在 Stackover 流上进行搜索,但在过去 3 天内找不到解决方案。 类似的问题被问到但我无法从here 解决我的问题 请帮忙,不要对我的问题投反对票 感谢帮助

【问题讨论】:

    标签: android firebase firebase-realtime-database android-recyclerview firebaseui


    【解决方案1】:

    onBindViewHolder 方法中的addValueEventListener 是个非常糟糕的主意。您可以在 Fragment 中创建用户列表并将该列表传递给适配器。

    【讨论】:

    • 但我正在使用 Firebase RecyclerView,所以我如何将自己的列表传递给它
    • 在RecyclerView中查询直接获取用户列表,在PopulateViewHolder中可以直接设置数据
    • 感谢您的关注现在 fire base 更新了 ui,因此 PopulateViewHolder 不可用
    【解决方案2】:

    发生这种情况是因为调用 onBindViewHolder() 方法的次数与来自数据库的项目数一样多。所以在这种情况下,这个方法里面的所有东西也会被触发。这意味着您将在每个 onBindViewHolder() 方法调用上附加一个侦听器。没有必要这样做。您可以直接从 model 对象中获取用户名和所有其他属性,该对象作为参数传递给此方法,如下所示:

    String UserName = model.getUserName();
    String UserStatus = model.getUserStatus();
    //And so on for the other properties.
    

    【讨论】:

    • 我理解 onBindViewHolder() 的执行是迭代的,但在模型类中,我想只存储用户 id 并且基于用户是我从用户那里获取该用户的数据节点
    • 正如您在上面为该解决方案建议的那样,我需要将名称、状态、图像保存在用户已经可用的朋友节点中,以便重复数据
    • 在这种情况下,您应该迭代两次,一次是从朋友节点获取用户,第二次是实际获取数据。但不要在onBindViewHolder() 方法中执行此操作,因为您最终会在 RecyclerView 中拥有一个项目。对于 Firebase,重复并不是一件坏事。这种做法称为denormalization,是 Firebase 的常见做法。为了更好地理解,我建议您观看此视频,Denormalization is normal with the Firebase Database
    • 您认为我的回答对您有帮助吗?
    • 谢谢你的帮助我会试试你的建议,但我怎么不知道你
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 2019-01-30
    相关资源
    最近更新 更多