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

Recyclerview适配器加条件后Cardview不显示数据但SearchView正常

问题根因

  • 你将异步Firebase查询逻辑放在了ViewHolder的bind方法中,初始加载列表时异步请求还未返回,所有UI控件都没有被赋值,因此CardView显示为空。
  • 你在异步回调中直接修改booklist删除不符合学院匹配条件的项后,没有调用notifyDataSetChanged()通知RecyclerView刷新,数据修改不会同步到UI。
  • 过滤逻辑放在bind方法中属于严重设计错误:bind会在列表滚动时反复触发,会生成大量重复无效的Firebase查询,不仅性能极差,还容易出现列表项数据错乱的问题。触发SearchView时你主动调用了filterlist方法刷新列表,此时之前的异步请求已全部返回,因此数据能正常展示。

解决方案

1. 重构数据过滤逻辑

把学院匹配的过滤逻辑从适配器中移出,放到你加载书籍列表的业务层:

  • 提前获取并缓存当前登录用户的学院信息,不要每次渲染列表项都重复查询
  • 加载全量书籍列表时,异步遍历匹配每本书的上传者学院,只将符合条件的书籍加入最终展示列表
  • 全部过滤完成后再将数据集传给适配器,通知列表刷新

2. 改造适配器代码

简化适配器逻辑,只负责处理纯UI渲染工作,移除内部的Firebase查询逻辑:

package com.bookqueen.bookqueen.adapters

class bookadapter(
    private var booklist: ArrayList<Booksmodel>,
    private val itemClickListener: OnBookItemClicklistner
) : RecyclerView.Adapter<bookadapter.bookholder>() {

    var searchText: String = ""

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): bookholder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.singlebook, parent, false)
        return bookholder(view)
    }

    @SuppressLint("NotifyDataSetChanged")
    fun filterlist(filterlist: ArrayList<Booksmodel>, searchText: String) {
        booklist = filterlist
        this.searchText = searchText
        notifyDataSetChanged()
    }

    override fun onBindViewHolder(holder: bookholder, position: Int) {
        val book = booklist[position]
        holder.bind(book, itemClickListener)
    }

    override fun getItemCount(): Int = booklist.size

    inner class bookholder(view: View) : RecyclerView.ViewHolder(view) {
        val bookname: TextView = view.findViewById(R.id.recbooknametxt)
        val bookpublication = view.findViewById<TextView>(R.id.recbookpubtxt)
        val bookdept = view.findViewById<TextView>(R.id.recbookdepttxt)
        val bookimage = view.findViewById<ImageView>(R.id.recbookimg)

        fun bind(book: Booksmodel, clicklistner: OnBookItemClicklistner) {
            // 只保留纯UI渲染逻辑
            if (searchText.isNotBlank()) {
                val highlightedText = book.BookName!!.replace(
                    searchText,
                    "<font color='red'>$searchText</font>",
                    true
                )
                bookname.text = HtmlCompat.fromHtml(
                    highlightedText,
                    HtmlCompat.FROM_HTML_MODE_LEGACY
                )
            } else {
                bookname.text = book.BookName
            }
            bookpublication.text = book.BookPublication
            bookdept.text = book.Department
            Picasso.get().load(book.BookImage).into(bookimage)

            itemView.setOnClickListener {
                clicklistner.onBookItemclick(book)
            }
        }
    }

    interface OnBookItemClicklistner {
        fun onBookItemclick(books: Booksmodel)
    }
}

内容的提问来源于stack exchange,提问作者Ashish Dawkhar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 17:06:02