在android上我有大的listview,它必须支持过滤。现在我的实现如下。
EditText和TextWatcher监听文本更改。所有数据都存储在db中,当有TextChange事件时,获取游标并将新的CursorAdapter设置为listview。我使用AsyncTask来查询数据库并更新gui。
但这种方法存在一些问题:
为每个TextChange事件启动AsyncTask。
应同步AsyncTask
那么为列表视图实现搜索字段的最佳方法是什么,哪些元素存储在db。
中答案 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 );
}