我正在尝试使用edittext在recyclerView中添加过滤器,但面临问题

如何解决我正在尝试使用edittext在recyclerView中添加过滤器,但面临问题

这是主要活动代码(已编辑)

在这里,我尝试添加 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?,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()
}

}

解决方法

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

因此,即使您在 notifyDataSetChanged() 中调用 publishResults(),您的主列表 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()*
}
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?