首页 > 解决方案 > Kotlin searchView 不会重新加载 Firebase 数组

问题描述

我有一个带有 2 个 recyclerViews 的活动,两个回收器都与 Firebase 一起使用。其中一个回收器显示查询结果,另一个回收器有一个监听器,每次 Firebase 有更新时都会更新。我添加了一个 searchView 来过滤来自 Firebase 的结果。我遇到的问题是,当我尝试从 Firebase 查询中搜索结果时,当我开始输入时,我看到了结果,但是当我单击 X 停止搜索时,适配器不会重新加载数组,我也不会除非我重新加载活动,否则请查看项目列表。我不确定我在这里缺少什么。非常感谢任何帮助/建议。这是我的代码:

适配器

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Filter
import android.widget.Filterable
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.eduardoz.ezmdapp.Model.Charges
import com.eduardoz.ezmdapp.R

class ChargesAdapter (private var charges: ArrayList<Charges>
                      , private var chargesAll: ArrayList<Charges>
                      , private val itemClick: (Charges) -> Unit)
    : RecyclerView.Adapter<ChargesAdapter.ViewHolder>()
    , Filterable {

    inner class ViewHolder(itemView: View, val itemClick: (Charges) -> Unit) : 
RecyclerView.ViewHolder(itemView) {
        private val chargeCode = itemView.findViewById<TextView>(R.id.chargeCodeTxt)
        private val chargeDescription = itemView.findViewById<TextView>(R.id.chargeDescriptionTxt)

        fun bindCharges(charges: Charges) {
            chargeCode?.text = charges.chargeCode
            chargeDescription?.text = charges.chargeDescription

            itemView.setOnClickListener { itemClick(charges) }
        }
    }

    init {
        this.charges = charges
        chargesAll = java.util.ArrayList(charges)
    }

    override fun getItemCount(): Int {
        return charges.count()
    }
    override fun onBindViewHolder(holder: ChargesAdapter.ViewHolder, position: Int) {
         holder.bindCharges(charges[position])
    }
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChargesAdapter.ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.charges_list, parent, false)
        return ViewHolder(view, itemClick)
    }

    override fun getFilter(): Filter {
        return searchFilter
    }

    private val searchFilter: Filter = object: Filter() {
        override fun performFiltering(constraint: CharSequence?): FilterResults {
            val filteredList: ArrayList<Charges> = ArrayList()
            if (constraint!!.isEmpty()) {
                filteredList.addAll(chargesAll)
            } else {
                for(item in chargesAll) {
                    if 
(item.chargeDescription.toLowerCase().contains(constraint.toString().toLowerCase())) {
                        filteredList.add(item)
                    }
                }
            }
            val searchResults = FilterResults()
                searchResults.values = filteredList

            return searchResults
        }

        override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
            charges.clear()
            charges.addAll(results!!.values as Collection<Charges>)
            notifyDataSetChanged()
        }
    }
}

活动

descriptionSearch.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
            override fun onQueryTextSubmit(query: String): Boolean {
               return false
            }
            override fun onQueryTextChange(newText: String): Boolean {
                if (newText.isNotEmpty()) {
                    searchViewBar(newText)
                } else {
                if (newText.isEmpty()) { //I ADDED THIS TO RELOAD THE ADAPTER
                    charges.clear()
                    chargeList()
                }
               }
               return false
            }
        })



 private fun searchViewBar(newText: String) {
        chargesListener = chargesCollectionRef
            .whereGreaterThanOrEqualTo(CHARGE_DESCRIPTION, newText)
            .whereLessThanOrEqualTo(CHARGE_DESCRIPTION, newText+"z")
            .addSnapshotListener(this) { snapshot, exception ->
                if (exception != null) {
                   println("error")
                }
                if (snapshot != null) {
                    charges.clear()
                    parseData(snapshot)
                }
            }
    }



fun parseData(snapshot: QuerySnapshot) {
    for (document in snapshot.documents) {
        val data = document.data
        val chargeCode = data!![CHARGE_CODE] as String
        val chargeDescription = data[CHARGE_DESCRIPTION] as String
        val chargeSpecialty = data[CHARGE_SPECIALTY] as String

        val newChargeList = Charges(chargeCode, chargeDescription, chargeSpecialty)

        charges.add(newChargeList)
    }
    chargesFromAdapter.notifyDataSetChanged()
}

标签: firebasekotlinandroid-recyclerviewsearchview

解决方案


推荐阅读