繁体   English   中英

Recyclerview 过滤器在 kotlin android 中不起作用

[英]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内的一些临时数组上工作,目前您正在严格更改filterListfilterList = if 只需在filterList之前添加var 这将使该数组仅在本地可用,它将附加到filterResults.values然后在publishResults中更新(这些函数在不同的Thread中调用)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM