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

Android Kotlin中如何用Firestore替换strings.xml的string-array用于自动补全

实现方案

步骤1:配置Firestore数据结构

先在Firebase控制台的Firestore数据库中创建集合,可根据数据量选两种结构之一:

  • 小数据量场景:创建集合languages,每个文档存储一个编程语言,设置name字段存储具体的语言名称(如Java、Kotlin),一次性拉取全量数据即可
  • 大数据量场景:复用上述集合结构,后续配合输入监听做实时匹配查询

配置完成后先设置临时可读的Firestore权限,测试通过后再调整为正式权限规则即可。

步骤2:修改MainActivity.kt代码

替换原有读取本地strings数组的逻辑,改为从Firestore拉取数据后动态更新适配器,完整修改后的代码如下:

package com.example.servus

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.ArrayAdapter
import android.widget.AutoCompleteTextView
import android.widget.Button
import android.widget.Toast
import com.google.firebase.firestore.ktx.firestore
import com.google.firebase.ktx.Firebase

class MainActivity : AppCompatActivity() {
    // 全局声明适配器和语言存储列表
    private lateinit var adapter: ArrayAdapter<String>
    private val languageList = mutableListOf<String>()
    private val db = Firebase.firestore

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val autotextView = findViewById<AutoCompleteTextView>(R.id.autoTextView)
        val button = findViewById<Button>(R.id.btn)

        // 初始化适配器,先绑定空列表
        adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, languageList)
        autotextView.setAdapter(adapter)

        // 从Firestore拉取补全数据
        loadLanguagesFromFirestore()

        // 原有提交按钮逻辑保持不变
        button?.setOnClickListener {
            val enteredText = "${getString(R.string.submitted_lang)} ${autotextView.text}"
            Toast.makeText(this@MainActivity, enteredText, Toast.LENGTH_SHORT).show()
        }
    }

    private fun loadLanguagesFromFirestore() {
        db.collection("languages")
            .get()
            .addOnSuccessListener { result ->
                languageList.clear()
                for (document in result) {
                    // 此处字段名要和Firestore中设置的字段名保持一致
                    val language = document.getString("name")
                    language?.let { languageList.add(it) }
                }
                // 通知适配器数据更新,自动刷新补全选项
                adapter.notifyDataSetChanged()
            }
            .addOnFailureListener { exception ->
                Log.w("Firestore", "拉取数据失败", exception)
                Toast.makeText(this, "加载补全数据失败", Toast.LENGTH_SHORT).show()
            }
    }
}

可选优化:大数据量实时查询

如果语言列表数据量很大,不想一次性拉取全量,可以给AutoCompleteTextView添加文本变化监听器,用户每次输入时触发Firestore前缀匹配查询,仅返回符合输入前缀的结果即可。

注意事项

  • 确保应用已经正确配置Firebase依赖和google-services.json文件
  • 测试阶段可先设置宽松的Firestore读权限,上线前必须调整权限规则避免数据安全问题
  • 有离线使用需求可以开启Firestore离线持久化功能,已经拉取过的数据断网也可以正常补全

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:12:01