Android Studio开发售卖应用时筛选特定用户地址消息的异常问题
问题核心原因
- 对比接收者身份时调用了错误的API:
FirebaseUser.toString()返回的是对象的完整字符串描述,而非你数据库中存储的用户UID,导致判断条件永远不成立,所有item都被设为GONE,页面呈现空白。你注释掉的getItemViewType方法中已经用到了正确的getUid()方法,此处属于笔误。 - 在
onBindViewHolder中直接隐藏item根布局的方案不合理,即使布局不可见,item仍然会占用对应高度的空白区域,最优方案是提前在数据源层完成筛选。
快速修复方案
直接修改onBindViewHolder中的判断逻辑,补充用户空判断避免空指针:
@Override public void onBindViewHolder(@NonNull MessageViewHolder holder, int position) { Message m = mMessages.get(position); holder.showMessage.setText(m.getAdress()); FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); // 处理用户未登录的边界情况 if (user == null) { holder.messageRel.setVisibility(View.GONE); return; } // 将user.toString()替换为正确的user.getUid() if(m.getReciver().equals(user.getUid())){ holder.messageRel.setVisibility(View.VISIBLE); }else { holder.messageRel.setVisibility(View.GONE); } }
更优实现方案
在将数据传给Adapter之前就完成筛选,只保留当前用户的地址消息,避免Adapter层做不必要的判断,也不会出现空白占位问题:
// 从Realtime Database读取全量消息后执行过滤 List<Message> allMessages = // 从数据库查询到的全量地址消息 FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser(); List<Message> filteredMessages = new ArrayList<>(); if (currentUser != null) { String currentUid = currentUser.getUid(); for (Message msg : allMessages) { if (currentUid.equals(msg.getReciver())) { filteredMessages.add(msg); } } } // 把过滤后的列表传给Adapter即可 MessageAdapter adapter = new MessageAdapter(filteredMessages, this); recyclerView.setAdapter(adapter);
注意事项
检查Message类的字段名、get方法拼写是否和数据库存储的字段完全一致,比如Adress(正确拼写为Address)、Reciver(正确拼写为Receiver),避免Firebase序列化时取不到对应值。
内容的提问来源于stack exchange,提问作者Ranko Koturic
相关产品推荐
相关产品推荐

