Список пользователей пуст - PullRequest
1 голос
/ 28 июня 2019

Я хочу создать приложение чата с использованием базы данных Firebase Realtime с RecyclerView и CardView с именем для каждого пользователя. Проблема в том, что он показывает мне только просмотр карты, когда в базе данных есть 3 человека.Я прикрепил в этой ссылке картинку с моей базой данных:

UsersFragment:

public class UsersFragment extends Fragment {
    private RecyclerView recyclerView;
    private UserAdapter userAdapter;
    private List<User> mUsers;


    @Override
    public View onCreateView (LayoutInflater inflater, ViewGroup container,
                              Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view= inflater.inflate ( R.layout.fragment_users3, container, false );
recyclerView=view.findViewById (R.id.recycler_view  );

recyclerView.setLayoutManager ( new LinearLayoutManager ( getContext () ) );
mUsers=new ArrayList<> (  );
readUsers();

        return view;
    }

    private void readUsers () {
        final FirebaseUser firebaseUser= FirebaseAuth.getInstance ().getCurrentUser ();
        DatabaseReference referenc= FirebaseDatabase.getInstance ().getReference ("users");

        referenc.addValueEventListener ( new ValueEventListener () {
            @Override
            public void onDataChange (@NonNull DataSnapshot dataSnapshot) {
                mUsers.clear ();
                for(DataSnapshot snapshot:dataSnapshot.getChildren ()){
                    User user=snapshot.getValue (User.class);
                    assert user!=null;
                    assert firebaseUser!=null;
                    if(!firebaseUser.getUid ().equals ( user.getUid () )){
                        mUsers.add ( user );

                    }
                }
                userAdapter=new UserAdapter ( getContext (),mUsers );
                recyclerView.setAdapter ( userAdapter );
            }

            @Override
            public void onCancelled (@NonNull DatabaseError databaseError) {

            }
        } );
    }


}

UserAdapter.In я использовал класс User:

public class UserAdapter extends RecyclerView.Adapter<UserAdapter.ViewHolder> {
    private Context mContext;
    private List<User> mUsers;
    public UserAdapter(Context mContext,List<User> mUsers){
        this.mUsers=mUsers;
        this.mContext=mContext;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder (@NonNull ViewGroup parent, int viewType) {
        View view= LayoutInflater.from ( mContext ).inflate ( R.layout.users_template ,parent,false);

        return new UserAdapter.ViewHolder ( view );
    }

    @Override
    public void onBindViewHolder (@NonNull ViewHolder holder, int position) {
User user=mUsers.get ( position );
holder.username.setText ( user.getFirstName () );

    }

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

    public class ViewHolder extends RecyclerView.ViewHolder{

        public TextView username;

        public ViewHolder(View itemView){
            super(itemView);
            username=itemView.findViewById ( R.id.username1 );
        }

    }
}

Пользователь, который хранит FirstName:

public class User {
   public String firstName;
    public String secondName;
    public String uid;
    public String email;
    public User(){

    }



    public User (String firstName, String secondName, String uid, String email) {
        this.firstName = firstName;
        this.secondName = secondName;
        this.uid=uid;
        this.email=email;
    }

    public User (String firstname, String secondname) {
    }

    public String getFirstName () {
        return firstName;
    }

    public String getSecondName () {
        return secondName;
    }

    public String getUid () {
        return uid;
    }

    public String getEmail () {
        return email;
    }

    public void setFirstName (String firstName) {
        this.firstName = firstName;
    }

    public void setSecondName (String secondName) {
        this.secondName = secondName;
    }

    public void setUid (String uid) {
        this.uid = uid;
    }

    public void setEmail (String email) {
        this.email = email;
    }
}

И действие, в котором мои TabLayout и ViewPager

public class UsersActivity extends AppCompatActivity {


    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate ( savedInstanceState );
        setContentView ( R.layout.activity_users );
        TabLayout tablayout=findViewById ( R.id.tab_layout );
        ViewPager viewPager=findViewById ( R.id.view_pager );
        ViewPagerAdapter viewPagerAdapter=new ViewPagerAdapter ( getSupportFragmentManager () );
        viewPagerAdapter.addFragment ( new ChatFragment (),"Chats" );
        viewPagerAdapter.addFragment ( new UsersFragment (),"Users" );
        viewPager.setAdapter (viewPagerAdapter  );
        tablayout.setupWithViewPager (viewPager  );

    }
    class ViewPagerAdapter extends FragmentPagerAdapter{
private ArrayList<Fragment> fragments;
private ArrayList<String> titles;
ViewPagerAdapter(FragmentManager fn){
    super(fn);
    this.fragments=new ArrayList<> (  );
    this.titles=new ArrayList<> (  );
}
        @NonNull
        @Override
        public Fragment getItem (int position) {
            return fragments.get ( position );
        }

        @Override
        public int getCount () {
            return fragments.size ();
        }
        public void addFragment(Fragment fragment,String title){
    fragments.add ( fragment );
    titles.add ( title );
        }

        @Nullable
        @Override
        public CharSequence getPageTitle (int position) {
            return titles.get ( position );
        }
    }
}

В режиме отладки он показывает мне:

W/ClassMapper: No setter/field for FirstName found on class com.example.sportsbuddy.User (fields/setters are case sensitive!)

Я ожидаю показать мне всех пользователей, которые у меня есть в базе данных.

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

У вас есть свойство FirstName в вашем JSON в базе данных. В вашем классе User у вас есть метод getFirstName(), который соответствует (в соответствии с соглашением JavaBean, используемым Firebase) свойству firstName. Поскольку дело обстоит иначе, это другое свойство.

Чтобы сопоставить JSON и класс, вы можете изменить JSON на использование имен свойств JavaBean:

{
  "users": {
    "uid1": {
      "email": "...",
      "firstName": "...",
      "secondName": "..."
    }
  }
}

В качестве альтернативы вы можете сделать класс Java соответствующим вашему текущему JSON, используя атрибут PropertyName:

public class User {
    private String firstName;
    private String secondName;
    private String uid;
    private String email;

    public User(){
    }

    public User (String firstName, String secondName, String uid, String email) {
        this.firstName = firstName;
        this.secondName = secondName;
        this.uid=uid;
        this.email=email;
    }

    public User (String firstname, String secondname) {
    }

    @PropertyName("FirstName")
    public String getFirstName () {
        return firstName;
    }

    @PropertyName("SecondName")
    public String getSecondName () {
        return secondName;
    }

    @PropertyName("Uid")
    public String getUid () {
        return uid;
    }

    @PropertyName("E-mail")
    public String getEmail () {
        return email;
    }

    @PropertyName("FirstName")
    public void setFirstName (String firstName) {
        this.firstName = firstName;
    }

    @PropertyName("SecondName")
    public void setSecondName (String secondName) {
        this.secondName = secondName;
    }

    @PropertyName("Uid")
    public void setUid (String uid) {
        this.uid = uid;
    }

    @PropertyName("E-mail")
    public void setEmail (String email) {
        this.email = email;
    }
}

Также смотрите мой ответ здесь: Указание сериализованных имен в java-классе для документа firestore

0 голосов
/ 28 июня 2019

Измените ключи в базе данных firebase на firstName, secondName, email, а не FirstName, SecondName и E-mail.Данные из базы данных не могут быть отображены, если в классе модели не найдены правильные ключи и их методы получения и установки.

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