[英]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.