Фильтрация RecyclerView c ListAdapter

Проверка знаний. Создавайте свои задания или решайте существующие
Правила форума
Информация о разделе и рекомендации по созданию тем: viewtopic.php?f=18&t=1036
Ответить
alexb
Сообщения: 1
Зарегистрирован: 11 окт 2019, 11:44

Фильтрация RecyclerView c ListAdapter

Сообщение alexb » 11 окт 2019, 11:50

Есть RecyclerView в котором отображаются данных из REST-сервиса, в качестве адаптера используется ListAdapter, т.к. он позволяет легко и быстро обновлять список (для сравнения и поиска изменившихся элементов использует DiffUtil в фоне).

Код: Выделить всё

class BookAdapter(private val clickListener: ClickHandler) :
    ListAdapter<Book, BookAdapter.ViewHolder>(BooksDiffCallback()) {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder.from(parent)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(getItem(position)!!, clickListener)
    }

    class ViewHolder private constructor(val binding: BookItemBinding) :
        RecyclerView.ViewHolder(binding.root) {

        fun bind(
            item: Book,
            clickListener: ClickHandler
        ) {
            binding.book = item
            binding.clickListener = clickListener
            binding.executePendingBindings()
        }

        companion object {
            fun from(parent: ViewGroup): ViewHolder {
                val inflater = LayoutInflater.from(parent.context)
                val binding = BookItemBinding.inflate(inflater, parent, false)
                return ViewHolder(binding)
            }
        }
    }
}

class BooksDiffCallback : DiffUtil.ItemCallback<Book>() {
    override fun areItemsTheSame(oldItem: Book, newItem: Book): Boolean {
        return oldItem.id == newItem.id
    }

    override fun areContentsTheSame(oldItem: Book, newItem: Book): Boolean {
        return oldItem == newItem
    }

}

class ClickHandler(val clickListener: (id: String) -> Unit) {
    fun onClick(item: Book) = clickListener(item.id)
}
Нужно добавить возможность поиска/фильтрации элементов списка. Т.е. реализовать интерфейс Filterable и метод getFilter().

Ответить