SearchView in RecyclerView работает некорректно

Делаю в своем приложении запрос друзей из VK с помощью Retrofit, наблюдаю их через LiveData, весь список выводит RecyclerView. Добавил SearchView для поиска по списку, он работает, но очень криво.

Когда я ввожу какое-либо имя друга, он его находит, но вместо того, чтобы убрать остальные элементы и оставить только тот, что соответствует имени, SearchView присваивает данное имя абсолютно всем элементам списка. Получается список одинаковых имен. Не могу понять, что делаю нет, код ниже.

FriendsActivity:

friendsViewModel.allFriends.observe(this, Observer {
            friendsAdapter.setFriends(it)
        })

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        val menuInflater = menuInflater
        menuInflater.inflate(R.menu.friends_menu, menu)

        val searchItem = menu?.findItem(R.id.action_search)
        if (searchItem != null) {
            val searchView = searchItem.actionView as SearchView

            searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
                override fun onQueryTextSubmit(query: String?): Boolean {
                    Timber.d("onQueryTextSubmit: $query")
                    return false
                }

                override fun onQueryTextChange(newText: String?): Boolean {
                    Timber.d("onQueryTextChange: $newText")
                    friendsAdapter.filter.filter(newText)

                    return false
                }
            })
        }

        return super.onCreateOptionsMenu(menu)
    }

FriendsAdapter:

class FriendsAdapter(private val context: Context) :
    ListAdapter<Friend, FriendsAdapter.FriendsHolder>(FriendsDiffCallback()), Filterable {

    private lateinit var binding: FriendsItemBinding
    private var listener: OnButtonClickListener? = null

    private var friendsList = ArrayList<Friend>()
    private var friendsListFull = ArrayList<Friend>()


    fun setFriends(friendsEntries: List<Friend>) {
        this.friendsList = friendsEntries as ArrayList<Friend>
        friendsListFull.addAll(friendsList)
        notifyDataSetChanged()
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FriendsHolder {
        binding = FriendsItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return FriendsHolder(binding)
    }

 override fun onBindViewHolder(holder: FriendsHolder, position: Int) {
        holder.bind(friendsList[position])
    }

override fun getItemCount(): Int {
        return friendsList.size
    }

inner class FriendsHolder(binding: FriendsItemBinding) : RecyclerView.ViewHolder(binding.root) {

        val firstName: TextView = binding.textFirstName
        val lastName: TextView = binding.textLastName
        val photoFriend: CircleImageView = binding.imageUser
        val switchTracking: SwitchMaterial = binding.switchTracking

        fun bind(friend: Friend) {
            firstName.text = friend.firstName
            lastName.text = friend.lastName
            Glide.with(context)
                .load(friend.photo)
                .into(photoFriend)
            switchTracking.isChecked = friend.tracking == true
        }

        init {
            switchTracking.setOnCheckedChangeListener { _, isChecked ->
                val friend1 = friendsList[adapterPosition]
                friend1.tracking = isChecked
                listener?.onTrackStart(friend1)
            }
        }
    }

override fun getFilter(): Filter {
        return filter
    }

    private val filter = object : Filter() {
        override fun performFiltering(constraint: CharSequence?): FilterResults {

            val filteredList = ArrayList<Friend>()

            if (constraint == null  || constraint.isEmpty()) {
                filteredList.addAll(friendsListFull)
            } else {
                val filterPattern = constraint.toString().toLowerCase(Locale.ROOT).trim()
                for (friend in friendsListFull) {
                    if (friend.firstName.toLowerCase(Locale.ROOT)
                            .contains(filterPattern) || friend.lastName.toLowerCase(Locale.ROOT)
                            .contains(filterPattern)
                    ) {
                        filteredList.add(friend)
                    }
                }
            }
            val filterResults = FilterResults()
            filterResults.values = filteredList

            return filterResults
        }

        @Suppress("UNCHECKED_CAST")
        override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
            friendsList.clear()
            friendsList.addAll(results?.values as List<Friend>)
            notifyDataSetChanged()
        }
    }

class FriendsDiffCallback : DiffUtil.ItemCallback<Friend>() {

    override fun areItemsTheSame(oldItem: Friend, newItem: Friend): Boolean =
        oldItem.id == newItem.id

    override fun areContentsTheSame(oldItem: Friend, newItem: Friend): Boolean =
        oldItem.firstName == newItem.firstName && oldItem.lastName == newItem.lastName &&
                oldItem.photo == newItem.photo && oldItem.tracking == newItem.tracking
}

скрин ошибки https://d.radikal.ru/d11/2102/73/642a11e498a1.jpg


Ответы (0 шт):