仅在按下“编辑文本”后显示“回收者视图”

时间:2019-04-13 18:38:00

标签: android android-fragments android-recyclerview recycler-adapter

我有一个带有搜索栏(编辑文本)和下面的回收站视图的片段。为了显示我的回收站视图,我使用了适配器。我试图显示用户的所有朋友。问题在于,除非我在搜索栏中点击(不键入任何内容),否则不会显示回收者视图项。
此外,当将图像从数据库加载到图像视图中时,它们会混合在一起。
我的数据库如下:

{
 "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(不确定是否相关)。
我还尝试使用另一个查询,该查询仅显示数据库中的所有用户(因此仅遍历节点“ Users”的子代)。那确实有效,所以我想问题出在我的查询上。但是我无法弄清楚哪里出了问题。

我如何将回收站视图链接到适配器:

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();
    }

我的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 个答案:

答案 0 :(得分:1)

我认为问题出在我的朋友查询部分中的... [8]=> array(5) { ["tag"]=> string(12) "ROOMCATGCODE" ["type"]=> string(8) "complete" ["level"]=> int(5) ["attributes"]=> array(2) { ["NAME"]=> string(6) "SULTAN" ["BFTYPE"]=> string(4) "NONE" } ["value"]=> string(12) "WSMA02045946" ...
的位置。
您正在mAdapter.notifyDataSetChanged();的内部回调外部调用命令,这可能为时过早,您的users数组刚刚被清除,尚未填充。

尝试执行以下操作:

users.addValueEventListener

如果仍然无法使用,也许您正在使用两个不同的用户列表,一个在活动中,第二个在适配器中?检查您是否要保存原始列表的引用或基于原始值(在adpater的构造函数中)生成新的引用。然后,更新活动列表将不会影响适配器的列表。

我希望这能解决您的问题!