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

Android:从Firestore获取当前用户上传书籍并展示于RecyclerView

实现当前用户上传书籍的展示方案

1. 确保Book实体类包含用户ID字段

你的Book数据类需要新增userId字段,用于存储上传该书籍的用户ID,这是筛选当前用户书籍的核心依据:

data class Book(
    val bookName: String,
    val createdAt: Long,
    // 保留你现有其他字段
    val userId: String // 新增字段:存储上传者的用户ID
)

2. 修改BookDao的addBook方法,存储上传用户ID

上传书籍时,需要将当前登录用户的ID写入Book对象,修改addBook方法:

class BookDao {

    private val db = FirebaseFirestore.getInstance()
    val bookCollection = db.collection("books")
    private val auth = FirebaseAuth.getInstance() // 新增FirebaseAuth实例

    fun addBook(book: Book?){ 
        val currentUser = auth.currentUser ?: return // 用户未登录则直接返回
        if (book!= null) {
            // 为Book对象补充当前用户ID
            val bookWithUserId = book.copy(userId = currentUser.uid)
            bookCollection.document(book.bookName).set(bookWithUserId)
        }
    }
}

3. 实现byBooks按钮的点击事件逻辑

在个人资料页面的Fragment/Activity中,给byBooks按钮绑定点击事件,构建专属查询并初始化RecyclerView:

// 示例:在ProfileFragment中编写逻辑
val bookDao = BookDao()
val auth = FirebaseAuth.getInstance()
val currentUserId = auth.currentUser?.uid ?: return // 未登录则终止逻辑

byBooks.setOnClickListener {
    // 构建查询:筛选userId等于当前用户ID的书籍,按创建时间倒序排列
    val query = bookDao.bookCollection
       .whereEqualTo("userId", currentUserId)
       .orderBy("createdAt", Query.Direction.DESCENDING)
    
    // 创建FirestoreRecyclerOptions
    val recyclerViewOptions = FirestoreRecyclerOptions.Builder<Book>()
       .setQuery(query, Book::class.java)
       .build()
    
    // 初始化适配器(若布局和首页一致,可直接复用HomeAdapter)
    val userBooksAdapter = HomeAdapter(recyclerViewOptions)
    
    // 绑定RecyclerView
    userBooksRecyclerView.adapter = userBooksAdapter
    
    // 启动Firestore数据监听
    userBooksAdapter.startListening()
}

4. 生命周期管理(避免内存泄漏)

如果是在Fragment中,需要在生命周期方法中管理适配器的监听状态:

private var userBooksAdapter: FirestoreRecyclerAdapter<*, *>? = null

override fun onStart() {
    super.onStart()
    userBooksAdapter?.startListening()
}

override fun onStop() {
    super.onStop()
    userBooksAdapter?.stopListening()
}

额外提示

  • 确保FirebaseAuth已正确配置,能正常获取用户登录状态
  • 若存在书籍名称重复的情况,建议用Firestore自动生成的文档ID作为存储键(bookCollection.add(bookWithUserId)),避免覆盖已有书籍
  • 如果需要对用户书籍做特殊UI处理,可以单独创建UserBooksAdapter继承FirestoreRecyclerAdapter

内容的提问来源于stack exchange,提问作者Divyansh Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 15:08:19