Поиск по RecyclerView
У меня стоит задача отфильтровать слова по поиску в RecyclerView, я написал метод, но он не работает.
class WordsFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_words, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
etSearchBar.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) {
Log.e("1", "Он должен был увидеть " + s)
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
updateSearch() // эта строчка не работает Cannot find decloration to go to
}
})
val repository: WordsRepository =
WordsRepositoryImpl(WordsDatabaseDataSourceImpl(context!!))
val items = repository.getAllWords()
val myAdapter = MainAdapter(items, object : MainAdapter.Callback {
override fun onItemClicked(item: Word) {
//TODO Сюда придёт элемент, по которому кликнули. Можно дальше с ним работать
}
})
myRecycler.adapter = myAdapter
fun updateSearch(s:String) {
if(s?.length == 0){
myAdapter.items = repository.getAllWords() // Вывод всего списка, если EditText пустой
} else {
myAdapter.items = repository.findWords(String()) // Вывод отфильтрованного списка (фильтрацию я описал в другом классе в SQL)
}
}
myAdapter.notifyDataSetChanged() // Обновление адаптера
}
}
Я не пойму, в чем ошибка, все делал по уроку, но updateSearch все равно не работает. Подскажите, в чем может быть проблема? Буду очень благодарен. Заранее спасибо.
Ответы (1 шт):
Автор решения: Георгий Джалагония
→ Ссылка
Функция updateSearch принимает один аргумент. Ты же его не посылаешь, вот и получаешь cannot find declaration to go.
Вообще ты в целом можешь подключить фильтр к адаптеру. В общих чертах делает это примерно так:
//твой класс адаптера
private val filter: Filter
init {
filter = attachFilter()
}
private fun attachFilter() = object : Filter() {
override fun performFiltering(charSequence: CharSequence): FilterResults
{
val filteredList: MutableList<Items (string/int/твой класс)> = ArrayList()
if (charSequence.isEmpty()) {
filteredList.addAll(mItemList)
} else {
//mItemList - список всех твоих элементов
//рекомендую сделать его копию, чтобы потом, в случаях если строка для поиска пустая
//можно было просто восстановить первоначальные элементы
filteredList.addAll(mItemList.filter { currentItem ->
currentItem.contains(charSequence, true)
})
}
val filterResults = FilterResults()
filterResults.values = filteredList
return filterResults
}
override fun publishResults(
charSequence: CharSequence,
filterResults: FilterResults
) {
mFilteredItemList.clear()
mFilteredItemList.addAll(filterResults.values as Collection<твой класс>)
notifyDataSetChanged()
}
}
И после этого просто в методе onTextChanged твоего TextWatcher вызывай
adapter.filter.filter(s)
Ах, да, не забудь унаследоваться от Filterable в твоем адаптере