android SD卡浏览器

设计思路:

1.首先得到sd卡目录,如果sd卡存在就把sd卡根目录下的文件和文件夹显示在listview中,

2.定义两个button,一个用于返回根目录,一个用于返回上一层,

3.对listview位置进行监听,如果是文件则提示打不开,如果是文件夹就进入下个目录,得到下个目录底下的文件和文件夹,刷新listview

代码:

View Code
  1 package cn.shaoyangjiang.com;
2 import java.io.File;
3 import java.text.SimpleDateFormat;
4 import java.util.ArrayList;
5 import java.util.Date;
6 import java.util.HashMap;
7 import java.util.List;
8 import java.util.Map;
9
10 import android.app.Activity;
11 import android.os.Bundle;
12 import android.view.View;
13 import android.widget.AdapterView;
14 import android.widget.AdapterView.OnItemClickListener;
15 import android.widget.Button;
16 import android.widget.ListView;
17 import android.widget.SimpleAdapter;
18 import android.widget.TextView;
19 import android.widget.Toast;
20
21 public class WJActivity extends Activity {
22
23 private TextView tvpath;
24 private ListView lvFiles;
25 private Button btnParent;
26 private Button btRoot;
27
28 // 记录当前的父文件夹
29 File currentParent;
30 File root;
31 // 记录当前路径下的所有文件夹的文件数组
32 File[] currentFiles;
33
34 public void onCreate(Bundle savedInstanceState) {
35 super.onCreate(savedInstanceState);
36 setContentView(R.layout.main);
37
38 lvFiles = (ListView) this.findViewById(R.id.files);
39 tvpath = (TextView) this.findViewById(R.id.tvpath);
40 btnParent = (Button) this.findViewById(R.id.btnParent);
41 btRoot = (Button) this.findViewById(R.id.btRoot);
42
43 // 获取系统的SDCard的目录
44 root = new File("/mnt/sdcard/");
45 // 如果SD卡存在的话
46 if (root.exists()) {
47
48 currentParent = root;
49 currentFiles = root.listFiles();
50 // 使用当前目录下的全部文件、文件夹来填充ListView
51 inflateListView(currentFiles);
52
53 }
54
55 lvFiles.setOnItemClickListener(new OnItemClickListener() {
56 @Override
57 public void onItemClick(AdapterView<?> adapterView, View view,
58 int position, long id) {
59 // 如果用户单击了文件,直接返回,不做任何处理
60 if (currentFiles[position].isFile()) {
61 // 也可自定义扩展打开这个文件等
62 Toast.makeText(WJActivity.this,
63 "文件打不开的", Toast.LENGTH_LONG).show();
64 return;
65 }
66 // 获取用户点击的文件夹 下的所有文件
67 File[] tem = currentFiles[position].listFiles();
68 if (tem == null || tem.length == 0) {
69
70 Toast.makeText(WJActivity.this,
71 "当前路径不可访问或者该路径下没有文件", Toast.LENGTH_LONG).show();
72 } else {
73 // 获取用户单击的列表项对应的文件夹,设为当前的父文件夹
74 currentParent = currentFiles[position];
75 // 保存当前的父文件夹内的全部文件和文件夹
76 currentFiles = tem;
77 // 再次更新ListView
78 inflateListView(currentFiles);
79 }
80
81 }
82 });
83
84 // 获取上一级目录
85 btnParent.setOnClickListener(new View.OnClickListener() {
86
87 @Override
88 public void onClick(View v) {
89 try {
90
91 if (!currentParent.getCanonicalPath().equals("/mnt/sdcard")) {
92
93 // 获取上一级目录
94 currentParent = currentParent.getParentFile();
95 // 列出当前目录下的所有文件
96 currentFiles = currentParent.listFiles();
97 // 再次更新ListView
98 inflateListView(currentFiles);
99 }
100 } catch (Exception e) {
101 // TODO: handle exception
102 }
103
104 }
105 });
106
107 // 回到根目录
108 btRoot.setOnClickListener(new View.OnClickListener() {
109
110 @Override
111 public void onClick(View v) {
112 currentParent = root;
113 currentFiles = root.listFiles();
114 // 使用当前目录下的全部文件、文件夹来填充ListView
115 inflateListView(currentFiles);
116 }
117 });
118
119 }
120
121 /**
122 * 根据文件夹填充ListView
123 *
124 * @param files
125 */
126 private void inflateListView(File[] files) {
127
128 List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
129
130 for (int i = 0; i < files.length; i++) {
131
132 Map<String, Object> listItem = new HashMap<String, Object>();
133
134 if (files[i].isDirectory()) {
135 // 如果是文件夹就显示的图片为文件夹的图片
136 listItem.put("icon", R.drawable.folder);
137 } else {
138 listItem.put("icon", R.drawable.file);
139 }
140 // 添加一个文件名称
141 listItem.put("filename", files[i].getName());
142
143 File myFile = new File(files[i].getName());
144
145 // 获取文件的最后修改日期
146 long modTime = myFile.lastModified();
147 SimpleDateFormat dateFormat = new SimpleDateFormat(
148 "yyyy-MM-dd HH:mm:ss");
149 System.out.println(dateFormat.format(new Date(modTime)));
150
151 // 添加一个最后修改日期
152 listItem.put("modify",
153 "修改日期:" + dateFormat.format(new Date(modTime)));
154
155 listItems.add(listItem);
156
157 }
158
159 // 定义一个SimpleAdapter
160 SimpleAdapter adapter = new SimpleAdapter(
161 WJActivity.this, listItems, R.layout.list_item,
162 new String[] { "filename", "icon", "modify" }, new int[] {
163 R.id.file_name, R.id.icon, R.id.file_modify });
164
165 // 填充数据集
166 lvFiles.setAdapter(adapter);
167
168 try {
169 tvpath.setText("当前路径为:" + currentParent.getCanonicalPath());
170 } catch (Exception e) {
171 e.printStackTrace();
172 }
173
174 }
175 }

布局文件:

View Code
 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:orientation="vertical" >
6 <TextView
7 android:id="@+id/tvpath"
8 android:layout_gravity="center_horizontal"
9 android:layout_width="fill_parent"
10 android:layout_height="wrap_content"
11 android:textColor="#ff0000"
12 android:textSize="20dip"
13 />
14 <Button android:id="@+id/btRoot"
15 android:layout_width="fill_parent"
16 android:layout_height="wrap_content"
17 android:text="回到根目录"
18 android:layout_gravity="center"/>
19 <Button android:id="@+id/btnParent"
20 android:layout_width="fill_parent"
21 android:layout_height="wrap_content"
22 android:text="回到上一层目录"
23 android:paddingTop="20dip"
24 android:layout_gravity="center"/>
25
26 <ListView android:id="@+id/files"
27 android:layout_width="wrap_content"
28 android:layout_height="wrap_content"
29 >
30 </ListView>
31 </LinearLayout>

listview布局

View Code
 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:orientation="horizontal"
6 android:padding="5dip" >
7 <ImageView android:id="@+id/icon"
8 android:layout_width="wrap_content"
9 android:layout_height="wrap_content"
10 android:paddingLeft="10dp"
11 />
12 <LinearLayout android:orientation="vertical"
13 android:layout_width="wrap_content"
14 android:layout_height="wrap_content"
15 >
16 <TextView android:id="@+id/file_name"
17 android:layout_width="wrap_content"
18 android:layout_height="wrap_content"
19 android:textSize="16dp"
20 android:gravity="center_vertical"
21 />
22 <TextView android:id="@+id/file_modify"
23 android:layout_width="wrap_content"
24 android:layout_height="wrap_content"
25 android:textSize="16dp"
26 android:gravity="center_vertical"
27 />
28 </LinearLayout>
29
30 </LinearLayout>

效果图:




原文地址:https://www.cnblogs.com/shaoyangjiang/p/2394065.html