How to use the searchView widget in a Fragment (Kotlin)

Viewed 609

I'm trying to use the searchView widget in a fragment. I can't find a way to do it. It's easier to implement a searchView using an Activity but I have no clue how to do implement it in a fragment in Kotlin. I tried this way but doesn't seem to work ( only works in an activity). I'm a beginner in Android and would really appreciate some help here, i've been struggling for a couple of days rn.

class Homepage : Fragment() {
    private var layoutManager : RecyclerView.LayoutManager? = null
    private var _binding : FragmentHomepageBinding? = null
    private val binding  get() = _binding!!
    private val shoe = DataSource.shoes
    val arrayList = ArrayList<Shoe>()
    val displayList = ArrayList<Shoe>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        _binding = FragmentHomepageBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val myAdapter = ShoeAdapter(displayList)
        layoutManager = GridLayoutManager(this.context,2)
        recyclerView.layoutManager = layoutManager
        recyclerView.adapter = myAdapter
        setHasOptionsMenu(true)

    }

    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        inflater.inflate(R.menu.main_menu,menu)
        val menuItem = menu.findItem(R.id.search)
        val searchView = menuItem.actionView as SearchView
            searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener{
                override fun onQueryTextSubmit(query: String?): Boolean {
                    return true
                }

                override fun onQueryTextChange(newText: String?): Boolean {

                    if(newText!!.isNotEmpty()){
                        displayList.clear()
                        val search = newText.lowercase(Locale.getDefault())
                        arrayList.forEach {
                            if(it.name.lowercase(Locale.getDefault()).contains(search)){
                                displayList.add(it)
                            }
                        }

                        recyclerView.adapter!!.notifyDataSetChanged()
                    }
                    else{
                        displayList.clear()
                        displayList.addAll(arrayList)
                        recyclerView.adapter!!.notifyDataSetChanged()
                    }

                    return true
                }

            })
            

        super.onCreateOptionsMenu(menu, inflater)
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return super.onOptionsItemSelected(item)
    }


}```
1 Answers

I used it as below before and it was working properly.

class BooksFragment : Fragment(), SearchView.OnQueryTextListener {

private lateinit var binding: FragmentBooksBinding

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View {
    binding = FragmentBooksBinding.inflate(inflater, container, false)
    binding = DataBindingUtil.inflate(inflater, R.layout.fragment_books, container, false)
    return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    setHasOptionsMenu(true)
}

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    inflater.inflate(R.menu.toolbar_menu,menu)
    val item = menu.findItem(R.id.search_book)
    val searchView = item.actionView as SearchView
    searchView.setOnQueryTextListener(this)
    super.onCreateOptionsMenu(menu, inflater)
}

override fun onQueryTextSubmit(query: String): Boolean {
    // search button submit
    return true
}

override fun onQueryTextChange(newText: String): Boolean {
    // search text changed
    return true
}
Related