Android 实时过滤ListView
我想实时过滤Android 实时过滤ListView,android,android-listview,android-asynctask,Android,Android Listview,Android Asynctask,我想实时过滤列表视图。我在ActionBar中有一个EditText,每次用户写入字符时,我都想更新ListView过滤信息的光标 我已经完成了一个AsyncTask任务来执行查询,但我有两个问题: 1º)如果用户键入三个字符,我将创建三个异步任务(一个搜索第一个字符,一个搜索前两个字符,最后一个搜索三个字符)。有没有一种简单的方法可以告诉AsyncTask用新任务替换上一个任务 2º)如何在启动异步任务时稍微延迟一点?因此,如果用户不停地键入三个字符,我将不创建AsyncTask,直到结束 谢
列表视图
。我在ActionBar
中有一个EditText
,每次用户写入字符时,我都想更新ListView
过滤信息的光标
我已经完成了一个AsyncTask
任务来执行查询,但我有两个问题:
1º)如果用户键入三个字符,我将创建三个异步任务
(一个搜索第一个字符,一个搜索前两个字符,最后一个搜索三个字符)。有没有一种简单的方法可以告诉AsyncTask
用新任务替换上一个任务
2º)如何在启动异步任务时稍微延迟一点?因此,如果用户不停地键入三个字符,我将不创建AsyncTask
,直到结束
谢谢 Hmmm…不完全确定为什么要使用AsyncTask
进行实时搜索。以下是我将如何(并且已经成功)做到这一点
将文本更改侦听器
添加到您的编辑文本
:
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数据库。MysearchResults
用于填充ListView
,因此在设置get the search results之后,告诉列表适配器数据集已更改
希望这有帮助。您可以使用异步任务,因为您不想在UI线程上运行长查询。将其放在UI线程上会使界面感觉笨拙和缓慢。使用此方法,您可以设置一个计时器,使其在200毫秒内运行,以执行异步任务的查询。如果在第一个计时器运行之前键入了另一个字符,则取消第一个字符并开始一个新字符…取决于查询的大小。我在searchAll方法中运行了三个查询,没有明显的延迟。正如John所说,异步任务是不使用长时间查询冻结UI。事实上,在SDK的最新版本中(我认为是API 11和后续版本),如果您尝试在UI线程中执行查询,dalvik会抛出一个异常。无论如何,谢谢,使用TextWatcher并取消任务(如果存在是一个好主意:)要检查计时器是否已设置,您认为使用同步布尔变量是一个好方法吗?