接上一篇,今天把搜索的代码放上去了。效果图如下。

MainActivity.java

package com.stk.afinder;import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.Button;
import android.view.View;
import android.widget.ListView;
import android.widget.ArrayAdapter;
import android.widget.Toast;
import android.widget.EditText;
import java.util.ArrayList;
import java.io.File;public class MainActivity extends Activity {static private ArrayList<String> search_result = new ArrayList<String>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ListView list = (ListView) findViewById(R.id.result_list);list.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,search_result));Button searchBn = (Button) findViewById(R.id.search_bn);searchBn.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {if (search_result != null) {search_result.clear();}EditText et = (EditText) findViewById(R.id.file_name_edit);MainActivity.this.searchFile(et.getText().toString().trim(), "/sdcard");((ArrayAdapter)((ListView)MainActivity.this.findViewById(R.id.result_list)).getAdapter()).notifyDataSetChanged();}});}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}private void searchFile(String filename, String path) {File[] files = null;try {files = new File(path).listFiles();} catch (Exception e) {files = null;Toast.makeText(this, getString(R.string.open_file_err), Toast.LENGTH_SHORT).show();return;}for (File file : files) {if (file.isDirectory() && file.listFiles() != null) {searchFile(filename, file.getPath());} else if (file.isFile()) {                if (filename == null || filename.isEmpty()) {search_result.add(file.getPath());} else {String name = file.getName();if (name.indexOf(filename) != -1) {search_result.add(file.getPath());}}}}}
}

其中实现搜索的代码是 private void searchFile(String filename, String path) 这个函数。

为了简单起见目前设置搜索的路径代码中硬编码为 “/sdcard”,预先在手机 /sdcard/download/ 目录下创建了几个文件。

小技巧:通过android sdk自带的工具adb操作虚拟机中的文件。

在命令行中进入android sdk安装目录中的 platform-tools 目录。

使用命令 ./adb shell 连接到 shell。android手机操作系统底层是基于Linux的,所以进入shell后基本的linux命令都可以用。

比如 ls 查看文件,cd 切换目录,touch 创建文件。完成后查看结果如下:

# cd Download
# ls
a.txt
ac.txt
b.txt
c.txt
#

与之前的MainActivity类代码相比,除了增加了一个private void searchFile(String filename, String path) 函数外,onCreate函数中也增加了部分内容。

1、增加了显示结果的ListView组件的处理。

        ListView list = (ListView) findViewById(R.id.result_list); //获取组件list.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,search_result)); //绑定适配器

我们的查找结果是一个列表,包含了所有匹配条件的文件的完整路径,我们使用一个字符串数组列表保存结果。

static private ArrayList<String> search_result = new ArrayList<String>();

要使ListView与数据绑定,显示数据并且当数据发生改变时能够刷新,必须给ListView绑定一个适配器。

我们这里使用了最简单的ArrayAdapter,系统自带的一个适配器。这是最简单的一个适配器。

2、增加了搜索按钮的点击事件处理。

Button searchBn = (Button) findViewById(R.id.search_bn);searchBn.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {if (search_result != null) {search_result.clear(); //清除上次的结果}EditText et = (EditText) findViewById(R.id.file_name_edit); // 获取文件名的组件MainActivity.this.searchFile(et.getText().toString().trim(), "/sdcard"); //调用搜索函数((ArrayAdapter)((ListView)MainActivity.this.findViewById(R.id.result_list)).getAdapter()).notifyDataSetChanged(); // 搜索完成后调用适配器的 notifyDataChanged 函数通知适配器数据源发生了改变。}});

3、提示

在searchFile函数中有如下处理

try {files = new File(path).listFiles();} catch (Exception e) {files = null;Toast.makeText(this, getString(R.string.open_file_err), Toast.LENGTH_SHORT).show();return;}

open_file_err 是我们在String.xml资源文件中新增的一个错误提示字符串

<string name="open_file_err">打开搜索目录失败,请检查设置是否正确。</string>

Toast类的makeText函数声明如下:

    /*** Make a standard toast that just contains a text view.** @param context  The context to use.  Usually your {@link android.app.Application}*                 or {@link android.app.Activity} object.* @param text     The text to show.  Can be formatted text.* @param duration How long to display the message.  Either {@link #LENGTH_SHORT} or*                 {@link #LENGTH_LONG}**/public static Toast makeText(Context context, CharSequence text, int duration)

如果用户没有输入任何字符串而直接点击按钮,将会列出 /sdcard 目录下的所有文件。

写东西好麻烦啊 :( ,比写代码麻烦多了。

总是写的简单了,好多东西没有写出来。

android学习笔记(5)-一个搜索文件的APP(2)-搜索功能的实现相关推荐

  1. Android学习笔记之AndroidManifest.xml文件解析(摘自皮狼的博客)

    Android学习笔记之AndroidManifest.xml文件解析 一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它 ...

  2. Android学习笔记之AndroidManifest.xml文件解析

    为什么80%的码农都做不了架构师?>>>    一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整 ...

  3. Android学习笔记之AndroidManifest.xml文件解析(学习别人的..非原创)

    AndroidManifest.xml是每个android程序中必须的文件.它位于application的根目录,描述了package中的全局数据,包括了package中暴露的组件(activitie ...

  4. Android学习笔记43:XML文件解析(Pull方式)

    解析XML文档的方法是很多的,除了常用的SAX和DOM方法以外,还可以使用Java自带的Pull来解析XML文档. 1.使用Pull解析器解析XML文档 Pull解析器的运行方式和SAX解析器很相似, ...

  5. Android学习笔记(1)----播放音乐文件

    原文地址:http://www.cnblogs.com/wynet/p/5526905.html 这里介绍两种播放资源文件的方法: 第一种. assets类资源放在工程根目录的assets子目录下,它 ...

  6. Android学习笔记36:使用SQLite方式存储数据

    在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...

  7. Android学习笔记:Android基础知识点(不断更新中)

    1.Android学习笔记:OkHttp 2.Android学习笔记:更新UI的方法(UI线程和非UI线程) 3.Android学习笔记:Volley 4.Android学习笔记:Handler 5. ...

  8. Android学习笔记26:图片切换控件ImageSwitcher的使用

    在Windows操作系统中,要查看多张图片,可以通过使用"Windows照片查看器"在"上一张"和"下一张"之间切换,进行多张图片的浏览. ...

  9. Pro Android学习笔记(二九):用户界面和控制(17):include和merge

    xml控件代码重用:include 如果我们定义一个控件,需要在不同的layout中重复使用,或者在同一个layout中重复使用,可以采用include的方式.例如定义my_button.xml如下 ...

  10. 【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge

    目录(?)[-] xml控件代码重用include xml控件代码重用merge 横屏和竖屏landsacpe portrait xml控件代码重用:include 如果我们定义一个控件,需要在不同的 ...

最新文章

  1. 读书笔记 《Perl语言入门》 Day 1
  2. MySQL触发器(转载)
  3. jzoj3337-[NOI2013模拟]wyl8899的TLE【字符串hash,二分】
  4. react如何遍历并比较_[前端进阶] 这可能是最通俗易懂的React 渲染原理及性能优化...
  5. 【java】java 命令 Unable to open socket file: target process not responding or HotSpot VM not loaded
  6. 相机视场角和焦距_相机参数一览表
  7. 设计模式原则之四:迪米特法则
  8. Android ConnectivityManager详解
  9. Android 使用 Gradle 打包 - 签名配置
  10. 【English】20190313
  11. Spring Boot + thymeleaf 后台与页面(二)
  12. prolog 从list中取出一个_二、redis中Hash、Set、SortedSet应用场景
  13. AuthorizingRealm中的两大方法
  14. 5G NR随机接入过程
  15. 招人!!!招人!!!
  16. RedHatEnterpriseLinux [RHEL]7.0——操作系统下载地址
  17. 强化学习--实验一倒立摆
  18. 利用google or-tools 求解逻辑难题:斑马问题
  19. 网页短链接的实现原理
  20. 期货外接看穿式技术方面问答总结

热门文章

  1. Java从入门到放弃-05(制作电子手账)
  2. Flink Forward Asia 2022 主论坛概览
  3. 用CSS制作凸出按钮效果
  4. 图像分类之花卉图像分类(四)训练模型
  5. hana s4 服务器_什么是SAP S4 HANA?SAP金牌服务商-工博科技
  6. 第一讲:ESP32-IDF+VSCode开发环境配置
  7. 羽墨志 | 拷贝数字示波器中的截图
  8. VulnHub—HA-Avengers Arsenal
  9. Firefox浏览器出现“连接被重置”的问题
  10. “质量革命”背后:瓜子二手车的底层逻辑与战略选择