【问题标题】:Filter ListView in real time实时过滤ListView
【发布时间】:2012-08-23 18:38:10
【问题描述】:

我想实时过滤ListView。我在ActionBar中有一个EditText,每次用户写一个字符我都想更新ListView的光标过滤信息。

我已通过AsyncTask 执行查询,但我有两个问题:

1º) 如果用户键入三个字符,我将创建三个 AsyncTasks(一个用于搜索第一个字符,一个用于搜索前两个字符,最后一个用于搜索三个字符)。有没有简单的方法可以告诉AsyncTask 用新的任务替换之前的任务?

2º) 我怎样才能稍微延迟启动AsyncTask?所以如果用户连续输入三个字符,我不会创建AsyncTask直到结束。

谢谢!

【问题讨论】:

    标签: android android-listview android-asynctask


    【解决方案1】:

    嗯...不完全确定您为什么使用AsyncTask 进行实时搜索。这就是我将如何(并且已经成功地)做到这一点。

    TextChangeListener 添加到您的Edittext

    editText.addTextChangedListener(new TextWatcher() {
    
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                searchResults = myDbHelper.searchAll(s.toString());
                searchAdapter.notifyDataSetChanged();
            }
    
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
    
            }
    
            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub
    
            }
        });
    

    每次用户按键时,我都会搜索一个 sqlite 数据库。我的searchResults 用于填充ListView,所以在我设置获取搜索结果后,告诉列表适配器数据集已更改。

    希望这会有所帮助。

    【讨论】:

    • 您将使用异步任务,因为您不想在 UI 线程上运行长查询。将它放在 UI 线程上会使界面感觉笨拙和缓慢。
    • 使用此方法,您可以设置一个计时器以在 200 毫秒内运行,该计时器将使用异步任务执行查询。如果在第一个计时器运行之前输入了另一个字符,则取消第一个并开始一个新的...
    • 取决于查询的大小。我在 searchAll 方法中运行了三个查询,并且没有明显的滞后。
    • AsyncTask,正如 John 所说,是不会因为长时间的查询而冻结 UI。事实上,在 SDK 的最新版本(我认为是 API 11 及以下版本)中,如果您尝试在 UI 线程中进行查询,dalvik 会抛出异常。无论如何,谢谢,使用 TextWatcher 并取消任务(如果存在)是个好主意 :) 要检查计时器是否已设置,您认为使用同步布尔变量是一种好方法吗?
    猜你喜欢
    • 2019-01-23
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 2012-12-11
    • 2021-10-22
    • 2013-11-21
    相关资源
    最近更新 更多