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
相关产品推荐
相关产品推荐

