【问题标题】:How to use the searchView widget in a Fragment (Kotlin)如何在片段中使用 searchView 小部件(Kotlin)
【发布时间】:2021-12-26 20:15:02
【问题描述】:

我正在尝试在片段中使用 searchView 小部件。我找不到办法。使用 Activity 实现 searchView 更容易,但我不知道如何在 Kotlin 的片段中实现它。我尝试过这种方式,但似乎不起作用(仅适用于活动)。我是 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)
    }


}```

【问题讨论】:

    标签: kotlin android-recyclerview searchview


    【解决方案1】:

    我之前使用它如下,它工作正常。

    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 一起使用,所以我需要搜索一个列表。我通常需要一些东西来过滤它。
    猜你喜欢
    • 2020-07-15
    • 2017-05-11
    • 1970-01-01
    • 2017-11-22
    • 2019-01-08
    • 2020-10-04
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    相关资源
    最近更新 更多