package com.ostrichmyself.txtReader;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
/**展现全部文件的Activity
* 按返回键可以向上回溯文件路径,
* */
public class ListAllFileActivity extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.filelist);
initFileList();
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
initFile();
return false;
}
return super.onKeyDown(keyCode, event);
}
private void initFile()
{
if (this.getTitle().toString().equals("/mnt/sdcard"))
{
Intent intent = new Intent(ListAllFileActivity.this, TxtReader.class);
startActivityForResult(intent, 1);//执行转换操作
finish();
}
else
{
File files2 =new File(this.getTitle().toString());
files2=files2.getParentFile(); // 获取上一级目录
File[] f = files2.listFiles(); // 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件
fill(f);
try {
setTitle(files2.getCanonicalPath());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void initFileList()
{
File path = android.os.Environment.getExternalStorageDirectory();// getExternalStorageDirectory获取外部存储设备的路径
File[] f = path.listFiles();// 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件
fill(f);
try {
setTitle(path.getCanonicalPath());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**传递参数给下一个Activity*/
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
File file = fileNameList.get(position);
if (file.isDirectory())
{
File[] f = file.listFiles();
fill(f);
//files=file;
try {
setTitle(file.getCanonicalPath());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else {
Intent intent = new Intent(ListAllFileActivity.this, TxtReader.class);
bundle = new Bundle();//初始化,这是一个很好的习惯,然后用来给下一activity传递参数
bundle.putString(fileNameKey, file.getAbsolutePath());//getAbsolutePath()返回此抽象路径名的绝对路径名字符串。putString() 插入一个给定key的字符串值
intent.putExtras(bundle);//保存
startActivityForResult(intent, 1);//执行转换操作
this.finish();
finish();
}
}
// 读取当前文件层的列表,并设置listview
private void fill(File[] files) {
fileNameList = new ArrayList<File>();
for (File file : files) {
if (isValidFileOrDir(file)) {
fileNameList.add(file);
}
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, fileToStrArr(fileNameList));
setListAdapter(adapter);//设置 adapter 的列表项目
}
/*检查是否为合法的文件名,或者是否为路径*/
private boolean isValidFileOrDir(File file)
{
if (file.isDirectory()) { ///测试此抽象路径名表示的文件是否是一个目录。
return true;
}
else {
String fileName = file.getName().toLowerCase(); //把英文字母转化为小写以方便接下来的判断
if (fileName.endsWith(".txt")) //判断对象的末尾是否与指定的字符串匹配
{
return true;
}
}
return false;
}
private String[] fileToStrArr(List<File> fl)
{
ArrayList<String> fnList = new ArrayList<String>();
for (int i = 0; i < fl.size(); i++) {
String nameString = fl.get(i).getName();
fnList.add(nameString);
}
return fnList.toArray(new String[0]); //按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。
}
/*文件列表*/
private List<File> fileNameList;
private Bundle bundle;
private String fileNameKey = "fileName";
}