如何在Kotlin的RecyclerView中获取Firebase数据键并传递至另一个Activity?
我来帮你搞定这个问题~你现在的核心问题是没有把Firebase数据的键存储到数据模型里,导致点击时没法直接拿到对应节点的键。之前用position拼接Firebase引用的方式完全不对,因为RecyclerView的位置和Firebase节点的键没有直接关联,咱们一步步来改:
第一步:修改数据模型类RecyClass
先给RecyClass新增一个字段,专门用来存储Firebase数据节点的键:
data class RecyClass( val desc: String? = null, val image: String? = null, val key: String? = null // 新增字段存储Firebase节点键 )
第二步:读取Firebase数据时,把键赋值给RecyClass
当你从Firebase拉取数据的时候,要把每个子节点的键也取出来,赋值给对应的RecyClass对象:
// 示例:读取Firebase数据的代码,记得加上键的赋值 val databaseRef = FirebaseDatabase.getInstance().getReference("你的数据节点路径") databaseRef.addValueEventListener(object : ValueEventListener { override fun onDataChange(snapshot: DataSnapshot) { val userList = ArrayList<RecyClass>() for (childSnapshot in snapshot.children) { val post = childSnapshot.getValue(RecyClass::class.java) post?.key = childSnapshot.key // 将Firebase节点键赋值给post的key字段 post?.let { userList.add(it) } } // 把userList传给RecyclerAdapter更新UI } override fun onCancelled(error: DatabaseError) { // 处理数据读取错误 } })
第三步:修改Adapter的点击逻辑
现在点击RecyclerView的item时,直接从对应的RecyClass对象里取出预存的键,再通过Intent传递到下一个Activity:
override fun onClick(view: View?) { val pos = adapterPosition if (pos != RecyclerView.NO_POSITION) { // 先判断位置是否有效 val selectedPost = userdata[pos] val postKey = selectedPost.key // 直接拿到存储的Firebase节点键 // 用Toast验证键是否正确 Toast.makeText(mcon, postKey, Toast.LENGTH_LONG).show() // 把键通过Intent传递到ProfileActivity val intent = Intent(mcon, ProfileActivity::class.java) intent.putExtra("POST_KEY", postKey) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK mcon.startActivity(intent) } }
第四步:清理Adapter里的无效代码
你原来的代码里有一些冗余无效的代码,比如onBindViewHolder里的ref = FirebaseDatabase.getInstance().getReference(user.toString()),这行完全没必要,直接删掉就行;ViewHolder里重复初始化的代码也可以一并清理。
为什么之前的方法不行?
你之前在onClick里写的FirebaseDatabase.getInstance().getReference(pos.toString()).key,本质是创建了一个以RecyclerView位置数字为名称的新节点引用,根本不是你存储数据的原节点,所以拿到的肯定不是正确的键。而onBindViewHolder里如果用getRef(position)有效,那是因为Firebase官方的FirebaseRecyclerAdapter内部已经关联了每个位置对应的Firebase节点,但你用的是自定义的ArrayList,所以必须手动把键存到数据模型里才行。
内容的提问来源于stack exchange,提问作者a k

