简易sd卡文件浏览

activity_main.xml, 增加剪头, 和空文件夹提示
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mainLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <RelativeLayout
        android:id="@+id/relative_layout"
        android:layout_width="fill_parent"
        android:layout_height="45dip"
        android:background="@drawable/list_item_background_normal" >

        <RelativeLayout
            android:id="@+id/current_path_pane"
            android:layout_width="fill_parent"
            android:layout_height="40dip"
            android:layout_alignParentLeft="true"
            android:layout_marginRight="48dip"
            android:background="@drawable/path_pane_bg"
            android:layout_marginTop="1dip" >

            <ImageView
                android:id="@+id/img_arrow"
                android:layout_width="30dip"
                android:layout_height="16dip"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:contentDescription="@string/img_des"
                 />

            <TextView
                android:id="@+id/txt_current_path"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_centerVertical="true"
                android:layout_toLeftOf="@id/img_arrow"
                android:ellipsize="start"
                android:singleLine="true"
                android:textSize="12sp" />
        </RelativeLayout>

        <ImageView
            android:id="@+id/img_up_level"
            android:layout_width="40dip"
            android:layout_height="40dip"
            android:layout_alignParentRight="true"
            android:contentDescription="@string/img_des"
            android:src="@drawable/img_back_btn_press" />
    </RelativeLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/relative_layout"
        android:layout_marginBottom="5dip" >

        <ListView
            android:id="@+id/fileListView"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="#FFFFFF"
            android:cacheColorHint="#00000000" >
        </ListView>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/layout_empty"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:orientation="vertical"
        android:visibility="visible" >

        <ImageView
            android:id="@+id/img_no_sub_file"
            android:layout_width="80dip"
            android:layout_height="80dip"
            android:background="@drawable/empty_icon"
            android:contentDescription="@string/img_des" />

        <TextView
            android:id="@+id/txtEmpty"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="@string/txt_empty"
            android:textColor="#9D9D9D"
            android:textSize="20sp" />
    </LinearLayout>

</RelativeLayout>


pop_window.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/pathListView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#FFFFFF"
        android:cacheColorHint="#00000000"
        android:divider="#00000000" >
    </ListView>

</LinearLayout>


抽出MainActivity中文件处理代码成FileUtil类。
package com.lxm.filebrowser;

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

import android.util.Log;

/**
 * 
 * @author lxmgfd
 *
 */
public class FileUtil
{
	/**
	 * 实际使用的数据
	 * @param files
	 * @return
	 */
	public static List<String> getPath(String[] files)
	{
		List<String> list = new ArrayList<String>();
		int len = files.length - 1;
		for (int i = 0; i < len; i++) 
		{
			list.add(files[i]);
		}
		return list;
	}
	
	/**
	 * 用于界面显示的数据, 树状
	 * @param files
	 * @return
	 */
	public static List<String> getTree(String[] files)
	{
		List<String> list = new ArrayList<String>();
		int len = files.length - 1;
		String temp = "";
		
		for (int i = 0; i < len; i++) 
		{
			temp = getSpaceByCount(i)+files[i];
			list.add(temp);
			Log.v("test", "i="+i+" temp="+temp);
		}
		return list;
	}
	
	/**
	 * 设置树形前缀
	 * 如:
	 *   └─XXX
	 * @param count
	 * @return
	 */
	public static String getSpaceByCount(int count)
	{
		StringBuffer sbSpace = new StringBuffer();
		String space = "     ";
		String line = "└─";
		count = count + 1; 
		for (int i = 0; i < count; i++) 
		{
			sbSpace.append(space);
		}
		sbSpace.append(line);
		return sbSpace.toString();
	}
	
	/**
	 * 根据当前点击的目录获得当前目录
	 * @param list
	 * @param index
	 * @return
	 */
	public static String getCurPath(List<String> list, int index)
	{
		StringBuffer path = new StringBuffer();
		int len = list.size();
		String temp = "";
		for (int i = 0; i < len; i++) 
		{
			if (i > index) 
			{
				break;
			}
			
			if (i == 0)  // 代表根节点
			{
				temp = list.get(i);
			} 
			else 
			{
				temp = File.separator+list.get(i);
			}
			
			path.append(temp);
		}
		return path.toString();
	}
	
	/**
	 * 获得指定路径下面的文件名或目录名
	 * @param path
	 * @return
	 */
	public static List<String> getFilesByPath(String path)
	{
		List<String> list = new ArrayList<String>();
		File[] files = new File(path).listFiles();
		String name = "";
		
		for (File file : files) 
		{
			name = file.getName();
			list.add(name);
		}
		return list;
	}
}



MainActivity修改其中的弹窗为成员变量, 更好的控制弹窗无需重绘多次。
package com.lxm.filebrowser;

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

import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.os.Environment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;
import android.widget.TextView;

/**
 * 
 * @author lxmgfd
 *
 */
public class MainActivity extends Activity 
{
	private RelativeLayout mCurrentPathPane;   	// 文件路径布局
	private LinearLayout mEmptyFile;		   	// 没有文件布局	
	private TextView mTxtCurrentPath;		   	// 当前路径	
	private ImageView mImgUpLevel;			 	// 放回上一级图片按钮 
	private ImageView mImgArrow;				// 剪头图片按钮
	private PopupWindow mPopWindow;				// 弹窗
	
	private ListView mListView;					// 显示当前目录下的listview
	private StringArrayAdapter mAdapter;		
	private ListView mPopListView;				// 弹窗listview
	private StringArrayAdapter mPopAdapter;
	
	private String root;						// SDcard根目录
	private String curPath;
	private List<String> subPathList;			// 当前目录下的文件集合
	private List<String> listPath;				// 弹窗使用的目录集合
	
	private String SDCARD = "SD卡";
	private int ARROW_UP = R.drawable.arrow_up;
	private int ARROW_DOWN = R.drawable.arrow_down;
	
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		initUI();
	}

	private void initUI() 
	{
		root = Environment.getExternalStorageDirectory().toString();
		curPath = root;
		mCurrentPathPane = (RelativeLayout) findViewById(R.id.current_path_pane);
		mEmptyFile = (LinearLayout) findViewById(R.id.layout_empty);
		mTxtCurrentPath = (TextView) findViewById(R.id.txt_current_path);
		mImgUpLevel = (ImageView) findViewById(R.id.img_up_level);
		mImgArrow = (ImageView) findViewById(R.id.img_arrow);
		mListView = (ListView) findViewById(R.id.fileListView);
		
		initPopWindow();
		changePath();
		
		mCurrentPathPane.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				if (curPath.equals(root)) 
				{
					return;
				}
				showPopWindow();
			}
		});
		
		mImgUpLevel.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				curPath = new File(curPath).getParentFile().toString();
				changePath();
				closePopWindow();
			}
		});
		
		mListView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				String temp = curPath + File.separator + subPathList.get(position);
				File file = new File(temp);
				if (file.isDirectory())  // 当前文件为目录则进入该目录。
				{
					curPath = temp;
					changePath();
				}
			}
		});
	}
	
	/**
	 * 当前目录发生变化时调用函数, 修改当前目录位置, 设置返回按钮是否显示, 设置当前目录下的所有文件
	 */
	private void changePath()
	{
		setCurrentPath(mTxtCurrentPath, curPath.replace(root, SDCARD));
		showImgView();
		
		setListViewValue();
		showEmptyFileView();
	}
	
	/**
	 * 设置按钮上面的文字
	 * @param txtView
	 * @param strText
	 */
	private void setCurrentPath(TextView txtView, String strText){
		txtView.setText(strText);
	}
	
	/**
	 * 显示返回按钮和剪头
	 */
	private void showImgView()
	{
		int flag = View.VISIBLE;
		if (curPath.equals(root)) 
		{
			flag = View.INVISIBLE;
		}
		mImgArrow.setVisibility(flag);
		setArrowDirection(ARROW_DOWN);
		mImgUpLevel.setVisibility(flag);
	}
	
	private void setArrowDirection(int dir)
	{
		mImgArrow.setBackgroundResource(dir);
	}
	
	/**
	 * 列出当前文件目录下所有文件
	 */
	private void setListViewValue()
	{
		subPathList = FileUtil.getFilesByPath(curPath);
		if (null == mAdapter)
		{
			mAdapter = new StringArrayAdapter(getApplicationContext(), subPathList, 1);
		}
		
		mAdapter.setList(subPathList);
		mListView.setAdapter(mAdapter);
	}
	
	/**
	 * 是否显示没有文件
	 */
	private void showEmptyFileView()
	{
		int flag = View.GONE;
		if (subPathList.size() < 1) 
		{
			flag = View.VISIBLE;
		}
		mEmptyFile.setVisibility(flag);
	}

	/**
	 * 初始化弹窗
	 */
	@SuppressWarnings("deprecation")
	@SuppressLint("InflateParams")
	private void initPopWindow()
	{		
		LayoutInflater inflater = LayoutInflater.from(getApplicationContext());
		View view = inflater.inflate(R.layout.pop_window, null);
		mPopWindow = new PopupWindow(findViewById(R.id.mainLayout), LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
		mPopWindow.setContentView(view);
		mPopWindow.setFocusable(false);  
        mPopWindow.setBackgroundDrawable(new BitmapDrawable());
        
		mPopListView = (ListView) view.findViewById(R.id.pathListView);
        mPopListView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				clickPopItem(position);
				closePopWindow();
			}
		} );
	}
	
	/**
	 * 处理点击位置
	 * @param position
	 */
	private void clickPopItem(int position)
	{
		if (curPath.endsWith(listPath.get(position)) == false) 
		{
			curPath = FileUtil.getCurPath(listPath, position);
			changePath();
		}
	}
	
	/**
	 * 显示弹窗
	 * @param view
	 */
	private void showPopWindow()
 	{
		if (mPopWindow.isShowing() == false) 
		{
			setPopListViewValue();
			mPopWindow.showAsDropDown(findViewById(R.id.relative_layout));
			mPopWindow.setOutsideTouchable(false);
			setArrowDirection(ARROW_UP);
		}
		else 
		{
			closePopWindow();
		}
 	}
	
	/**
	 * 关闭
	 */
	private void closePopWindow() 
	{
		mPopWindow.dismiss();
		setArrowDirection(ARROW_DOWN);
	}

	/**
	 * 设置弹窗数据
	 */
	private void setPopListViewValue()
	{
		if (curPath.equals(root)) 
		{
			return ;
		}
		
		String path = curPath.replace(root + File.separator, "");
		String[] files = path.split(File.separator);
		List<String> listTree = new ArrayList<String>();  // UI显示数据
		listPath = new ArrayList<String>();				  // 实际使用数据

		listPath.add(root);		// 添加根节点
		listPath.addAll(FileUtil.getPath(files));
		
		listTree.add(SDCARD);   // 添加根节点
		listTree.addAll(FileUtil.getTree(files));
		
		if (null == mPopAdapter) 
		{
			mPopAdapter = new StringArrayAdapter(this, listTree, 2);  
		}
		mPopAdapter.setList(listTree);
		mPopListView.setAdapter(mPopAdapter);
	}
}










猜你喜欢

转载自lxmgfd.iteye.com/blog/2171516