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