如何在 Kotlin Fragment 中使用 SearchView 小部件

3

我正在尝试在片段中使用searchView小部件,但找不到方法。使用Activity实现searchView要容易得多,但是我不知道如何在Kotlin片段中实现它。我尝试了这种方法,但似乎不起作用(仅适用于Activity)。我是Android的新手,真的需要一些帮助,在这里挣扎了几天。

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个回答

0
我之前使用以下代码,它可以正常工作。
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
}

但是我正在使用它与recyclerView,所以我需要通过列表进行搜索。通常我需要一些过滤器来筛选它。 - LMB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接