Android的数据存储和IO-SD卡文件浏览器

Android的数据存储和IO-SD卡文件浏览器

创建项目:SDFileExplorer

运行项目结果:

 

布局文件:main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	>
<!-- 显示当前路径的的文本框 -->
<TextView  
	android:id="@+id/path"
	android:layout_width="fill_parent" 
	android:layout_height="wrap_content" 
	android:layout_gravity="center_horizontal" 
	/>
<!-- 列出当前路径下所有文件的ListView -->
<ListView  
	android:id="@+id/list"
	android:layout_width="wrap_content" 
	android:layout_height="wrap_content" 
	android:divider="#000"
	/>
<!-- 返回上一级目录的按钮 -->
<Button android:id="@+id/parent"
	android:layout_width="wrap_content" 
	android:layout_height="wrap_content" 
	android:background="@drawable/home"
	android:paddingTop="20dp"
	android:layout_gravity="center"/>
</LinearLayout>


列表布局文件: line.xml

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="horizontal"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	>	
<!-- 定义一个ImageView,用于作为列表项的一部分。 -->
<ImageView android:id="@+id/icon"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content" 
	android:paddingLeft="10dp"
	/>
<!-- 定义一个TextView,用于作为列表项的一部分。 -->
<TextView android:id="@+id/file_name"
	android:layout_width="wrap_content" 
	android:layout_height="wrap_content"
	android:textSize="16dp"
	android:gravity="center_vertical"
	android:paddingLeft="10dp"
	android:paddingTop="10dp"
	android:paddingBottom="10dp"	
	/>	
</LinearLayout>


Activity文件:SDFileExplorer.java

package wwj.sdfileexplorer;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class SDFileExplorer extends Activity {
	
	ListView listView;
	TextView textView;
	//记录当前的父文件夹
	File currentParent;
	//记录当前目录路径下的所有文件的文件数组
	File[] currentFiles;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //获取列出全部文件的ListView
        listView = (ListView)findViewById(R.id.list);
        textView = (TextView)findViewById(R.id.path);
        //获取系统的SD卡的目录
        File root = new File("/mnt/sdcard/");
        //如果SD卡存在
        if(root.exists()){
        	currentParent = root;
        	currentFiles = root.listFiles();
        	//使用当前目录下的全部文件、文件夹来填充ListView
        	inflateListView(currentFiles);
        }
        //为ListView的列表项的单击事件绑定监听器
        listView.setOnItemClickListener(new OnItemClickListener() {

			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				// TODO Auto-generated method stub
				//用户单击了文件,直接返回,不做任何处理
				if(currentFiles[arg2].isFile())
					return;
				//获取用户单击的文件夹下的所有文件
				File[] tmp = currentFiles[arg2].listFiles();
				if(tmp == null || tmp.length == 0){
					Toast.makeText(SDFileExplorer.this, "当前路径不可访问或该路径下没有文件", 20000).show();
				}
				else{
					//获取用户单击的列表项对应的文件夹,设为当前的父文件夹
					currentParent = currentFiles[arg2];
					//保存当前的父文件夹内的全部文件和文件夹
					currentFiles = tmp;
					//再次更新ListView
					inflateListView(currentFiles);
				}
			}
		});
        //获取上一级目录的按钮
        Button parent = (Button)findViewById(R.id.parent);
        parent.setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {
				// TODO Auto-generated method stub
				try{
					if(!currentParent.getCanonicalPath().equals("/mnt/sdcard")){
						//获取上级目录
						currentParent = currentParent.getParentFile();
						//列出当前目录下所有文件
						currentFiles = currentParent.listFiles();
						//再次更新ListView
						inflateListView(currentFiles);
					}
				}catch (Exception e) {
					// TODO: handle exception
					e.printStackTrace();
				}
			}
		});
    }
    private void inflateListView(File[] files){
    	//创建一个List集合,List集合的元素是Map
    	List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
    	for(int i = 0; i < files.length; i++){
    		Map<String, Object> listItem = new HashMap<String, Object>();
    		//如果当前File是文件夹,使用floder图标;否则使用file图标
    		if(files[i].isDirectory()){
    			listItem.put("icon", R.drawable.folder);
    		}
    		else{
    			listItem.put("icon", R.drawable.file);
    		}
    		listItem.put("fileName", files[i].getName());
    		//添加List项
    		listItems.add(listItem);
    	}
    	//创建一个SimpleAdapter
    	SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems, R.layout.line, 
    			new String[]{"icon","fileName"}, new int[]{R.id.icon, R.id.file_name});
    	//为ListView设置Adapter
    	listView.setAdapter(simpleAdapter);
    	try{
    		textView.setText("当前路径为: " + currentParent.getCanonicalPath());
    	}catch (Exception e) {
			// TODO: handle exception
    		e.printStackTrace();
		}
    }
}


 

posted on 2012-07-27 10:53  1.曲待续  阅读(444)  评论(0编辑  收藏  举报

导航