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