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

Android中Firestore查询后ListView显示空列表问题求助

问题分析与解决方案

嘿,我看了你的代码,ListView一直为空的核心问题出在随机选取数据的逻辑上,咱们一步步拆解问题,给你把坑填上:

1. 致命错误:空集合调用nextInt()

你这段随机选数据的代码完全写反了逻辑:

List<Peoples> randomPlaceList = new ArrayList<>();
for (int i = 0; i < 3; i++) {
    int randomIndex = randomGenerator.nextInt(randomPlaceList.size());
    Peoples item = randomPlaceList.get(randomIndex);
    randomPlaceList.add(item);
}

randomPlaceList刚初始化是空的,randomPlaceList.size()等于0,Random.nextInt(0)会直接抛出IllegalArgumentException,导致后续设置Adapter的代码根本执行不到!那次偶然成功大概率是你测试时误改了逻辑~

修正后的随机选取逻辑

应该从**已经获取到的peoplesList**里随机选,还能避免重复选取(如果需要的话):

if (peoplesList.size() > 0) {
    Random randomGenerator = new Random();
    List<Peoples> randomPlaceList = new ArrayList<>();
    // 如果数据库里数据不足3条,就全选;否则随机选3条不重复的
    int selectCount = Math.min(3, peoplesList.size());
    while (randomPlaceList.size() < selectCount) {
        int randomIndex = randomGenerator.nextInt(peoplesList.size());
        Peoples item = peoplesList.get(randomIndex);
        if (!randomPlaceList.contains(item)) { // 避免重复选中同一条数据
            randomPlaceList.add(item);
        }
    }
    // 后续设置Adapter的代码不变,注意上下文换成当前Activity
    ListView mListView = findViewById(R.id.place_list);
    PeoplesAdapter peoplesAdapter = new PeoplesAdapter(MainActivity.this, randomPlaceList);
    mListView.setAdapter(peoplesAdapter);
}

2. 其他潜在问题排查

(1)Firestore权限问题

如果你的Firestore用的是默认规则(只允许认证用户访问),但App没做登录逻辑,那placeRef.get()会直接失败,task.isSuccessful()为false,自然拿不到数据。可以临时修改规则测试(上线前一定要改回安全规则):

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

同时建议在onComplete里加上失败日志,方便排查问题:

@Override
public void onComplete(Task<QuerySnapshot> task) {
    if (task.isSuccessful()) {
        // 你的现有逻辑
    } else {
        Log.e("FirestoreError", "获取数据失败", task.getException());
    }
}

(2)Adapter上下文问题

你用了getBaseContext(),建议换成MainActivity.this,getBaseContext()可能导致布局加载、资源访问等上下文相关的异常。

(3)Model类完整性

你的Peoples类缺了闭合大括号,而且为了Firestore能正确序列化,建议补上setter方法(或者把字段设为public):

public class Peoples { // 类名首字母大写,符合Java规范
    private String name, age;

    public Peoples() {}

    public Peoples(String name, String age) {
        this.name = name;
        this.age = age;
    }

    public String getName() { return name; }
    public String getAge() { return age; }
    
    // 补上setter方法
    public void setName(String name) { this.name = name; }
    public void setAge(String age) { this.age = age; }
}

3. 测试验证

改完代码后记得:

  • 清除App缓存或卸载重装,避免旧数据干扰
  • 查看Logcat,确认没有异常日志
  • 确认Firestore的Peoples集合确实有数据(你的截图显示是有的)

内容的提问来源于stack exchange,提问作者Spike Johnson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:23:46