gpt4 book ai didi

kotlin - 使用 SearchView 过滤 RecyclerView/ListAdapter

转载 作者:行者123 更新时间:2023-12-02 11:53:38 25 4
gpt4 key购买 nike

我正在尝试为我的 RecyclerView 实现过滤器.我使用数据绑定(bind),我的适配器是 ListAdapter子类如下图

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()方法。这就是我坚持的地方:我根本不知道如何实现 getFilter()ListAdapter 的情况下.任何帮助将不胜感激。

最佳答案

我遇到了类似的问题,并尝试使用类似于 Maor Hadad 描述的方法来解决它多于。它有时会起作用,并且在

Filter.publishResult()



方法。所以,我以这种方式解决了它。
首先创建一个变量 private var unfilteredlist = listOf<BaseDataItem>()和一个方法
fun modifyList(list : List<BaseDataItem>) {
unfilteredList = list
submitList(list)
}

fun filter(query: CharSequence?) {
val list = mutableListOf<BaseDataItem>()

// perform the data filtering
if(!query.isNullOrEmpty()) {
list.addAll(unfilteredList.filter {
it.*field1*.toLowerCase(Locale.getDefault()).contains(query.toString().toLowerCase(Locale.getDefault())) ||
it.*field2*.toLowerCase(Locale.getDefault()).contains(query.toString().toLowerCase(Locale.getDefault())) })
} else {
list.addAll(unfilteredList)
}

submitList(list)
}

BookAdapter类(class)。在哪里 *field1**field2* (您可以添加更多字段)是您希望搜索查询匹配的字段。然后,无论您在哪里调用 adapter.submitList(List<BaseDataItem>)在原始代码中,将其替换为自定义方法 adapter.modifyList(List<BaseDataItem>) .
然后写 searchView.setOnQueryTextListener像下面的那个
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String): Boolean {

return false
}

override fun onQueryTextChange(newText: String): Boolean {

(binding.recycler.adapter as ItemAdapter).filter(newText)
return true
}
})

不要忘记删除 Filterable接口(interface)及其方法,你不再需要它们了

关于kotlin - 使用 SearchView 过滤 RecyclerView/ListAdapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58319242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com