Android开发手记(21) 遍历文件夹
我们在遍历文件夹的时候由于涉及到SD卡相关操作,所以我们需要添加如下权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
首先,需要检查SD卡挂载状态:
boolean sdCard = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
if (!sdCard) {
Toast.makeText(MainActivity.this, "SD卡未挂载", Toast.LENGTH_SHORT).show();
MainActivity.this.finish();
}
当getExternalStorageState()挂载状态返回为未挂载时,程序提示错误,并结束执行。
然后,通过Intent获取Activity当前的消息,如果第一次执行,那么Intent所get到的信息为空。此时就读取SD卡根目录文件列表。如果不是第一次执行,那么就获取上次传入的文件路径信息,然后再读取此文件路径下的文件列表。
Intent intent = getIntent();
CharSequence cs = intent.getCharSequenceExtra("filePath"); //filePath 为传入的文件路径信息
if (cs != null) {
File file = new File(cs.toString());
tvPath.setText(file.getPath());
files = file.listFiles();
} else {
File sdFile = Environment.getExternalStorageDirectory();
tvPath.setText(sdFile.getPath());
files = sdFile.listFiles();
}ra("filePath");
然后,在获取到了所有的文件列表信息之后,我们需要将其输入到ListView中,而ListView数据是和Adapter绑定的。Adapter的初始化原型为:
SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
// context 是上下文,这里我们取MainActivity.this
// data 是数据来源,是一个Map结构,最终显示Map中的Value
// resource 是资源文件,根据此xml文件将ListView中内容排版
// from 是数据来源的名称,为Map中的Key值
// to 是将数据和resource中进行绑定id的值
根据此,我们实例化一个Map来存储最终需要显示的数据,同时新建一个资源文件/res/layout/list_layout.xml来对ListView内容进行排版:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="1"> <ImageView
android:layout_width="46dp"
android:layout_height="45dp"
android:id="@+id/image" /> <TextView
android:layout_width="wrap_content"
android:layout_height="38dp"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Large Text"
android:id="@+id/fileName"
android:layout_weight="0.14" />
</LinearLayout>
List<HashMap<String, Object>> list = new ArrayList<>();
for (int i = 0; i < files.length; i++) {
HashMap<String, Object> hashMap = new HashMap<>();
if (files[i].isDirectory()) {
hashMap.put("image", android.R.drawable.ic_dialog_email);
} else {
hashMap.put("image", android.R.drawable.ic_dialog_map);
}
hashMap.put("fileName", files[i].getName());
list.add(hashMap);
}
最后,实例化此Adapter并将ListView与其绑定,同时为ListView添加Item单击事件。如果Item是目录的话,就将目录的路径通过intent传递给Activity,然后启动此Activity。回到起始定义Intent的地方,此Intent会得到由Activity传递过来的目录信息,然后根据此目录信息可以进一步访问文件目录。
SimpleAdapter adapter = new SimpleAdapter(MainActivity.this, list, R.layout.list_layout,
new String[]{"image", "fileName"}, new int[]{R.id.image, R.id.fileName});
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
if (files[i].isDirectory()) {
File[] childFile = files[i].listFiles();
if (childFile != null && childFile.length >= 0) {
Intent intent = new Intent(MainActivity.this, MainActivity.class);
intent.putExtra("filePath", files[i].getPath());
Toast.makeText(MainActivity.this, files[i].getPath(), Toast.LENGTH_SHORT).show();
startActivity(intent);
}
}
}
});
完整代码如下:
import android.content.Intent;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast; import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; public class MainActivity extends AppCompatActivity { private TextView tvPath;
private ListView listView;
private File[] files; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); tvPath = (TextView) findViewById(R.id.textView);
listView = (ListView) findViewById(R.id.listView); boolean sdCard = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
if (!sdCard) {
Toast.makeText(MainActivity.this, "SD卡未挂载", Toast.LENGTH_SHORT).show();
MainActivity.this.finish();
} Intent intent = getIntent();
CharSequence cs = intent.getCharSequenceExtra("filePath");
if (cs != null) {
File file = new File(cs.toString());
tvPath.setText(file.getPath());
files = file.listFiles();
} else {
File sdFile = Environment.getExternalStorageDirectory();
tvPath.setText(sdFile.getPath());
files = sdFile.listFiles();
} List<HashMap<String, Object>> list = new ArrayList<>();
for (int i = 0; i < files.length; i++) {
HashMap<String, Object> hashMap = new HashMap<>();
if (files[i].isDirectory()) {
hashMap.put("image", android.R.drawable.ic_dialog_email);
} else {
hashMap.put("image", android.R.drawable.ic_dialog_map);
}
hashMap.put("fileName", files[i].getName());
list.add(hashMap);
} SimpleAdapter adapter = new SimpleAdapter(MainActivity.this, list, R.layout.list_layout,
new String[]{"image", "fileName"}, new int[]{R.id.image, R.id.fileName});
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
if (files[i].isDirectory()) {
File[] childFile = files[i].listFiles();
if (childFile != null && childFile.length >= 0) {
Intent intent = new Intent(MainActivity.this, MainActivity.class);
intent.putExtra("filePath", files[i].getPath());
Toast.makeText(MainActivity.this, files[i].getPath(), Toast.LENGTH_SHORT).show();
startActivity(intent);
}
}
}
}); } }

Android开发手记(21) 遍历文件夹的更多相关文章
- Windows下C++遍历文件夹中的文件
Windows下,在VS中开发,C++遍历文件夹下文件. 在Windows下,遍历文件所用到的函数和结构体,需要在程序中包含头文件#include <io.h>,在VS中,头文件io.h实 ...
- 写个批处理脚本来帮忙干活--遍历文件夹&字符串处理
这次打算写几篇关于脚本方面的博客,主要是记录一下 Gradle 脚本和批处理脚本的一些写法,方便后续查阅. 前言 平常开发过程中,一些较为重复的手工性工作,如果能让脚本来帮忙处理,自然是最好的,刚好之 ...
- 个人永久性免费-Excel催化剂功能第83波-遍历文件夹内文件信息特别是图像、音视频等特有信息
在过往的功能中,有体现出在Excel上管理文件的极大优势,在文件的信息元数据中,有图片和音视频这两类特有的属性数据,此篇对过往功能的一个补充,特别增加了图片和音视频信息的遍历功能. 使用场景 在文件管 ...
- C#遍历文件夹下所有文件
FolderForm.cs的代码如下: using System; using System.Collections.Generic; using System.Diagnostics; using ...
- C#遍历文件夹及文件
背景: 想自己实现一个网盘系统,于是需要用到遍历文件(夹)操作. C#基本知识梳理: 1.如何获取指定目录包含的文件和子目录 (1). DirectoryInfo.GetFiles():获取目录中(不 ...
- linux c遍历文件夹 和文件查找的方法
linux c遍历文件夹的方法比较简单,使用c来实现 #include <iostream> #include <stdio.h> #include <sys/types ...
- PHPCMS V9二次开发便捷自定义后台入口文件夹
phpcms v9二次开发便捷自定义后台入口文件夹 最新发布的phpcms v9由于采用了mvc的设计模式,所以它的后台访问地址是固定的,虽然可以通过修改路由配置文件来实现修改,但每次都修改路由配置文 ...
- Android开发之获取xml文件的输入流对象
介绍两种Android开发中获取xml文件的输入流对象 第一种:通过assets目录获取 1.首先是在Project下app/src/main目录下创建一个assets文件夹,将需要获取的xml文件放 ...
- windowsAPI遍历文件夹(速度高于递归)
#region API 遍历文件夹及其子文件夹和子文件 #region 声明WIN32API函数以及结构 ************************************** [DllImpo ...
随机推荐
- 剖析并利用Visual Studio Code在Mac上编译、调试c#程序【转】
0x00 前言 一周多以前的微软的Build大会上,微软发布了一个让很多人眼前一亮的工具,也是本文的主角——Visual Studio Code.很多使用Windows的朋友都很高兴,认为又多了一个很 ...
- BZOJ 3243 向量内积
Description 两个\(d\)维向量\(A=[a_{1},a_{2},...,a_{d}]\)与\(B=[b_{1},b_{2},...,b_{d}]\)的内积为其相对应维度的权值的乘积和,即 ...
- [HDOJ 1171] Big Event in HDU 【完全背包】
题目链接:HDOJ - 1171 题目大意 有 n 种物品,每种物品有一个大小和数量.要求将所有的物品分成两部分,使两部分的总大小尽量接近. 题目分析 令 Sum 为所有物品的大小总和.那么就是用给定 ...
- 教你在Java的普通类中轻松获取Session以及request中保存的值
曾经有多少人因为不知如何在业务类中获取自己在Action或页面上保存在Session中值,当然也包括我,但是本人已经学到一种办法可以解决这个问题,来分享下,希望对你有多多少少的帮助! 如何在Java的 ...
- Unity3d 与IOS 相互调用
Unity3d 与IOS 相互调用 @灰太龙 群63438968 我用的Unity3d 4.2版本,这一节说一下IOS与U3D的交互! 首先在U3D中写个方法:这个时候导出为ios代码必须是真机,模拟 ...
- dns智能解析对网站排名的影响
网站排名是所有建站者都关系的问题,如何提升网站排名有很多因素,网站是否健康也与网站排名有关,下面智儒科技网站建设为你研究下如何判断自己的网站是否健康. 一般情况下,网站的排名在优化的基础上,怎么也上不 ...
- Extjs4中tabPanel
好文章引用:Extjs4 TabPanel例子 感谢原作者...
- Linux下高并发网络编程
Linux下高并发网络编程 1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时, 最高的并发数量都要受到系统对用户单一进程同时可打 ...
- 3A. Shortest path of the king
给你一个的棋盘, 问:从一个坐标到达另一个坐标需要多少步? 每次移动可以是八个方向. #include <iostream> #include <cmath> #inclu ...
- POJ 3189 Steady Cow Assignment
题意:每个奶牛对所有的牛棚有个排名(根据喜欢程度排的),每个牛棚能够入住的牛的数量有个上限,重新给牛分配牛棚,使牛棚在牛心中的排名差(所有牛中最大排名和最小排名之差)最小. 题目输入: 首先是两个 ...