You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:15:01