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

添加条目时如何阻止RecyclerView刷新全部条目?

问题解决:Firestore数据变更后RecyclerView总条目数显示错误

问题原因

每次调用load()创建新的FirestoreRecyclerAdapter时,没有停止旧适配器的监听,导致多个适配器同时接收Firestore的数据变更事件。当数据库内容发生变化时,旧适配器的onDataChanged方法会被触发,如果旧适配器绑定的是全集合查询,就会把总条目数覆盖为整个集合的数量。

修复方案

1. 停止旧适配器的监听再创建新适配器

修改load()方法,在创建新适配器前先停止旧适配器的监听:

private void load() {
    // 停止旧适配器的监听,避免多实例冲突
    if (myStudentAdapter != null) {
        myStudentAdapter.stopListening();
    }

    Query query = createQuery();
    FirestoreRecyclerOptions<Student> options = new FirestoreRecyclerOptions.Builder<Student>()
            .setQuery(query, Student.class)
            .build();

    myStudentAdapter = new MyStudentAdapter(options) {
        @Override
        public void onDataChanged() {
            super.onDataChanged();
            tv_total.setText(String.valueOf(getItemCount()));
        }
    };

    rv.setAdapter(myStudentAdapter);
    myStudentAdapter.startListening();
}

2. 在生命周期销毁时停止监听

避免内存泄漏,同时确保所有监听都被正确停止:

@Override
protected void onDestroy() {
    super.onDestroy();
    if (myStudentAdapter != null) {
        myStudentAdapter.stopListening();
    }
}

3. 优化查询构建代码(可选)

原createQuery()方法存在大量重复逻辑,可以简化为动态添加条件的链式调用,降低出错概率:

private Query createQuery() {
    CollectionReference studentsRef = db.collection("Student");
    Query query = studentsRef.orderBy("fullName");

    // 动态添加筛选条件
    if (!course.isEmpty()) {
        query = query.whereEqualTo("course", course);
    }
    if (!year.isEmpty()) {
        query = query.whereEqualTo("year", year);
    }
    if (!block.isEmpty()) {
        query = query.whereEqualTo("block", block);
    }

    // 添加搜索前缀匹配
    if (!search.isEmpty()) {
        query = query.startAt(search).endAt(search + '\uf8ff');
    }

    return query;
}

内容的提问来源于stack exchange,提问作者Vince Ybañez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:55:25