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

Android中ListView选中用户获取对应数据:重复显示手机号及新报错

解决ListView选中用户后信息显示错误及重复手机号问题

咱们先拆解你遇到的两个核心问题:所有用户点击后显示相同手机号和新出现的类型转换报错,这俩问题其实都和代码里的对象处理逻辑有关,咱们一步步来修复:

一、先修正Firebase数据查询的逻辑漏洞

你的查询循环里有几个明显的错误,会导致数据加载异常,进而影响后续的点击显示:

  1. 错误的对象比较逻辑:if(value.equals(city))是把User对象直接和字符串city做比较,这永远不会匹配(除非你专门给User类重写了equals方法处理字符串,但显然没有),应该比较User对象里的city属性,比如value.getCity().equals(city)(假设你的User类有getCity()方法)。
  2. Toast在循环内重复弹出:如果有多个不匹配的子节点,会多次弹出提示,体验很差,应该在循环结束后判断data集合是否为空再弹出提示。
  3. notifyDataSetChanged()放在循环内:每次添加数据都刷新适配器,性能不好,应该循环结束后统一调用。

修复后的查询代码:

final Query query = mRef.orderByChild("blood_Group").equalTo(bloodgrp);
query.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        // 先清空旧数据,避免重复加载
        data.clear();
        Iterable<DataSnapshot> children = dataSnapshot.getChildren();
        for (DataSnapshot child : children) {
            User value = child.getValue(User.class);
            // 判空后比较User对象的city属性和目标city
            if(value != null && city.equals(value.getCity())){
                data.add(value);
            }
        }
        adapter.notifyDataSetChanged();
        // 循环结束后统一判断是否有数据
        if(data.isEmpty()){
            Toast.makeText(Searchview.this,"Donors not found!",Toast.LENGTH_SHORT).show();
        }
    }
    @Override
    public void onCancelled(DatabaseError databaseError) {
        // 建议在这里添加错误提示,方便排查问题
        Toast.makeText(Searchview.this,"查询失败:"+databaseError.getMessage(),Toast.LENGTH_SHORT).show();
    }
});

二、修复ListView点击事件的核心错误

你的点击事件里有两个致命问题,直接导致了报错和手机号显示重复:

  1. 类型转换错误:String name = (String) parent.getItemAtPosition(position);这里parent.getItemAtPosition(position)返回的是User对象,强行转成String必然会抛出ClassCastException(这就是你看到的报错原因)。
  2. 未从选中的User对象获取手机号:你直接用了一个未定义的phone变量,这个变量大概率是全局的某个固定值,所以所有用户点击后显示的都是同一个手机号。

修复后的点击事件代码:

listResult.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long l) {
        // 获取选中的User对象(确保你的adapter的getItem方法返回User类型)
        User selectedUser = adapter.getItem(position);
        if(selectedUser == null){
            return; // 防止空指针异常
        }
        
        final Dialog dialog = new Dialog(Searchview.this);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.activity_user_details);
        dialog.setTitle("Call Donor");
        
        // 从选中的User对象中提取对应属性
        TextView t1 = dialog.findViewById(R.id.txtname);
        TextView t2 = dialog.findViewById(R.id.txtBldtype);
        TextView t3 = dialog.findViewById(R.id.txtphone);
        TextView t4 = dialog.findViewById(R.id.txtcity);
        
        t1.setText(selectedUser.getName()); // 假设User类有getName()方法
        t2.setText(bloodgrp);
        t3.setText(selectedUser.getPhone()); // 从选中对象取手机号,假设User类有getPhone()方法
        t4.setText(selectedUser.getCity()); // 用对象内的城市属性更准确
        
        // 别忘了显示对话框!原代码漏掉了这一步
        dialog.show();
    }
});

三、额外注意事项

  • 确保你的User类有对应的getter方法(getName()、getPhone()、getCity()等),否则无法正确获取属性值。
  • 检查你的适配器(adapter)的getItem(int position)方法是否正确返回User对象,比如如果是ArrayAdapter<User>,默认就会返回对应类型的对象。
  • 测试时可以给User类重写toString()方法,方便调试时查看对象内容。

这样修改后,应该就能解决点击用户后显示相同手机号的问题,同时也会消除类型转换的报错。

内容的提问来源于stack exchange,提问作者Imran Anwar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:01:02