Android 类似于windows打开文件对话框的实现

版权声明:转载请注明出处:https://blog.csdn.net/zwjemperor https://blog.csdn.net/zwjemperor/article/details/7752151
源码:
public class FileExplorerActivity extends ListActivity
{
	private final static String FILE_TYPE = "filetype";
	private final static String FILE_NAME = "filename";

	private ListView listView;
	private File currentParent;
	private File[] currentFiles;
	private List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
	private Stack<File> dirStack = new Stack<File>();
	private boolean isRoot = true;

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		listView = getListView();
		listView.setBackgroundColor(Color.WHITE);
		listView.setCacheColorHint(Color.WHITE);
		setContentView(listView);
		listView.setOnItemClickListener(itemClickListener);
		init();
	}

	private void init()
	{
		File root = Environment.getExternalStorageDirectory();
		if (!root.exists())
			return;
		currentParent = root;
		currentFiles = root.listFiles();
		sortFiles(currentFiles);
		dirStack.push(currentParent);
		inflateListView(currentFiles);
		isRoot = true;
	}

	private void sortFiles(File[] files)
	{
		Arrays.sort(files, new Comparator<File>()
		{
			public int compare(File paramFile1, File paramFile2)
			{
				return (int) (paramFile2.lastModified() - paramFile1.lastModified());
			}
		});
	}

	private OnItemClickListener itemClickListener = new OnItemClickListener()
	{
		@Override
		public void onItemClick(AdapterView<?> parent, View view, int position, long id)
		{
			if (position == 0)
			{
				up2Parent();
				return;
			}
			int pos = position;
			if (isRoot)
				isRoot = false;
			else
				--pos;
			if (currentFiles[pos].isFile())
				return;
			File[] tmp = currentFiles[pos].listFiles();
			sortFiles(tmp);
			currentParent = currentFiles[pos];
			currentFiles = tmp;
			dirStack.push(currentParent);
			inflateListView(currentFiles);
		}
	};

	private void up2Parent()
	{
		if (!dirStack.isEmpty() && !isRoot)
		{
			dirStack.pop();
			if (dirStack.size() == 1)
				isRoot = true;
			if (!dirStack.isEmpty())
			{
				currentParent = dirStack.peek();
				currentFiles = currentParent.listFiles();
				inflateListView(currentFiles);
			}
		}
	}

	private void inflateListView(File[] files)
	{
		if (files == null)
			return;
		listItems.clear();
		Map<String, Object> listItem;
		if (!isRoot)
		{
			listItem = new HashMap<String, Object>();
			listItem.put(FILE_TYPE, R.drawable.file_up);
			listItem.put(FILE_NAME, "..");
			listItems.add(listItem);
		}
		for (int i = 0; i < files.length; i++)
		{
			listItem = new HashMap<String, Object>();
			if (files[i].isDirectory())
				listItem.put(FILE_TYPE, R.drawable.folder);
			else
				listItem.put(FILE_TYPE, R.drawable.file);
			listItem.put(FILE_NAME, files[i].getName());
			listItems.add(listItem);
		}
		SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems, R.layout.fileselectoritem, new String[] { FILE_TYPE, FILE_NAME }, new int[] { R.id.txtTypeIcon, R.id.txtFileName });
		listView.setAdapter(simpleAdapter);
	}

	@Override
	public void onBackPressed()
	{
		if (isRoot)
			super.onBackPressed();
		else
			up2Parent();
	}
}


布局文件

<?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="fill_parent"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/txtTypeIcon"
        android:layout_width="27.0dip"
        android:layout_height="30.0dip"
        android:layout_margin="5.0dip"/>

    <TextView
        android:id="@+id/txtFileName"
        android:layout_width="0.0dip"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_weight="1.0" 
        android:textColor="@android:color/black"/>

</LinearLayout>


 

猜你喜欢

转载自blog.csdn.net/zwjemperor/article/details/7752151