【问题标题】:I am trying to add filter in recyclerView with edittext, but facing problems我正在尝试使用edittext在recyclerView中添加过滤器,但遇到问题
【发布时间】:2021-08-17 08:08:24
【问题描述】:

它是主要的 Activity 代码(已编辑)

在这里,我尝试添加 searchView 并过滤该 recyclerView,但我遇到了与 getfilter() 相关的问题。在 MainActivity 类 > searchView.setOnQuery... > mAdapter.getFilter().filter(query)。 可能是我错过了什么或者我做错了什么。

class MainActivity : AppCompatActivity() {

var recyclerView: RecyclerView? = null
var mAdapter: RecyclerView.Adapter<*>? = null
var layoutManager: RecyclerView.LayoutManager? = null
var personUtilsList: MutableList<PersonUtils>? = null
var personUtils: PersonUtils? = null
var rq: RequestQueue? = null
var request_url = "https://sheetdb.io/api/v1/wgkdzpdiyflckl9"
private lateinit var adp: CustomRecyclerAdapter

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    
    rq = Volley.newRequestQueue(this)
    recyclerView = findViewById<View>(R.id.recycleViewContainer) as RecyclerView
    recyclerView!!.setHasFixedSize(true)
    layoutManager = LinearLayoutManager(this)
    recyclerView!!.setHasFixedSize(true)
    recyclerView!!.layoutManager = layoutManager
    personUtilsList = java.util.ArrayList()

    sendRequest()
 
  search.addTextChangedListener {
       //search is a editText
        object  : TextWatcher{
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
            }

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
            }

            override fun afterTextChanged(s: Editable?) {
                filterList(s.toString())
            } } }
}
    sendRequest{...}

private fun filterList(toString: String) {
    var temp: MutableList<PersonUtils> = ArrayList()
    for (data in personUtilsList!!){
        if(data.personFirstName!!.contains(toString.capitalize())
        ){
            temp.add(data)
        }
    }
    adp.updateList(temp)
}

}

是适配器类(已编辑)

public class CustomRecyclerAdapter(private val context: Context, personUtils: List<PersonUtils>)
: RecyclerView.Adapter<CustomRecyclerAdapter.ViewHolder>(), Filterable {


private var personUtils: MutableList<PersonUtils>
private var utilsFilterList: MutableList<PersonUtils>


override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val v = LayoutInflater.from(parent.context).inflate(R.layout.single_list_item, parent, false)
    return ViewHolder(v)
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    holder.itemView.tag = personUtils[position]
    val pu = personUtils[position]
    holder.pName.text = pu.personFirstName.toString() + " .58-" + pu.personLastName.toString()
    holder.pJobProfile.text = pu.jobProfile
    holder.Department.text = pu.Department
    holder.email.text = pu.Email
    holder.phN.text = pu.PhoneNo
    Glide.with(this.context).load(pu.imgUrl.toString()).into(holder.img!!)
}



fun updateList(temp : MutableList<PersonUtils>){
    personUtils = temp
    notifyDataSetChanged()
}

override fun getItemCount(): Int {
    return personUtils.size
}

inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    var pName: TextView
    var pJobProfile: TextView
    var Department: TextView
    var email: TextView
    var phN: TextView
    var img: ImageView? = null

    init {
        pName = itemView.findViewById<View>(R.id.pNametxt) as TextView
        pJobProfile = itemView.findViewById<View>(R.id.pJobProfiletxt) as TextView
        Department = itemView.findViewById<View>(R.id.department_Branch) as TextView
        email = itemView.findViewById<View>(R.id.user_email) as TextView
        phN = itemView.findViewById<View>(R.id.user_phNo) as TextView
        img = itemView.findViewById<View>(R.id.userImg) as ImageView

        itemView.setOnClickListener { view ->
            val cpu = view.tag as PersonUtils
            Toast.makeText(view.context,
                    "Copied to clipboard", Toast.LENGTH_SHORT).show()

            val Clipboard = view.context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
            val myClip = ClipData.newPlainText(cpu.personFirstName, cpu.personFirstName)
            Clipboard.setPrimaryClip(myClip)
        }
    }
}

override fun getFilter(): Filter {

    return object : Filter() {
        override fun performFiltering(constraint: CharSequence?): FilterResults {
            var charString = constraint.toString()
            var filteredList : MutableList<PersonUtils> = mutableListOf()
            if (charString.isEmpty()) {

                filteredList.addAll(utilsFilterList)

            } else {
                val filteredList: MutableList<PersonUtils> = ArrayList()

                for (row in personUtils) {
                    if (row.personFirstName!!.toLowerCase().contains(charString.toLowerCase())
                            || row.Department!!.contains(constraint.toString())) {
                        filteredList.add(row)
                    }
                }
                utilsFilterList = filteredList
            }
            val filterResults = FilterResults()
            filterResults.values = utilsFilterList
            return filterResults
        }

        override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
            if(results !=null) {
                personUtils.clear()
                personUtils.addAll(results.values as Collection<PersonUtils>)
                        notifyDataSetChanged()
            }
        }
    }
}
init {
    this.personUtils = personUtils as MutableList<PersonUtils>
    utilsFilterList = personUtils.toMutableList()
}

}

【问题讨论】:

    标签: android kotlin android-recyclerview searchview


    【解决方案1】:

    您正在使用 utilsFilterList 过滤 Recyclerview 项目,但您从 getItemCount() 返回 personUtils.size

    因此,即使您在 publishResults() 中调用 notifyDataSetChanged(),您的主列表 personUtils 仍然保持不变,因为您将所有过滤结果存储在 utilsFilterList

    编辑:

    我通常使用下面的方法

    在**内标记的编辑

     public class CustomRecyclerAdapter(private val context: Context, personUtils: List) : RecyclerView.Adapter<CustomRecyclerAdapter.ViewHolder>(), Filterable {
    
    private var personUtils: MutableList<PersonUtils>
    *private var utilsFilterList : MutableList<PersonUtils> * 
    
    override fun getFilter(): Filter {
    
    return object : Filter()
    {
        override fun performFiltering(constraint: CharSequence?): FilterResults {
            var charString   =  constraint.toString()
            *val filteredList: MutableList<PersonUtils> = mutableListOf()*
            if(charString.isEmpty()){
               *filteredList.addAll(utilsFilterList)*
            }
            else{
                
                for(row in utilsFilterList){
                    if (row.personFirstName!!.toLowerCase().contains(charString.toLowerCase())
                            || row.Department!!.contains(constraint.toString())) {
                        filteredList.add(row)
                    }                    
                 }
            }
            val filterResults = FilterResults()
            filterResults.values = filteredList
            return filterResults
        }
    
        override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
            *if(results !=null) {
                personUtils.clear()
                personUtils.addAll(results.values as Collection<PersonUtils>)*
                notifyDataSetChanged()
            }
            }
        }
    }
      override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val v = LayoutInflater.from(parent.context).inflate(R.layout.single_list_item, parent, false)
        return ViewHolder(v)
    }
    
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.itemView.tag = personUtils[position]
        val pu = personUtils[position]
        holder.pName.text = pu.personFirstName.toString() + " .58-" + 
        pu.personLastName.toString()
        holder.pJobProfile.text = pu.jobProfile
        holder.Department.text = pu.Department
        holder.email.text = pu.Email
        holder.phN.text = pu.PhoneNo
    
    
    Glide.with(this.context).load(pu.imgUrl.toString()).into(holder.img!!)
    }
    
    override fun getItemCount(): Int {
        return personUtils.size
    }
    
    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var pName: TextView
        var pJobProfile: TextView
        var Department: TextView
        var email: TextView
        var phN: TextView
        var img : ImageView? = null
    
    init {
        pName = itemView.findViewById<View>(R.id.pNametxt) as TextView
        pJobProfile = itemView.findViewById<View>(R.id.pJobProfiletxt) as TextView
        Department = itemView.findViewById<View>(R.id.department_Branch) as TextView
        email = itemView.findViewById<View>(R.id.user_email) as TextView
        phN = itemView.findViewById<View>(R.id.user_phNo) as TextView
        img = itemView.findViewById<View>(R.id.userImg) as ImageView
    
        itemView.setOnClickListener { view ->
            val cpu = view.tag as PersonUtils
            Toast.makeText(view.context,
                    "Copied to clipboard", Toast.LENGTH_SHORT).show()
    
            val Clipboard = view.context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
            val myClip = ClipData.newPlainText(cpu.personFirstName, cpu.personFirstName)
            Clipboard.setPrimaryClip(myClip)
            }
        }
    }
    init {
        this.personUtils = personUtils as MutableList<PersonUtils>
        *utilsFilterList = personUtils.toMutableList()*
    }
    }
    

    【讨论】:

    • 所以根据你我应该做哪些改变,如果你用解决方案解释它会很棒。提前致谢。编辑:我尝试返回 utilsFilterList.size 而不是 personUtils.size 但它给出了一个空指针异常。
    • 在得到空指针异常后,我在适配器的 init 中添加了 this.utilsFilterList = personUtils,并在 getItemCount() 中返回了 utilsFilterlist。应用正在运行,但 searchView 仍未过滤。
    • 用代码编辑了我的原始答案.....检查它是否适合你
    • 我实现了你的代码,但仍然没有过滤任何东西,这次我编辑了主 Activity 和 recyclerView 代码。检查主要活动代码和 recylerView 代码,请告诉我在这里做错了什么。
    • 当您实现我的代码时,您是否从适配器中的getItemCout() 返回了personUtils.sizeutilsFilterList!!.size
    猜你喜欢
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多