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);
                    }
                }
            }
        });

    }

}

时间: 2024-10-25 11:26:23

Android开发手记(21) 遍历文件夹的相关文章

android开发环境之SDK文件夹下的所需内容

下面SDK的内容可以到网址 https://www.androiddevtools.cn/下载相应包 注意:下载包的版本要一致,不然会出错 Sdk至少包含如下文件: add-ones夹可以为空: build-tools文件夹里要有东西,比如本人下的是: platforms文件夹要有内容,比如本人下的是: platform-tools文件夹要有内容,如下: sources文件夹里也有东西,比如自己下的: system-images文件夹有东西这些是CPU/ABI镜像文件,比如: tools文件夹就

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

这次打算写几篇关于脚本方面的博客,主要是记录一下 Gradle 脚本和批处理脚本的一些写法,方便后续查阅. 前言 平常开发过程中,一些较为重复的手工性工作,如果能让脚本来帮忙处理,自然是最好的,刚好之前有些工作有点过于重复且都是手工性去完成,所以就想着能否写个脚本来处理. 因为我还是用的 windows 开发,所以最开始想到的就是批处理脚本,但写完后发现,重复性工作是可以交给脚本去处理了,但每次要执行这个脚本文件还得打开脚本所在的文件夹找到脚本点击去执行. emmm,因为我是开发 Android

Android开发问题之R文件丢失

问题解析:1.有时候我们打开Android工程时,会发现gen文件夹下的R文件丢失了,这种情况的发生一般是发在在导入其他Android工程之后,原因是sdk版本问题:2.如果工程已经在eclipse软件中,可能是xml文件错误导致的. 解决方法:1.找到菜单栏中“项目”(project)选项下的“清理”(clean),然后在弹出的对话框中选择你要清理的工程:2.如果没有效果,可以选中项目名称,右击选择“源代码”->“清理”,确定完成.虽然两者都是清理操作,但感觉效果是不一样的:3.如果还是没有出

C#遍历文件夹(包括子目录)下的所有文件

前提现在一个分区下建立bb.txt文件. 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.IO; 10 11 name

Java遍历文件夹下的所以文件

利用Java递归遍历文件夹下的所以文件,然后对文件进行其他的操作.如:对文件进行重命名,对某一类文件进行重编码.可以对某一工程下的全部.java文件进行转码成utf-8等 代码如下,这里只对文件进行重命名操作 1 package com.zhang.test; 2 3 import java.io.File; 4 5 public class getfilepath { 6 7 public static void main(String[] args) { 8 getDirectory(new

C#遍历文件夹及文件

背景: 想自己实现一个网盘系统,于是需要用到遍历文件(夹)操作. C#基本知识梳理: 1.如何获取指定目录包含的文件和子目录 (1). DirectoryInfo.GetFiles():获取目录中(不包含子目录)的文件,返回类型为FileInfo[],支持通配符查找:  (2). DirectoryInfo.GetDirectories():获取目录(不包含子目录)的子目录,返回类型为DirectoryInfo[],支持通配符查找: (3). DirectoryInfo. GetFileSyst

Python遍历文件夹和读写文件的方法

本文和大家分享的主要是python开发中遍历文件夹和读写文件的相关内容,一起来看看吧,希望对大家学习和使用这部分内容有所帮助. 需 求 分 析 1.读取指定目录下的所有文件 2.读取指定文件,输出文件内容 3.创建一个文件并保存到指定目录 实 现 过 程 Python写代码简洁高效,实现以上功能仅用了40行左右的代码~ 昨天用Java写了一个写入.创建.复制.重命名文件要将近60行代码: 不过简洁的代价是牺牲了一点点运行速度,但随着硬件性能的提升,运行速度的差异会越来越小,直到人类无法察觉~ #

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

FolderForm.cs的代码如下: using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Text; using System.Windows.Forms; namespace HoverTree.Hewenqi { public partial class FolderForm : Form { public FolderForm() {

使用C遍历文件夹

使用windows.h中的函数FindFirstFILE() 和FindNextFile()遍历文件夹中的函数. 函数说明: 1.FindFirstFile()   //#include<windows.h> HANDLE WINAPI FindFirstFile( //返回值是句柄 HANDLE,这个值用于函数FindNextFile() _In_   LPCTSTR lpFileName, //需要遍历的文件夹的路径名,此参数不能为空,不能为空字符串, //最好使用通配符来限定查找的文件,