如何正确过滤 ListView 中的文本?

Posted

技术标签:

【中文标题】如何正确过滤 ListView 中的文本?【英文标题】:How to filter text in a ListView properly? 【发布时间】:2011-04-21 03:40:16 【问题描述】:

我试图从我的 EditText 框中过滤我的 ListView,但目前它不起作用。

我有一个 ListView 可以正确获取数据,并使用 ArrayAdapter 类和我自己的 ArrayList 类将它们添加到我自己的 ListView 中。例如,当我输入“表格”时,我希望它从我的 ListView 中加载的标题中排序,然后它应该向我显示剩下的项目和匹配的表格。

我当前的代码:

private ArrayList<Order> orders; /* ArrayList class with my own Order class to 
define title, info etc. */
private OrderAdapter adapter; //Own class that extends ArrayAdapter

orders = new ArrayList<Order>();
adapter = new OrderAdapter(this, R.layout.listrow, orders); /* listrow defining a
single item in my ListView */
setListAdapter(adapter); //Set our adapter to a ListView

search.addTextChangedListener(filterTextWatcher); //search is my EditText

private TextWatcher filterTextWatcher = new TextWatcher() 

    public void afterTextChanged(Editable s) 

    

    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) 
    

    public void onTextChanged(CharSequence s, int start, int before,
            int count) 
        adapter.getFilter().filter(s); //Filter from my adapter
        adapter.notifyDataSetChanged(); //Update my view
    

;

好的,那我该如何实现呢?当我在 EditText 框中输入一些值时,所有内容都会消失,即使有匹配项。

提前致谢,如果您需要更多代码 sn-ps 或者这个问题我不清楚,请告诉我!

【问题讨论】:

【参考方案1】:

ArrayAdapter 实现的内置过滤器通过调用 toString() 方法将包含的对象转换为字符串。正是这个字符串将用于执行匹配。如果您只想匹配 Order 对象中的一个字符串字段,则可以覆盖 Order 类的 toString() 方法以返回该字段。如果您想执行更灵活的匹配,例如匹配多个字段,请查看这篇介绍如何创建自定义过滤器的帖子:

Custom filtering in android using ArrayAdapter

【讨论】:

不,它没有。我真的很感谢为我的问题提供更具体的代码解决方案,因为上面的链接介绍了我不需要的部分代码,并且由于我的 ArrayAdapter 已经有了它的过滤器,因此无需创建自定义过滤器。 ArrayAdapter 实现的内置过滤器通过调用 toString() 方法将包含的对象转换为字符串。正是这个字符串将用于执行匹配。如果您只想匹配 Order 对象中的一个字符串字段,则可以覆盖 Order 类的 toString() 方法以返回该字段。如果您想执行更灵活的匹配,例如匹配多个字段,我提到的帖子会有所帮助,因为它创建了一个自定义过滤器类。

以上是关于如何正确过滤 ListView 中的文本?的主要内容,如果未能解决你的问题,请参考以下文章

过滤 ListView 时如何禁用搜索文本弹出窗口?

如何对 SimpleCursorAdapter 支持的 Android ListView 进行文本过滤?

如何用文本图片和复选框过滤自定义listView?

如何使用 getFilter() 和 ListAdapter 过滤 ListView?

过滤列表项后,ListView 中的 SwiftUI TextField 变为空白

文本过滤后从 Android ListView/ArrayAdapter 中删除项目不起作用