本实例以文件浏览器为例。
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 --;
}
}
}
}
}
}