【问题标题】:highlight filter text in recyclerview using searchview使用 searchview 在 recyclerview 中突出显示过滤器文本
【发布时间】:2021-10-21 00:35:29
【问题描述】:

我已经使用 searchview 创建了 recyclerview,但我想突出显示我在 searchview 中输入的 recyclerview 中的文本。我在 onviewholder 中尝试了一些方法,但没有奏效。有什么办法吗?我在下面分享了截图和代码,请帮我做。

bookadapter.kt

class bookadapter( private var booklist:ArrayList<Booksmodel>, private val itemClickListener: 
OnItemClicklistner):RecyclerView.Adapter<bookadapter.bookholder>() {

val searchText:String?=null


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

fun filterlist(filterlist:ArrayList<Booksmodel>){

    booklist=filterlist

    notifyDataSetChanged()
}

override fun onBindViewHolder(holder: bookholder, position: Int) {
    val view=booklist[position]

    holder.bind(view,itemClickListener)


}

override fun getItemCount(): Int {
    return booklist.size
}
inner class bookholder(view: View):RecyclerView.ViewHolder(view){
    val bookname:TextView=view.findViewById(R.id.recbooknametxt)
    val bookpublication=view.findViewById<TextView>(R.id.recbookpubtxt)
    val bookdept=view.findViewById<TextView>(R.id.recbookdepttxt)
    val bookimage=view.findViewById<ImageView>(R.id.recbookimg)

    fun bind(book:Booksmodel,clicklistner:OnItemClicklistner){
        bookname.text=book.BookName
        bookpublication.text=book.BookPublication
        bookdept.text=book.Department
        Picasso.get().load(book.BookImage).into(bookimage)
        itemView.setOnClickListener{
            clicklistner.onItemclick(book)
        }
    }
}

interface OnItemClicklistner{
    fun onItemclick(books:Booksmodel)
}
}

books.kt

 override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    inflater.inflate(R.menu.fragmentmenu, menu)
    val searchItem = menu.findItem(R.id.search)

    val searchView:SearchView = searchItem.actionView as SearchView
    searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
        override fun onQueryTextSubmit(query: String): Boolean {
            return false
        }

        override fun onQueryTextChange(newText: String): Boolean {

            filter(newText)
            return false
        }
    })

    super.onCreateOptionsMenu(menu, inflater)
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    val id=item.itemId
    when (id) {
        R.id.search -> {

            return true
        }
        R.id.sort->{
            Toast.makeText(context,"sort",Toast.LENGTH_SHORT).show()
            return true
        }
        else -> return super.onOptionsItemSelected(item)
    }
}


private fun filter(text: String) {
    val filteredlist = ArrayList<Booksmodel>()

    for (item in booklist) {
        if (item.BookName!!.lowercase(Locale.getDefault())
                .contains(text.lowercase(Locale.getDefault()))
        ) {
            filteredlist.add(item)
        }
    }
    if (filteredlist.isEmpty()) {
        Toast.makeText(context, "No Data Found..", Toast.LENGTH_SHORT).show()
    } else {
        bookadapter.filterlist(filteredlist)
    }
}

【问题讨论】:

    标签: android kotlin android-recyclerview searchview


    【解决方案1】:

    如果用不同的颜色为搜索到的文本着色足以突出显示,请尝试以下操作:

    修改你的bookadapter 类:

    class bookadapter() : ... {
        var searchText: String = ""
        ...
    
        // update your adapter about the current search text as well
        fun filterList(filterList: List<BookModel>, searchText: String) {
            this.searchText = searchText
            booklist = filterList
            notifyDataSetChanged()
        }
    }
    

    然后,修改您的bookholder 以突出显示与searchText 匹配的部分文本:

    inner class bookholder(view: View) : RecyclerView.ViewHolder(view) {
        private val bookNameTextView: TextView = view.findViewById(R.id.tv_book_name)
    
        fun bind(book: BookModel, clickListener: OnItemClickListener) {
            if (searchText.isNotBlank()) {
                val highlightedText = book.bookName.replace(searchText, "<font color='red'>$searchText</font>", true)
                bookNameTextView.text = HtmlCompat.fromHtml(highlightedText, HtmlCompat.FROM_HTML_MODE_LEGACY)
            } else {
                bookNameTextView.text = book.bookName
            }
            ...
            itemView.setOnClickListener {
                clickListener.onItemClick(book)
            }
        }
    }
    

    最后,在您的活动/片段的private fun filter(text: String) 函数中,您需要将过滤后的文本传递给适配器:

    bookadapter.filterlist(filteredlist, text)
    

    我制作了一个反映您的用例(简化)的工作演示,如果您仍然不确定,请查看demo。结果如下所示:https://imgur.com/a/QYEijyR

    【讨论】:

    • 很高兴为您提供帮助。在这种情况下,请接受我的回答。如果你不知道怎么做,请参考 stackoverflow.com/help/someone-answers
    猜你喜欢
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 2020-02-07
    • 1970-01-01
    • 2019-04-11
    • 2022-08-23
    • 2019-12-28
    相关资源
    最近更新 更多