簡體   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