Android中ListView选中用户获取对应数据:重复显示手机号及新报错
解决ListView选中用户后信息显示错误及重复手机号问题
咱们先拆解你遇到的两个核心问题:所有用户点击后显示相同手机号和新出现的类型转换报错,这俩问题其实都和代码里的对象处理逻辑有关,咱们一步步来修复:
一、先修正Firebase数据查询的逻辑漏洞
你的查询循环里有几个明显的错误,会导致数据加载异常,进而影响后续的点击显示:
- 错误的对象比较逻辑:
if(value.equals(city))是把User对象直接和字符串city做比较,这永远不会匹配(除非你专门给User类重写了equals方法处理字符串,但显然没有),应该比较User对象里的city属性,比如value.getCity().equals(city)(假设你的User类有getCity()方法)。 - Toast在循环内重复弹出:如果有多个不匹配的子节点,会多次弹出提示,体验很差,应该在循环结束后判断
data集合是否为空再弹出提示。 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点击事件的核心错误
你的点击事件里有两个致命问题,直接导致了报错和手机号显示重复:
- 类型转换错误:
String name = (String) parent.getItemAtPosition(position);这里parent.getItemAtPosition(position)返回的是User对象,强行转成String必然会抛出ClassCastException(这就是你看到的报错原因)。 - 未从选中的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
相关产品推荐
相关产品推荐

