如何正确实现带有recyclerview的searchview?

如何解决如何正确实现带有recyclerview的searchview?

我已经用recyclerView实现了searchView,它无法正常工作,并且出现错误,我不明白自己在哪里犯错误。我实现了searchview逻辑的MainActivity下面

我已经用recyclerView实现了searchView,它无法正常工作,并且出现错误,我不明白自己在哪里犯错误。我实现了searchview逻辑的MainActivity下面

 class MemberActivity : AppCompatActivity() {
    
        private var memberAdapter: MemberAdapter? = null
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_member)
    
    
            val compositedisposable = Compositedisposable()
            compositedisposable.add(
                ServiceBuilder.buildService(SpectrumInterface::class.java)
                    .getMembers()
                    .toObservable()
                    .flatMap { Observable.fromIterable(it) }
                    .flatMap { Observable.fromIterable(it.members) }
                    .toList()
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(
                        { members -> onResponse(members) },{ t -> onFailure(t) })
            )
    
    
    
            memberAdapter = MemberAdapter()
            recyclerView.setHasFixedSize(true)
            recyclerView.layoutManager = linearlayoutmanager(this)
            recyclerView.addItemdecoration(DividerItemdecoration(this,LinearLayout.VERTICAL))
    
    
            private fun onFailure(t: Throwable) {
                Toast.makeText(this,t.message,Toast.LENGTH_SHORT).show()
            }
    
            private fun onResponse(members: List<Member>) {
                progressBar.visibility = View.GONE
                (recyclerView.adapter as MemberAdapter).setMembers(members)
            }
    
    
            override fun onQueryTextSubmit(query: String?): Boolean {
                return false
            }
    
            override fun onQueryTextChange(newText: String?): Boolean {
                memberAdapter?.getFilter()?.filter(newText)
    
                return true
            }
    
    
            ascendingButton.setonClickListener
            {
                memberAdapter?.sortAscending()
            }
    
            descendingButton.setonClickListener {
                memberAdapter?.sortDescending()
            }
    
        }
    
    
    
    }

在实现了过滤器逻辑的适配器下面

class MemberAdapter : RecyclerView.Adapter<MemberAdapter.MemberViewHolder>() {
    private val members = mutablelistof<Member>()

    fun setMembers(data: List<Member>) {
        members.clear()
        members.addAll(data)
        notifyDataSetChanged()
    }

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

    override fun getItemCount() = members.size




    fun sortAscending() {
        members.sortBy { it.age }
        notifyDataSetChanged()
    }

    fun sortDescending() {
        members.sortByDescending { it.age }
        notifyDataSetChanged()
    }

    fun getFilter(): Filter {
        return object : Filter() {
            override fun performFiltering(charSequence: CharSequence): FilterResults {
                val query = charSequence.toString()

                val filtered: MutableList<Member> = ArrayList()

                if (query.isEmpty()) {
                    filtered.clear()
                    filtered.addAll(members)
                } else {
                    filtered.addAll(members.filter {
                        it.id.toLowerCase(Locale.ROOT)
                            .contains(query.toLowerCase(Locale.ROOT)) || it.age.toString()
                            .contains(query)
                    })
                }

                val results = FilterResults()
                results.count = filtered.size
                results.values = filtered
                return results
            }

            override fun publishResults(charSequence: CharSequence,results: FilterResults) {
                members.clear()
                members.addAll(results.values as Collection<Member>)

                notifyDataSetChanged()
            }
        }
    }
    override fun onBindViewHolder(holder: MemberViewHolder,position: Int) {
        return holder.bind(members[position])
    }

    class MemberViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        private val memberAge: TextView = itemView.findViewById(R.id.memberAge)

        //   private val memberName: TextView = itemView.findViewById(R.id.memberName)
        private val lastName: TextView = itemView.findViewById(R.id.lastName)
        private val firstName: TextView = itemView.findViewById(R.id.firstName)
        private val emailAddress: TextView = itemView.findViewById(R.id.emailAddress)
        private val phone: TextView = itemView.findViewById(R.id.phone)

        fun bind(member: Member) {
            memberAge.text = member.age.toString()
            lastName.text = member.name?.last
            firstName.text = member.name?.first
            emailAddress.text = member.email
            phone.text = member.phone
        }
    }

}

解决方法

您的错误是更新members,然后再次将其用作将来过滤的基础。

相反:

filteredMembers中创建另一个列表MembersAdapter,将其初始化为等于setMembers()中的成员

使MembersAdapter反映filteredMembers中的项目

  1. override fun getItemCount() = filteredMembers.size
    override fun onBindViewHolder(holder: MemberViewHolder,position: Int) {
        return holder.bind(filteredMembers[position])
    }

进行过滤器更新filteredMembers而不是members

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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元字符(。)和普通点?