【问题标题】:Filter for SearchView in Kotlin在 Kotlin 中过滤 SearchView
【发布时间】:2019-08-27 11:23:05
【问题描述】:

Android 环境

kotlin_version = '1.3.20'
compileSdkVersion 28

我有一个 ArrayAdapter 类型的 适配器,它在应用活动中表示为 ListView。如何让 SearchView 的过滤器起作用?

Activity.xml

<android.support.v7.widget.SearchView
        android:id="@+id/searchView">
        ...

</android.support.v7.widget.SearchView>


<ListView
        android:id="@+id/listView"
        ...
 />

Activity.kt

   ...

         searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {

                    override fun onQueryTextChange(newText: String): Boolean {

                        adapter.filter.filter(newText)

                        return true
                    }

                    override fun onQueryTextSubmit(query: String): Boolean {
                        // task HERE
                        return false
                    }

                })

    ...

所以 setOnQueryTextListener() 工作正常,甚至 适配器 工作正常,但我无法让过滤器工作。

【问题讨论】:

  • 老实说,最好的方法是使用 RecyclerView,并为您自己的代码放弃 SearchView ;) 但我知道这并不完全是一个完整的答案,因此它是一个评论。我认为 SearchView 曾经不适合我的要求。
  • 你能发布你的适配器代码吗?
  • @EpicPandaForce 感谢您的建议。下次我会尝试使用 RecyclerView。:)

标签: android kotlin filter android-arrayadapter searchview


【解决方案1】:

解决方案

这个问题的解决方案是代码范围定义本身。对于可能遇到类似情况的人,请确保检查 searchView.setOnQueryTextListener() 并确保将其排除在您可能用于为适配器提供列表的任何循环之外。 :)

【讨论】:

    【解决方案2】:

    通知适配器进行数据更改:

    searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
    
                    override fun onQueryTextChange(newText: String): Boolean {
                        adapter.filter.filter(newText)
                        adapter.notifyDataSetChanged()
                        return true
                    }
    
                    override fun onQueryTextSubmit(query: String): Boolean {
                        return false
                    }
    
                })
    

    【讨论】:

    • 谢谢,但它也可以在没有 notifyDataSetChanged() 的情况下工作。 :) 问题出在 setOnQueryTextListener() 本身的整个块上。它必须在我用来填充列表的循环范围之外。
    【解决方案3】:

    添加这一行

    adapter.notifyDataSetChanged()
    

    在过滤器语句之后。

    【讨论】:

    • 谢谢,但它也可以在没有 notifyDataSetChanged() 的情况下工作。 :) 问题出在 setOnQueryTextListener() 本身的整个块上。它必须在我用来填充列表的循环范围之外。
    猜你喜欢
    • 2017-11-02
    • 1970-01-01
    • 2012-12-11
    • 2021-01-30
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多