【问题标题】:Retrieving all users from the FirebaseDatabase从 FirebaseDatabase 检索所有用户
【发布时间】:2019-08-29 06:29:43
【问题描述】:

我正在从 firebase 数据库中检索所有用户并将它们显示在 recyclerView 中。它显示城镇、用户名和图像。我能够检索,但它只显示一个用户而不是所有用户。数据库有很多用户,但只显示一个。任何建议都会有帮助。

这是检索用户的位

    public void showUsersList() {

    mdatabaseRef = FirebaseDatabase.getInstance ().getReference ( "Users" );

        mdatabaseRef.addValueEventListener ( new ValueEventListener () {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                mcontacts.clear ();

                for (DataSnapshot postSnapshot : dataSnapshot.getChildren ()) {

                   Contacts contactsz = dataSnapshot1.getValue (Contacts.class);
                    mcontacts.add ( contactsz );

                }

                mAdapter = new UsersAdapter ( getApplicationContext () , mcontacts );
                recyclerView.setAdapter ( mAdapter );

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

                Toast.makeText ( FindFriendsActivity.this , " " , Toast.LENGTH_SHORT ).show ();

            }
        } 



    }

这是适配器类

     private Context mcontext;
    private List<Contacts> mcontacts;

    public UsersAdapter(Context context, List<Contacts> contacts){

        mcontext = context;
        mcontacts = contacts;

    }


    @NonNull
    @Override
    public UsersViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup , int i) {

        View v = LayoutInflater.from ( mcontext ).inflate ( R.layout.users_display_layout, viewGroup, false );
        return new UsersViewHolder ( v );

    }

    @Override
    public void onBindViewHolder(@NonNull UsersViewHolder usersViewHolder , int i) {

        Contacts contactsCurrent  = mcontacts.get ( i );
        usersViewHolder.nameOfUser.setText ( contactsCurrent.getName () );
        usersViewHolder.nameOfTown.setText ( contactsCurrent.getTownname () );

        Picasso.get ().load ( contactsCurrent.getImage () ).into ( usersViewHolder.usersImage );

    }

    @Override
    public int getItemCount() {
        return  mcontacts.size ();
    }

    public class UsersViewHolder extends RecyclerView.ViewHolder{

             public TextView nameOfUser;
             public TextView nameOfTown;
             public CircleImageView usersImage;

        public UsersViewHolder(@NonNull View itemView) {
            super ( itemView );

            nameOfUser = itemView.findViewById ( R.id.user_profile_name );
            nameOfTown = itemView.findViewById ( R.id.user_town_name );
            usersImage = itemView.findViewById ( R.id.users_profile_image );


        }
    }

}
`````````````````````````````````````````````````````````````````

这是联系人类

public class Contacts {

    public String Name,townname,image;


    public Contacts(){

    }


    public Contacts(String name , String townname , String image) {
        Name = name;
        this.townname = townname;
        this.image = image;

    }


    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public String getTownname() {
        return townname;
    }

    public void setTownname(String townname) {
        this.townname = townname;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }
}


  [1]: https://i.stack.imgur.com/dFD6z.jpg

【问题讨论】:

  • 你在哪里初始化适配器?
  • 您永远不会将它们添加到列表中并通知适配器。你只是在循环数据。因此,只有列表中的最后一个用户会绘制 UI
  • 我认为这是问题之一。我没有初始化适配器。
  • 显示完整代码,因为这里没有在适配器列表中添加任何项目,数据每次都在同一字段中初始化,
  • @John joe.Thanks alot.it 似乎工作。但由于 logcat 中的此错误“com.google.firebase.database.DatabaseException:发现两个 getter 或字段冲突的情况下,该活动崩溃属性的敏感性:"

标签: java android firebase firebase-realtime-database


【解决方案1】:

如何使用 FirebaseRecyclerAdapter(FirebaseRecyclerOptions)。

【讨论】:

  • 是什么让你觉得FirebaseRecyclerAdapter 会解决 OP 的问题?
  • FirebaseRecyclerAdapter 是非常强大的适配器,可以实时从 FirebaseDatabase 获取数据。它支持更改值侦听器和项目单击回调和 onCreate init。都支持。我总是用这个。非常好的firebase适配器
  • 也许它很强大,但是现在使用recyclerView 的OP 问题是来自firebase 的所有项目都没有被检索到。
  • 也许有帮助?我不知道,只是猜测:)
  • 不,我不是现在面临问题的人。谢谢:)
【解决方案2】:

对我来说,我会将所有子项存储到 list 中,然后将列表传递给 onDataChange 方法中的 recyclerView 适配器。

编辑

根据您的最新代码,您不会将返回对象添加到 mcontacts 列表中。检查下面的代码。

 for (DataSnapshot npsnapshot : dataSnapshot.getChildren()){
        Contacts contacts =npsnapshot.getValue(Contacts.class);
        mcontacts.add(contacts);  // you miss this line
     }
        mAdapter = new UsersAdapter ( getApplicationContext () , mcontacts );
        recyclerView.setAdapter ( mAdapter );

【讨论】:

  • 也是一个很好的例子,如果您需要在 Activity 和适配器中拥有用户数据
【解决方案3】:

我不认为 Firebase 允许您获取所有用户帐户信息,这是我在项目中工作时所做的,当他们以这种格式注册时,我使用 readtime 数据库来保存用户信息(以后可以使用 Uid 更新信息) ,然后为 recyclerView 获取此数据库字段。

注意:用户身份验证 UID 应用于获取数据。

也可以为 recyclerView 尝试这种方法,而不是在这种情况下使用 onDataChange。

mFirebaseDatabaseRef.child("Users").addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                String retrievename = String.valueOf((String) dataSnapshot.child("Name").getValue());
                String retrievecity = String.valueOf((String) dataSnapshot.child("townname").getValue());
                String retrieveProfileImage = String.valueOf((String) dataSnapshot.child("image").getValue());

                if (!retrievename.equals("null")) {

                    usersnames.setText ( retrievename );
                    userstown.setText ( retrievecity );
                   Picasso.get().load ( retrieveProfileImage ).into ( circleImageView );
                }
                mAdapter.notifyDataSetChanged();
            }
            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) { }
            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) { }
            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) { }
            @Override
            public void onCancelled(DatabaseError databaseError) { }
        });
    }

【讨论】:

  • 我只获取姓名、图片和城市,以获取个人资料信息。
  • 是的,您可以根据需要创建数据库字段,以上所有详细信息都包含我的项目必填字段。
  • 我已经更新并使用了你的更新代码,但它仍然显示一个用户
  • 那么您将不得不设置日志和调试来识别问题。只有当我查看代码时,我才能理解这个问题。因为我目前正在使用上面的代码,它工作得很好。
  • 对我来说,我认为我在初始化适配器并将项目添加到 recyclerview 同时通知适配器时遇到了问题。这就是让我卡住的部分。
【解决方案4】:

您的代码不像评论@HemendraGangwar 那样完整。正如@JohnJoe 所写,您需要在方法onDataChange() 中添加每个孩子。我建议你做这样的事情:

public void onDataChange(DataSnapshot dataSnapshot) {
    if (dataSnapshot.exist) {
         for (DataSnapshot ds : dataSnapshot.getChildren ()){
              // Create your object wrapper with fields that you have in db.
              MyUser user = ds.getValue(MyUser.class);
              // Method in adapter that will add the user to list 
              // and run notifyItemInserted(insertedPosition);
              adapter.addUser(user);
         }
    }
}

在适配器方法onBindViewHolder 中通过DP ViewHolder 设置您的usersnames.setText(),例如:holder.usersnames.setText(user.getName());

【讨论】:

  • 适配器应该在for循环内部还是外部初始化
  • 我更喜欢在对 db 进行查询之前初始化适配器,并且我之前也对回收器进行setAdapter 初始化。如果您将使用我的示例,请不要忘记通知。
【解决方案5】:

我的建议是创建用户类

class User
{
  //filds like name,image etc
}

现在你的 recyclerView 适配器类

class RcUsersAdapter extends RecyclerView.Adapter<RcUsersAdapter.ViewHolder>
{
   public ArrayList<User> userList;
   public RcUsersAdapter(Context context,ArrayList<Users> userList)
   {
    this.context = context;
    this.userList = userList;
   }

   //... other methods

}

知道在你的 Activity 或 Fragment 类中使用

初始化适配器
RcUsersAdapter rcUsersAdapter  = new RcUsersAdapter(context,new ArrayList<User>());

知道何时获取数据

rcUsersAdapter.userList.add(UserClassObject);
rcUsersAdapter.notifyItemInserted(rcUsersAdapter.getItemCount());

【讨论】:

    猜你喜欢
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多