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

如何在Kotlin中实现简易Firebase搜索查询按出生年份筛选候选人

出生年份搜索功能实现方案

你需要按照以下步骤修改代码完成需求:

  • 第一步:在activity_items.xml布局中添加SearchView组件,示例布局代码如下:
<androidx.appcompat.widget.SearchView
    android:id="@+id/searchView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="输入出生年份搜索"
    android:layout_margin="8dp"/>

注意要把该组件放在RecyclerView的上方位置。

  • 第二步:修改ItemsActivity代码,新增全量数据源存储、搜索过滤逻辑,完整修改后的代码如下:
class ItemsActivity : AppCompatActivity() {

    private var mStorage:FirebaseStorage? = null
    private var mDatabaseRef:DatabaseReference? = null
    private var  mDBListener:ValueEventListener? = null
    // 存储所有从Firebase获取的候选人数据,作为过滤源
    private lateinit var mAllCandidates:MutableList<Candidate>
    // 存储当前要展示的过滤后数据
    private lateinit var mCandidate:MutableList<Candidate>
    private lateinit var listAdapter:ListAdapter

    private lateinit var binding: ActivityItemsBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        binding= ActivityItemsBinding.inflate(layoutInflater)
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        binding.rvList.setHasFixedSize(true)
        binding.rvList.layoutManager = LinearLayoutManager(this@ItemsActivity)
        binding.pbLoding.visibility = View.VISIBLE
        mAllCandidates = ArrayList()
        mCandidate = ArrayList()
        listAdapter = ListAdapter(this@ItemsActivity,mCandidate)
        binding.rvList.adapter = listAdapter
        
        // 搜索栏监听
        binding.searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
            override fun onQueryTextSubmit(query: String?): Boolean {
                filterCandidates(query)
                return true
            }

            override fun onQueryTextChange(newText: String?): Boolean {
                filterCandidates(newText)
                return true
            }
        })

        /**set Firebase Database*/
        mStorage = FirebaseStorage.getInstance()
        mDatabaseRef = FirebaseDatabase.getInstance().getReference("candidate_upload")
        mDBListener = mDatabaseRef!!.addValueEventListener(object : ValueEventListener{
            override fun onCancelled(error: DatabaseError) {
                Toast.makeText(this@ItemsActivity,error.message, Toast.LENGTH_SHORT).show()
                binding.pbLoding.visibility = View.INVISIBLE
            }

            override fun onDataChange(snapshot: DataSnapshot) {
                mAllCandidates.clear()
                for (teacherSnapshot in snapshot.children){
                    val upload = teacherSnapshot.getValue(Candidate::class.java)
                    upload!!.key = teacherSnapshot.key
                    mAllCandidates.add(upload)
                }
                // 默认首次加载展示全部候选人
                mCandidate.clear()
                mCandidate.addAll(mAllCandidates)
                listAdapter.notifyDataSetChanged()
                binding.pbLoding.visibility = View.GONE
            }
        })
    }

    // 过滤候选人方法
    private fun filterCandidates(query: String?) {
        val targetList = if (query.isNullOrBlank()) {
            // 搜索内容为空时展示全部
            mAllCandidates
        } else {
            val trimQuery = query.trim()
            // 注意:如果你的Candidate类中birthYear是Int类型,请将代码改为:
            // mAllCandidates.filter { try { it.birthYear == trimQuery.toInt() } catch (e: Exception) { false } }
            mAllCandidates.filter { it.birthYear == trimQuery }
        }
        mCandidate.clear()
        mCandidate.addAll(targetList)
        listAdapter.notifyDataSetChanged()
    }

    override fun onDestroy() {
        super.onDestroy()
        mDatabaseRef!!.removeEventListener(mDBListener!!)
    }
}
  • 注意事项:
    • 请确保你的Candidate数据类中已声明birthYear属性,属性类型需和Firebase数据库中存储的出生年份类型一致
    • 如果出生年份在数据库中存储为数字类型,需按照代码注释中的提示修改过滤逻辑,避免类型匹配失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:57:01