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

Android开发:如何对Firebase实时数据库列表按名称和价格过滤

实现商品列表过滤功能方案

1. 准备基础数据与适配器

先确保商品数据类定义清晰,列表适配器支持动态更新数据:

// 商品数据类(适配Firebase Realtime Database的字段)
data class Product(
    val id: String? = null,
    val name: String? = "",
    val price: Double? = 0.0
)

// RecyclerView适配器示例
class ProductAdapter(private var products: List<Product>) : RecyclerView.Adapter<ProductAdapter.ViewHolder>() {
    // 常规ViewHolder创建、数据绑定逻辑省略

    // 用于更新列表数据的方法
    fun updateData(newProducts: List<Product>) {
        products = newProducts
        notifyDataSetChanged()
    }

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        // 绑定视图控件逻辑省略
    }
}

在Activity/Fragment中初始化核心变量:

private lateinit var originalProducts: List<Product> // 存储从Firebase获取的全量原始数据
private lateinit var filteredProducts: MutableList<Product>
private lateinit var productAdapter: ProductAdapter

从Firebase获取数据后完成初始化:

// Firebase数据获取回调示例
firebaseDatabase.getReference("products")
    .addValueEventListener(object : ValueEventListener {
        override fun onDataChange(snapshot: DataSnapshot) {
            originalProducts = snapshot.children.mapNotNull { it.getValue(Product::class.java) }
            filteredProducts = originalProducts.toMutableList()
            productAdapter = ProductAdapter(filteredProducts)
            recyclerView.adapter = productAdapter
        }

        override fun onCancelled(error: DatabaseError) {
            // 处理数据获取错误
        }
    })

2. 编写过滤逻辑

根据需求实现单独或组合过滤的方法:

按商品名称模糊过滤

private fun filterByName(keyword: String) {
    filteredProducts.clear()
    filteredProducts.addAll(originalProducts.filter { product ->
        product.name?.contains(keyword, ignoreCase = true) == true
    })
    productAdapter.updateData(filteredProducts)
}

按价格区间过滤

// 示例:过滤价格低于指定阈值的商品
private fun filterByMaxPrice(maxPrice: Double) {
    filteredProducts.clear()
    filteredProducts.addAll(originalProducts.filter { product ->
        product.price ?: 0.0 <= maxPrice
    })
    productAdapter.updateData(filteredProducts)
}

组合过滤(名称+价格)

如果需要同时应用多个过滤条件:

private fun filterCombined(nameKeyword: String, maxPrice: Double) {
    filteredProducts.clear()
    filteredProducts.addAll(originalProducts.filter { product ->
        val nameMatch = product.name?.contains(nameKeyword, ignoreCase = true) == true
        val priceMatch = product.price ?: 0.0 <= maxPrice
        nameMatch && priceMatch
    })
    productAdapter.updateData(filteredProducts)
}

3. 绑定Material Chips点击事件

针对ChipGroup的多选/单选场景,设置对应的点击监听:

多选Chip场景(ChipGroup)

chipGroup.setOnCheckedStateChangeListener { _, checkedIds ->
    // 每次过滤前重置为原始数据,避免多次过滤导致数据偏差
    filteredProducts.clear()
    filteredProducts.addAll(originalProducts)

    checkedIds.forEach { chipId ->
        when (chipId) {
            R.id.chip_name_phone -> filterByName("手机") // 按名称含"手机"过滤
            R.id.chip_price_under_100 -> filterByMaxPrice(100.0) // 价格低于100
            R.id.chip_combined_phone_100 -> filterCombined("手机", 100.0) // 组合过滤
            // 其他Chip的过滤逻辑补充
        }
    }
    // 未选中任何Chip时显示全量数据
    if (checkedIds.isEmpty()) {
        productAdapter.updateData(originalProducts)
    }
}

单个Chip切换过滤状态

chipPriceUnder50.setOnClickListener {
    if (chipPriceUnder50.isChecked) {
        filterByMaxPrice(50.0)
    } else {
        productAdapter.updateData(originalProducts)
    }
}

4. 关键注意事项

  • 所有过滤操作必须基于originalProducts原始数据执行,避免在已过滤数据上重复过滤导致数据丢失
  • 处理Firebase字段可能为null的情况,做安全判空(比如product.name或product.price为null的场景)
  • 如果数据量较大,可将过滤逻辑放在后台线程执行,避免阻塞主线程影响UI流畅度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:20:28