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

Firebase查询特定userId关联手环数据,Kotlin实现Android RecyclerView展示

问题描述

我在Firebase Realtime Database中有如下结构,其中pairs节点的子节点键采用braceletid-userid的格式,用来关联手环和用户:

{
  "bracelets": {
    "12345": {
      "braceletID": 12345,
      "braceletName": "m1",
      "latitude": 21.42,
      "longitude": 22.827237
    },
    "4545": {
      "braceletID": 4545,
      "braceletName": "m3",
      "latitude": 21.421189,
      "longitude": 22.827237
    }
  },
  "pairs": {
    "12345-xfdftt56454": {
      "braceletID": "12345",
      "braceletName": "m1",
      "userId": "xfdftt56454"
    },
    "4545-5W2lRzan1": {
      "braceletID": "4545",
      "braceletName": "m3",
      "userId": "5W2lRzan1"
    }
  },
  "users": {
    "xfdftt56454": {
      "name": "h",
      "phone": "0555",
      "uid": "xfdftt56454"
    },
    "5W2lRzan1": {
      "name": "m",
      "phone": "013242",
      "uid": "5W2lRzan1"
    }
  }
}

需要实现:在Android端用Kotlin编写代码,查询pairs节点中所有包含特定userId(比如xfdftt56454)的子节点,提取braceletID和braceletName,并将手环名称填充到RecyclerView列表中。

解决方案

1. 创建数据模型类

定义数据类映射pairs节点的结构:

data class BraceletPair(
    val braceletID: String? = null,
    val braceletName: String? = null,
    val userId: String? = null
)

2. Firebase查询逻辑

通过Firebase API筛选指定userId的配对数据:

import com.google.firebase.database.DatabaseReference
import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.database.Query

// 获取数据库引用
val dbRef: DatabaseReference = FirebaseDatabase.getInstance().reference

// 构建查询:筛选pairs中userId匹配目标值的条目
fun getBraceletsForUser(targetUserId: String): Query {
    return dbRef.child("pairs").orderByChild("userId").equalTo(targetUserId)
}

3. RecyclerView适配器

编写适配器绑定手环名称到列表项:

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView

class BraceletAdapter(private val braceletNames: List<String>) :
    RecyclerView.Adapter<BraceletAdapter.BraceletViewHolder>() {

    inner class BraceletViewHolder(val binding: ItemBraceletBinding) :
        RecyclerView.ViewHolder(binding.root)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BraceletViewHolder {
        val binding = ItemBraceletBinding.inflate(
            LayoutInflater.from(parent.context),
            parent,
            false
        )
        return BraceletViewHolder(binding)
    }

    override fun onBindViewHolder(holder: BraceletViewHolder, position: Int) {
        holder.binding.tvBraceletName.text = braceletNames[position]
    }

    override fun getItemCount(): Int {
        return braceletNames.size
    }
}

注:需提前启用View Binding,列表项布局item_bracelet.xml需包含id为tvBraceletName的TextView用于显示名称。

4. 界面整合代码

在Activity/Fragment中初始化RecyclerView并执行查询:

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.ValueEventListener

class BraceletListActivity : AppCompatActivity() {
    private lateinit var adapter: BraceletAdapter
    private val braceletNames = mutableListOf<String>()

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

        // 初始化RecyclerView
        val recyclerView = findViewById<RecyclerView>(R.id.rvBracelets)
        recyclerView.layoutManager = LinearLayoutManager(this)
        adapter = BraceletAdapter(braceletNames)
        recyclerView.adapter = adapter

        // 目标用户ID,可根据实际场景传入
        val targetUserId = "xfdftt56454"
        val query = getBraceletsForUser(targetUserId)

        // 监听数据变化并更新列表
        query.addValueEventListener(object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
                braceletNames.clear()
                snapshot.children.forEach { pairSnapshot ->
                    val pair = pairSnapshot.getValue(BraceletPair::class.java)
                    pair?.braceletName?.let { braceletNames.add(it) }
                }
                adapter.notifyDataSetChanged()
            }

            override fun onCancelled(error: DatabaseError) {
                error.toException().printStackTrace()
            }
        })
    }
}

注意事项

  • 确保项目已配置Firebase Realtime Database依赖,并添加INTERNET权限。
  • 若只需单次查询,可替换addValueEventListener为addListenerForSingleValueEvent。
  • 数据类字段名需与Firebase节点键完全一致,否则映射失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 16:23:12