描述:输入一个字符串,搜索给定目录下的所有包含搜索字符的目录或文件。
1. 算法实现
分析:文件管理器中的文件层次结构是一颗树结构,该问题就是搜索树的除了根节点外,所有包含给定字符的结点,其中目录相当于非叶节点,文件相当于叶子结点。
实现:记目标路径为root,搜索字符为searchString。使用队列,依次扫描它的儿子结点,如果包含searchString,则添加到输出结果中;如果儿子结点为非叶结点,则添加到队列当中;
在一轮循环的最后,从队列中取出首元素,进入下一次循环。
public void searchProcess(File root,ArrayList<String> pathItems, String searchString){
if(root == null || !root.exist() || !root.isDirectory()) {
pathItems = null;
}
ArrayDeque<File> queueFiles = new ArrayDeque<File>();
File top = root;
while(top != null) {
File[] files = top.listFiles();
if(files != null) {
for(File f : files){
if (f.getName().length() >= 1 && f.getName().charAt(0) == '.') {
continue;
}
if (f.getName().toLowerCase().contains(query.toLowerCase())) {
pathItems.add(f.getPath);
}
if(f.isDirectory()) {
queueFiles.add(f);
}
}
}
try {
top = queueFiles.remove();
// Log.i(TAG,"top=="+top);
} catch (NoSuchElementException e) {
e.printStackTrace();
top = null;
}
}
if (pathItems != null) {
Collections.sort(pathItems,String.CASE_INSENSITIVE_ORDER);
}
}
2.SearchView控件
使用SearchView时,遇到一个问题迟迟没有找到答案:在搜索框中输入字符后点击搜索,这时候搜索框不消失,而且searchView仍处于展开状态,很影响用户体验。如何达到当点击搜索后,searchView就立即折叠?表示该次搜索已经完成。
SearchView.OnQueryTextListener mQueryTextListener = new
SearchView.OnQueryTextListener() {
public boolean onQueryTextSubmit(String query) {
/*非常重要,他表示折叠actionView;mSearchMenu是在onCreateOptionsMenu()中通过menu.findItem(R.id.menu_search)获得;如果要展开actionView,则调用expandActionView()。
*/
mSearchMenu.collapseActionView();
new SearchFileThread(query.trim()).start();
//mSearchView.setFocusable(false);
//mSearchView.clearFocus();//表示让searchView失去焦点
return true;
}
public boolean onQueryTextChange(String newText) {
return false;
}
};