android 在实现XML视图筛选器时,

thtygnil  于 2024-01-04  发布在  Android
关注(0)|答案(1)|浏览(157)

我在实现一个过滤器的时候遇到了java.lang.IndexOutOfBoundsException。在onBindViewHolder方法中出现了错误,并且位置值大于过滤列表,所以它产生了indexOutOfBoundException。我不知道为什么即使我调用了notifyDataSetChanged(),位置值也大于过滤列表。这是我的一个过滤器适配器的代码。请给予我一些解决这个问题的方法。谢谢!!

  1. class MainListAdapter(
  2. private val context: Context,
  3. private val item_list: MutableList<items_list>) :
  4. RecyclerView.Adapter<MainListAdapter.ViewHolder>(),
  5. Filterable {
  6. var filteredList: MutableList<items_list>? = item_list
  7. inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
  8. val Photo = view.PhotoImg
  9. val item_name = view.item_name
  10. fun bind(item: items_list, context: Context) {
  11. val resourceId =
  12. context.resources.getIdentifier(item.photo, "drawable", context.packageName)
  13. Photo.setImageResource(resourceId)
  14. item_name.text = item.item_name
  15. }
  16. }
  17. override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
  18. val itemView = LayoutInflater.from(context).inflate(R.layout.item, parent, false)
  19. return ViewHolder(itemView)
  20. }
  21. override fun onBindViewHolder(holder: ViewHolder, position: Int) {
  22. val current = filteredList?.get(position)
  23. if (current != null) {
  24. holder.bind(current, context)
  25. }
  26. }
  27. override fun getItemCount(): Int = item_list!!.size
  28. override fun getFilter(): Filter? {
  29. return object : Filter() {
  30. override fun performFiltering(constraint: CharSequence): FilterResults {
  31. val charString = constraint.toString()
  32. filteredList = if (charString.isEmpty()) {
  33. item_list
  34. } else {
  35. val filteringList = ArrayList<items_list>()
  36. if (item_list != null) {
  37. for (name in item_list) {
  38. if (name.item_name.toLowerCase().contains(charString.toLowerCase())) {
  39. filteringList.add(name);
  40. }
  41. }
  42. }
  43. filteringList
  44. }
  45. val filterResults = FilterResults()
  46. filterResults.values = filteredList
  47. return filterResults
  48. }
  49. override fun publishResults(constraint: CharSequence, results: FilterResults) {
  50. filteredList = results.values as ArrayList<items_list>
  51. notifyDataSetChanged()
  52. }
  53. }
  54. }

字符串
}

m3eecexj

m3eecexj1#

这是因为你的getCount返回item_list.size,但是你正在将位置索引到filtered_list中,filtered_list是item_list的子集。getCount应该返回过滤列表的大小,而不是原始列表。通过返回原始列表的大小,这是更大的,你使回收器列表尝试显示超出过滤列表边界的项目,并导致它抛出此错误。

相关问题