我们在遍历文件夹的时候由于涉及到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) 遍历文件夹的更多相关文章

  1. Windows下C++遍历文件夹中的文件

    Windows下,在VS中开发,C++遍历文件夹下文件. 在Windows下,遍历文件所用到的函数和结构体,需要在程序中包含头文件#include <io.h>,在VS中,头文件io.h实 ...

  2. 写个批处理脚本来帮忙干活--遍历文件夹&字符串处理

    这次打算写几篇关于脚本方面的博客,主要是记录一下 Gradle 脚本和批处理脚本的一些写法,方便后续查阅. 前言 平常开发过程中,一些较为重复的手工性工作,如果能让脚本来帮忙处理,自然是最好的,刚好之 ...

  3. 个人永久性免费-Excel催化剂功能第83波-遍历文件夹内文件信息特别是图像、音视频等特有信息

    在过往的功能中,有体现出在Excel上管理文件的极大优势,在文件的信息元数据中,有图片和音视频这两类特有的属性数据,此篇对过往功能的一个补充,特别增加了图片和音视频信息的遍历功能. 使用场景 在文件管 ...

  4. C#遍历文件夹下所有文件

    FolderForm.cs的代码如下: using System; using System.Collections.Generic; using System.Diagnostics; using ...

  5. C#遍历文件夹及文件

    背景: 想自己实现一个网盘系统,于是需要用到遍历文件(夹)操作. C#基本知识梳理: 1.如何获取指定目录包含的文件和子目录 (1). DirectoryInfo.GetFiles():获取目录中(不 ...

  6. linux c遍历文件夹 和文件查找的方法

    linux c遍历文件夹的方法比较简单,使用c来实现 #include <iostream> #include <stdio.h> #include <sys/types ...

  7. PHPCMS V9二次开发便捷自定义后台入口文件夹

    phpcms v9二次开发便捷自定义后台入口文件夹 最新发布的phpcms v9由于采用了mvc的设计模式,所以它的后台访问地址是固定的,虽然可以通过修改路由配置文件来实现修改,但每次都修改路由配置文 ...

  8. Android开发之获取xml文件的输入流对象

    介绍两种Android开发中获取xml文件的输入流对象 第一种:通过assets目录获取 1.首先是在Project下app/src/main目录下创建一个assets文件夹,将需要获取的xml文件放 ...

  9. windowsAPI遍历文件夹(速度高于递归)

    #region API 遍历文件夹及其子文件夹和子文件 #region 声明WIN32API函数以及结构 ************************************** [DllImpo ...

随机推荐

  1. C# 关于NULL 可空值类型 ? 和空接操作符??

    作者 陈嘉栋(慕容小匹夫) C#引入了可空值类型的概念.在介绍究竟应该如何使用可空值类型之前,让我们先来看看在基础类库中定义的结构--System.Nullable<T>.以下代码便是Sy ...

  2. HashMap通过value反查key

            这是今天做了一道字符串的问题,一直MLE,所以想到了减少Map里对应关系数量来降低内存开销.随手谷歌,整理出了如下资料.       如果效率优先的话还是写俩Map吧. import ...

  3. A Statistical View of Deep Learning (II): Auto-encoders and Free Energy

    A Statistical View of Deep Learning (II): Auto-encoders and Free Energy With the success of discrimi ...

  4. About JavaScript

    JavaScript Function, Constructor function, Plain Object (expression function, closure) Maintainable ...

  5. MongoDB入门简介

    MongoDB入门简介 http://blog.csdn.net/lolinzhang/article/details/4353699 有关于MongoDB的资料现在较少,且大多为英文网站,以上内容大 ...

  6. Sequence《优先队列》

    Description Given m sequences, each contains n non-negative integer. Now we may select one number fr ...

  7. France \'98(概率)

    题目描述 Today the first round of the Soccer World Championship in France is coming to an end. 16 countr ...

  8. 不允许从数据类型 nvarchar 到 varbinary 的隐式转换

    一:错误截图 二:解决 数据库里面的数据类型错了,应该是varchar,而我选了varbinary.太粗心了!

  9. HDOJ(HDU) 2304 Electrical Outlets(求和、、)

    Problem Description Roy has just moved into a new apartment. Well, actually the apartment itself is ...

  10. G - Supermarket poj1456

    题目的描述很长,其实描述的问题很简单,说有n的商品,它们每个的价值是pi,但是呢,再过di天这些商品就不能卖了(有可能过期了...),现在给出来每个商品的价值和可以卖的最后期限,问可以得到最多多少资金 ...