android SearchView с Kotlin результатов не было - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь отфильтровать свой recyclerview с помощью SearchView внутри фрагмента, но я не получаю никакого результата, когда ввожу текст в виджет поиска. Я попытался просмотреть свой код, но не могу понять, в чем я ошибаюсь.

Вот мой фрагмент

CountryFragment.kt

class CountriesFragment : Fragment() {
    private lateinit var factory: CountriesViewModelFactory
    private lateinit var viewModel: CountriesViewModel
    private lateinit var adapter: CountriesAdapter
    override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.countries_fragment, container, false)
}

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    val api = Api()
    val repository = CountriesRepository(api)
    factory = CountriesViewModelFactory(repository)
    viewModel = ViewModelProviders.of(this, factory).get(CountriesViewModel::class.java)
    viewModel.getCountries()
    adapter = CountriesAdapter(arrayListOf())
    recycler_view_data.adapter = adapter

    viewModel.countries.observe(viewLifecycleOwner, Observer { countries ->
        recycler_view_data.also {
            it.layoutManager =
                LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
            it.setHasFixedSize(true)
            it.adapter = CountriesAdapter(countries)

        }
    })

    country_search.setOnQueryTextListener(object :SearchView.OnQueryTextListener{
        override fun onQueryTextChange(newText: String?): Boolean {
            adapter.filter.filter(newText)
            return true
        }

        override fun onQueryTextSubmit(query: String?): Boolean {
            return false
        }
    })

    swipe_refresh.setOnRefreshListener {
        viewModel.countries.observe(viewLifecycleOwner, Observer { countries ->
            recycler_view_data.also {
                it.layoutManager = LinearLayoutManager(requireContext())
                it.setHasFixedSize(true)
                it.adapter = CountriesAdapter(countries)


            }
        })
        swipe_refresh.isRefreshing = false
    }
}

}

и вот мой адаптер recyclerview CountryAdapter

class CountriesAdapter(private val countries: ArrayList<CountriesItem>) :
    RecyclerView.Adapter<CountriesAdapter.ViewHolder>(), Filterable {

    var countryFilterList = ArrayList<CountriesItem>()
    lateinit var mContext: Context

    init {
        countryFilterList = countries
    }

override fun getItemCount() = countryFilterList.size


override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {

    val countries = ViewHolder(
        DataBindingUtil.inflate(
            LayoutInflater.from(parent.context),
            R.layout.recyclerview_items,
            parent,
            false
        )
    )
    mContext = parent.context

    return countries
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    holder.recyclerView.viewmodel = countries[position]
}

inner class ViewHolder(val recyclerView: RecyclerviewItemsBinding) :
    RecyclerView.ViewHolder(recyclerView.root) {
}

override fun getFilter(): Filter {
    return object : Filter() {
        override fun performFiltering(constraint: CharSequence?): FilterResults {
            val charSearch = constraint.toString()
            if (charSearch.isEmpty()) {
                countryFilterList = countries
            } else {
                val result = ArrayList<CountriesItem>()
                for (row in countries) {
                    if (row.country.toLowerCase(Locale.ROOT)
                            .contains(charSearch.toLowerCase(Locale.ROOT))
                    ) {
                        result.add(row)
                    }
                }
                countryFilterList = result
            }

            val filterResults = FilterResults()
            filterResults.values = countryFilterList
            return filterResults
        }

        @Suppress("UNCHECKED_CAST")
        override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
            countryFilterList = results?.values as ArrayList<CountriesItem>
            notifyDataSetChanged()

        }
    }
}

}

...