实现搜索字段android

时间:2009-11-23 13:47:50

标签: android search

在android上我有大的listview,它必须支持过滤。现在我的实现如下。

EditText和TextWatcher监听文本更改。所有数据都存储在db中,当有TextChange事件时,获取游标并将新的CursorAdapter设置为listview。我使用AsyncTask来查询数据库并更新gui。

但这种方法存在一些问题:

  1. 为每个TextChange事件启动AsyncTask。

  2. 应同步AsyncTask

  3. 那么为列表视图实现搜索字段的最佳方法是什么,哪些元素存储在db。

2 个答案:

答案 0 :(得分:3)

大多数Adapter实现也实现了Filterable接口,这非常有用。

Filter filter = myAdapter.getFilter();
filter.filter(mySearchText);

根据文档Filter.filter(CharSequence约束)确实 - 启动异步过滤操作。调用此方法会取消所有先前未执行的过滤请求,并发布稍后将执行的新过滤请求。这非常适合我的需求。

答案 1 :(得分:0)

在您的Activity中,在启动时保持对AsyncTask的静态引用。然后,如果用户在上一个AsyncTask完成之前键入另一个键,则手动取消它并启动另一个键。这应该可以缓解大多数问题(尽管如果它是一个大型数据集,您可能会在刷新列表时遇到一些问题)。像下面这样的东西应该让你开始:

private static AsyncTask _currentFilterTask;

public doFilter( String userInput )
{
  if ( _currentFilterTask != null && _currentFilterTask.getStatus().equals() )
  {
    _currentFilterTask.cancel( true );
  }
  _currentFilterTask = new MyAsyncTask( userInput );
  _currentFilterTask.execute( this ); 
}