Извлечение всех пользователей из базы данных FirebaseDatabase - PullRequest
3 голосов
/ 08 апреля 2019

Я извлекаю всех пользователей из базы данных 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

Ответы [ 5 ]

3 голосов
/ 08 апреля 2019

Я не думаю, что Firebase позволяет вам получать всю информацию об учетной записи пользователя. Вот что я сделал при работе в проекте, где я использовал базу данных readtime для сохранения информации о пользователях, когда они зарегистрировались в этом формате (можно обновить информацию позже, используя Uid) , а затем получить это поле базы данных для recyclerView.

Примечание. Для получения данных следует использовать UID аутентификации пользователя.

enter image description here

также попробуйте этот метод для 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) { }
        });
    }
2 голосов
/ 08 апреля 2019

Для меня я сохраню весь дочерний элемент в list, затем передам список адаптеру recyclerView в методе onDataChange.

Редактировать

Из вашего последнего кода вы не добавляете возвращаемый объект в список 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 );
1 голос
/ 08 апреля 2019

Моя просьба создать класс пользователя

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

Теперь вы переработчикПросмотрите адаптер класса

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());
0 голосов
/ 08 апреля 2019

Ваш код не является полным комментарием @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);
         }
    }
}

Установите usersnames.setText() через DP ViewHolder в методе адаптера onBindViewHolder, например: holder.usersnames.setText(user.getName());.

0 голосов
/ 08 апреля 2019

Как насчет использования FirebaseRecyclerAdapter (FirebaseRecyclerOptions).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...