Я пытаюсь отфильтровать свой 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()
}
}
}
}