Kotlin searchView не перезагружает массив Firebase - PullRequest
0 голосов
/ 13 июля 2020

У меня есть одно действие с 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()
        }
    }
}

Activity

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()
}
...