Recycler View отображается только после того, как я нажму Edit Text - PullRequest
3 голосов
/ 13 апреля 2019

У меня есть фрагмент с панелью поиска (редактировать текст) и представлением переработчика внизу. Для отображения моего вида переработчика я использую адаптер. Я пытаюсь отобразить всех друзей пользователя. Проблема в том, что элементы представления рециркулятора не отображаются, пока я не нажму в строке поиска (ничего не печатая).
Кроме того, при загрузке изображений из моей базы данных в представления изображений они смешиваются.
Моя база данных выглядит следующим образом:

{
 "Friends": {
            "id3":{
                "id1": "name1",
                "id2": "name2",
                ...
            },
            "id4":{
                "id1": "name1",
                "id3": "name3",
                ...
            }, ...
 },
 "Users": {
          "id1":{
             info about user1
          },
          "id2":{
             info about user2
          },
          "id3":{
             info about user3
          },
          "id4":{
             info about user4
          }, ...
 }
}

Я немного отладил и обнаружил, что мой onCreateViewHolder никогда не вызывается при создании фрагмента (не уверен, что это актуально).
Я также попытался использовать другой запрос, который просто отображает всех пользователей в базе данных (так что просто перебирая дочерние узлы узла «Пользователи»). Это сработало, поэтому я думаю, что проблема с моими запросами. Однако я не могу понять, где я иду не так.

Как я связываю свой вид переработчика с моим адаптером:

recyclerView = view.findViewById(R.id.frag_invite_recycler);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

searchBar = view.findViewById(R.id.frag_invite_search_bar);

mUsers = new ArrayList<>();
mAdapter = new EventUserAdapter(getContext(),mUsers);
recyclerView.setAdapter(mAdapter);

Запрос моих друзей:

Query friends = FirebaseDatabase.getInstance().getReference("Friends").child(firebaseUser.getUid()).orderByValue();

friends.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                mUsers.clear();

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

                    Query users = FirebaseDatabase.getInstance().getReference("Users").child(snp.getKey());

                    users.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                            User user = dataSnapshot.getValue(User.class);

                            assert user != null;
                            mUsers.add(user);
                        }
                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {
                        }
                    });
                }
                mAdapter.notifyDataSetChanged();
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        });

Мой адаптер:

@NonNull
    @Override
    public EventViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.user_event, viewGroup, false);

        return new EventViewHolder(view, mListener);
    }

    @Override
    public void onBindViewHolder(@NonNull EventViewHolder eventViewHolder, int i) {
        firebaseUser = FirebaseAuth.getInstance().getCurrentUser();

        final User user = mUsers.get(i);

        eventViewHolder.username.setText(user.getUsername());
        if (user.getImgURL() != null) Glide.with(eventViewHolder.icon.getContext()).load(user.getImgURL()).into(eventViewHolder.icon);

    }

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

My ViewHolder:

public class EventViewHolder extends RecyclerView.ViewHolder {

        public TextView username;
        public ImageView check;
        public CircleImageView icon;

        public EventViewHolder(@NonNull View itemView, final onItemClickListener listner) {
            super(itemView);
            username = itemView.findViewById(R.id.user_event_name);
            icon = itemView.findViewById(R.id.user_event_image);
            check = itemView.findViewById(R.id.user_event_check);
    }
}

1 Ответ

1 голос
/ 16 апреля 2019

Я думаю, что проблема с расположением mAdapter.notifyDataSetChanged();в разделе Мои друзья .Вы вызываете команду вне внутреннего обратного вызова из users.addValueEventListener, и это может быть слишком рано, ваш массив пользователей только что очищен и еще не заполнен.

Попробуйте сделать что-то вроде:

friends.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        mUsers.clear();
        mAdapter.notifyDataSetChanged(); // for the current views actually reset
        // you could also do mAdpater.notifyItemRangeRemoved(0, mUsers.size()) but before clearing the list of course

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

            Query users = FirebaseDatabase.getInstance().getReference("Users").child(snp.getKey());

            users.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    User user = dataSnapshot.getValue(User.class);

                    assert user != null;
                    mUsers.add(user);
                    mAdapter.notifyItemInserted(mUsers.size() - 1); // to display the current user in the recyclerview
                }
                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                }
            });
        }
    }
    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
    }
});

Если все еще не работает, может быть, вы используете два разных списка пользователей, один в активности и второй в адаптере?проверьте, сохраняете ли вы ссылку на исходный список или генерируете новую на основе значений оригинала (в конструкторе adpater).Тогда обновление списка активности не повлияет на список адаптера.

Надеюсь, это решит вашу проблему!

...