我有一个带有搜索栏(编辑文本)和下面的回收站视图的片段。为了显示我的回收站视图,我使用了适配器。我试图显示用户的所有朋友。问题在于,除非我在搜索栏中点击(不键入任何内容),否则不会显示回收者视图项。
此外,当将图像从数据库加载到图像视图中时,它们会混合在一起。
我的数据库如下:
{
"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);
}
}
答案 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的构造函数中)生成新的引用。然后,更新活动列表将不会影响适配器的列表。
我希望这能解决您的问题!