[英]Recyclerview Filter not working in kotlin android
我尝试在适配器中使用过滤器 function 过滤回收器视图,但它不起作用。
我添加了这样的searchview监听器:
init(){
binding.svCategory.setOnQueryTextListener(this)
}
override fun onQueryTextSubmit(query: String?): Boolean {
return true
}
override fun onQueryTextChange(newText: String?): Boolean {
adapterCategories.getFilter().filter(newText)
return true
}
这是我创建的适配器:
class CategoriesAdapter(
var context: Context,
var listCategories: ArrayList<Categories>,
var onGalleryClick: (Any) -> Unit,
var onCameraClick: (Any) -> Unit,
var onDeleteClick: (Any) -> Unit
) :
RecyclerView.Adapter<CategoriesAdapter.CategoriesViewHolder>(), Filterable {
private var filterList: ArrayList<Categories> = listCategories
init {
filterList = listCategories
}
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): CategoriesViewHolder {
val view = LayoutInflater.from(viewGroup.context)
.inflate(R.layout.rv_category_item, viewGroup, false)
return CategoriesViewHolder(view)
}
override fun onBindViewHolder(holder: CategoriesViewHolder, position: Int) {
holder.tvCategoryName.text = listCategories[position].name
if (listCategories[position].imageUri != null) {
Glide
.with(context)
.load(Uri.parse(listCategories[position].imageUri))
.centerCrop()
.placeholder(R.drawable.add)
.into(holder.ivImage)
}
if (listCategories[position].imageUri.isNullOrEmpty()) {
holder.ivDelete.visibility = View.GONE
} else {
holder.ivDelete.visibility = View.VISIBLE
}
holder.ivGallery.setOnClickListener {
onGalleryClick(position)
}
holder.ivCamera.setOnClickListener {
onCameraClick(position)
}
holder.ivDelete.setOnClickListener {
onDeleteClick(position)
}
}
override fun getItemCount(): Int {
return filterList.size
}
override fun getFilter(): Filter {
return object : Filter() {
override fun performFiltering(constraint: CharSequence?): FilterResults {
val charSearch = constraint.toString()
filterList = if (charSearch.isEmpty()) {
listCategories
} else {
val resultList = ArrayList<Categories>()
for (row in listCategories) {
if (row.name.toLowerCase().contains(constraint.toString().toLowerCase())) {
resultList.add(row)
}
}
resultList
}
val filterResults = FilterResults()
filterResults.values = filterList
return filterResults
}
override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
filterList = results?.values as ArrayList<Categories>
notifyDataSetChanged()
}
}
}
class CategoriesViewHolder(view: View) : RecyclerView.ViewHolder(view) {
var tvCategoryName: AppCompatTextView = view.findViewById(R.id.tvCategoryName)
var ivImage: AppCompatImageView = view.findViewById(R.id.ivImage)
var ivGallery: AppCompatImageView = view.findViewById(R.id.ivGallery)
var ivCamera: AppCompatImageView = view.findViewById(R.id.ivCamera)
var ivDelete: AppCompatImageView = view.findViewById(R.id.ivDelete)
}
}
但它没有正确过滤项目,它显示正确的计数但没有在回收站视图中显示正确的项目,
那么这个问题该怎么办呢? 任何人都可以帮忙吗?
提前致谢。
在onBindViewHolder
中,您使用的是listCategories[position]
而不是filterList[position]
。 开始时它具有与原始listCategories
相同的内容( init{}
调用),但过滤后getItemCount
返回过滤结果的大小,但在onBindViewHolder
中仍然绘制listCategories
数组。 仅在listCategories
filterList
,仅在开始时可用(填充filterList
)和恢复原始列表时(例如,当查询被删除时)
PS。 仅在performFiltering
内的一些临时数组上工作,目前您正在严格更改filterList
行filterList = if
。 只需在filterList
之前添加var
。 这将使该数组仅在本地可用,它将附加到filterResults.values
然后在publishResults
中更新(这些函数在不同的Thread
中调用)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.