如何在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
相关产品推荐
相关产品推荐

