android 树形目录

本实例以文件浏览器为例。

 1.先定义每个节点的属性:

package com.wistron.file.tree;

public class FileElement {
	private String ID;
	private Object mFileIcon;
	private String mShowMessage;
	private String mFilePath;
	private boolean mhasParent;
	private boolean mhasChild;
	private String mParentID;
	private int mCurLevel;
	private boolean misExpanded;

	public String getId() {
		return ID;
	}

	public void setId(String id) {
		this.ID = id;
	}
	
	public Object getObject(){
		return mFileIcon;
	}

	public void setObject(Object object){
		this.mFileIcon = object;
	}
	
	public String getShowMessage() {
		return mShowMessage;
	}

	public void setShowMessage(String showmessge) {
		this.mShowMessage = showmessge;
	}
	
	public String getFilePath(){
		return mFilePath;
	}
	
	public void setFilePath(String path){
		this.mFilePath = path;
	}

	public boolean isHasParent() {
		return mhasParent;
	}

	public void setHasParent(boolean mhasParent) {
		this.mhasParent = mhasParent;
	}

	public boolean ishasChild() {
		return mhasChild;
	}

	public void sethasChild(boolean mhasChild) {
		this.mhasChild = mhasChild;
	}

	public String getParentID() {
		return mParentID;
	}

	public void setParentID(String parentid) {
		this.mParentID = parentid;
	}

	public int getCurLevel() {
		return mCurLevel;
	}

	public void setCurLevel(int level) {
		this.mCurLevel = level;
	}

	public boolean isExpanded() {
		return misExpanded;
	}

	public void setExpanded(boolean expanded) {
		this.misExpanded = expanded;
	}

	public FileElement(String id, String showmessage, boolean mhasParent, boolean mhasChild, String parentid, int curlevel, boolean expanded) {
		super();
		this.ID = id;
		this.mShowMessage = showmessage;
		this.mhasParent = mhasParent;
		this.mhasChild = mhasChild;
		this.mParentID = parentid;
		this.mCurLevel = curlevel;
		this.misExpanded = expanded;
	}
	
	public FileElement(){
		
	}

}

 2.自定义一个ArrayAdapter.

   

package com.wistron.file.tree;

import java.util.List;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class TreeViewAdapter extends ArrayAdapter {
	private LayoutInflater mInflater;
	private List<FileElement> mFileList;
	private Bitmap mIconCollapse;
	private Bitmap mIconExpand;

	public TreeViewAdapter(Context context, int textViewResourceId, List<FileElement> list) {
		super(context, textViewResourceId, list);
		mInflater = LayoutInflater.from(context);
		mFileList = list;
		mIconCollapse = BitmapFactory.decodeResource(context.getResources(), R.drawable.outline_list_collapse);
		mIconExpand = BitmapFactory.decodeResource(context.getResources(), R.drawable.outline_list_expand);

	}

	public int getCount() {
		return mFileList.size();
	}

	public Object getItem(int position) {
		return position;
	}

	public long getItemId(int position) {
		return position;
	}

	public View getView(int position, View convertView, ViewGroup parent) {

		ViewHolder holder;
		if (convertView == null) {
			convertView = mInflater.inflate(R.layout.list_item, null);
			holder = new ViewHolder();
			holder.Icon = (ImageView) convertView.findViewById(R.id.icon);
			holder.mFileIcon = (ImageView)convertView.findViewById(R.id.file_icon);
			holder.mFileName = (TextView) convertView.findViewById(R.id.text);
			convertView.setTag(holder);

		} else {
			holder = (ViewHolder) convertView.getTag();
		}

		int level = mFileList.get(position).getCurLevel();
		holder.Icon.setPadding(25 * (level + 1), holder.Icon.getPaddingTop(), 0, holder.Icon.getPaddingBottom());
		holder.mFileIcon.setImageBitmap((Bitmap)mFileList.get(position).getObject());
		holder.mFileName.setText(mFileList.get(position).getShowMessage());
		if (mFileList.get(position).ishasChild() && (mFileList.get(position).isExpanded() == false)) {
			holder.Icon.setImageBitmap(mIconCollapse);
			holder.Icon.setVisibility(View.VISIBLE);
		} else if (mFileList.get(position).ishasChild() && (mFileList.get(position).isExpanded() == true)) {
			holder.Icon.setImageBitmap(mIconExpand);
			holder.Icon.setVisibility(View.VISIBLE);
		} else if (!mFileList.get(position).ishasChild()) {
			holder.Icon.setImageBitmap(mIconCollapse);
			holder.Icon.setVisibility(View.INVISIBLE);
		}
		return convertView;
	}

	class ViewHolder {
		ImageView Icon;
		ImageView mFileIcon;
		TextView mFileName;
	}
}

 3.功能实现:

    

package com.wistron.file.tree;

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

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.Matrix;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnItemClickListener {
	private ListView mFileListView;
	private EditText mSelectFileText;

	private ArrayList<FileElement> mFileList = new ArrayList<FileElement>();
	private ArrayList<FileElement> mTempFileList = new ArrayList<FileElement>();
	private ArrayList<FileElement> mTransferFileList = new ArrayList<FileElement>();
	private TreeViewAdapter mTreeViewAdapter;
	private int ID = 0;

	private String mPath = Environment.getExternalStorageDirectory().getPath();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		mFileListView = (ListView) findViewById(R.id.file_list);
		mSelectFileText = (EditText) findViewById(R.id.select_file);

		mTreeViewAdapter = new TreeViewAdapter(this, R.layout.outline, mFileList);
		mFileListView.setAdapter(mTreeViewAdapter);
		mFileListView.setOnItemClickListener(this);

		getFileDir(mPath, 0, 0);
		for (FileElement mElement : mTempFileList) {
			mFileList.add(mElement);
		}
		mTreeViewAdapter.notifyDataSetChanged();
	}

	public void getFileDir(String path, int level, int parentid) {
		if (mTempFileList.size() > 0) {
			mTempFileList.clear();
		}

		File file = new File(path);
		File[] files = file.listFiles();
		if (files != null && files.length > 0) {
			for (File mTempFile : files) {
				ID++;
				FileElement mFileElement = new FileElement();
				mFileElement.setId(formatid(ID));
				mFileElement.setFilePath(mTempFile.getPath());
				mFileElement.setCurLevel(level);
				mFileElement.setShowMessage(mTempFile.getName());
				mFileElement.setHasParent(false);
				mFileElement.setParentID(formatid(parentid));
				mFileElement.setExpanded(false);

				if (mTempFile.isDirectory()) {
					if (getFolderEmpty(mTempFile.getPath())) {
						Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.folder_have_file);
						mFileElement.setObject((Object) zoomBitmap(mBitmap));
						mFileElement.sethasChild(true);
					} else {
						Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.folder_no_file);
						mFileElement.setObject((Object) zoomBitmap(mBitmap));
						mFileElement.sethasChild(false);
					}
				} else if (mTempFile.isFile()) {
					Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.file);
					mFileElement.setObject((Object) zoomBitmap(mBitmap));
					mFileElement.sethasChild(false);
				}
				mTempFileList.add(mFileElement);
			}
		}

	}

	public String formatid(int id) {
		String stringid = "";
		if (id < 10) {
			stringid = "00" + id;
		} else if (id < 100) {
			stringid = "0" + id;
		} else if (id < 1000) {
			stringid = String.valueOf(id);
		}

		return stringid;
	}

	public boolean getFolderEmpty(String path) {
		boolean isEmpty = false;
		File file = new File(path);
		File[] files = file.listFiles();
		if (files != null && files.length >= 1) {
			isEmpty = true;
		}
		return isEmpty;
	}

	private Bitmap zoomBitmap(Bitmap mBitmap) {
		Bitmap mTempBitmap = null;

		int widht = mBitmap.getWidth();
		int height = mBitmap.getHeight();

		Matrix matrix = new Matrix();
		matrix.postScale((float) 0.5, (float) 0.5);
		mTempBitmap = Bitmap.createBitmap(mBitmap, 0, 0, widht, height, matrix, true);
		return mTempBitmap;
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
		// TODO Auto-generated method stub
		FileElement mTempFileElement = mFileList.get(arg2);
		if (mTempFileElement.ishasChild() && !mTempFileElement.isExpanded()) {
			if (mTransferFileList.size() > 0) {
				mTransferFileList.clear();
			}
			String path = mTempFileElement.getFilePath();
			getFileDir(path, mTempFileElement.getCurLevel() + 1, Integer.valueOf(mTempFileElement.getId()));
			for (FileElement mElement : mFileList) {
				if (mElement.getId().equals(mTempFileElement.getId())) {
					mElement.setExpanded(true);
					mTransferFileList.add(mElement);
					for (FileElement mElement2 : mTempFileList) {
						if (mElement2 != null) {
							mTransferFileList.add(mElement2);
						}
					}
				} else {
					mTransferFileList.add(mElement);
				}
			}
			if (mFileList.size() > 0) {
				mFileList.clear();
			}
			for (FileElement mElement : mTransferFileList) {
				String str = "ID: " + mElement.getId() + ", Path: " + mElement.getFilePath() + ", ParentID: " + mElement.getParentID();
				Log.i("WISTRON", str);
				mFileList.add(mElement);
			}
			mTreeViewAdapter.notifyDataSetChanged();
		} else if (mTempFileElement.ishasChild() && mTempFileElement.isExpanded()) {
			RemoveChild(mTempFileElement);
			mTempFileElement.setExpanded(false);
			mTreeViewAdapter.notifyDataSetChanged();
		} else {
			mSelectFileText.setText(mTempFileElement.getFilePath());
			mSelectFileText.setTextColor(Color.BLACK);
		}
	}

	public void RemoveChild(FileElement mFileElement) {
		for (int i = 0; i < mFileList.size(); i++) {
			FileElement mElement = mFileList.get(i);
			if (mElement != null) {
				if (mElement.getParentID().equals(mFileElement.getId())) {
					if (mElement.ishasChild()) {
						mFileList.remove(i);
						RemoveChild(mElement);
						i --;
						ID --;
					} else {
						mFileList.remove(i);
						i --;
						ID --;
					}
				}
			}
		}
	}

}

猜你喜欢

转载自bgj.iteye.com/blog/1968104
今日推荐