`
bogongjie
  • 浏览: 235958 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

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 --;
					}
				}
			}
		}
	}

}

 

分享到:
评论

相关推荐

    Android树形结构RecyclerView

    在本项目中,我们关注的是一个特别的应用场景——"Android树形结构RecyclerView",这是一个专门设计用于展示无限层级数据的RecyclerView实现。这种组件在企业级应用中尤其常见,如组织架构、文件目录、分类导航等,...

    Android 树形结构的多选CheckBox

    在Android开发中,实现树形结构的多选CheckBox是一项常见的需求,主要用于展现层次关系的数据,并允许用户进行多项选择。这个“Android 树形结构的多选CheckBox”项目提供了一个易于集成和使用的解决方案。 首先,...

    android树形列表

    本篇将详细介绍Android树形列表的实现、特点以及常见应用场景。 一、树形列表的概念 树形列表,顾名思义,是将数据以树状结构进行展示,每个节点可以有零个或多个子节点,形成一种层次分明的视图。在Android中,...

    Android树形选择插件.zip

    本压缩包"Android树形选择插件.zip"提供了一个易于理解和使用的解决方案,它允许开发者快速集成一个任意层级的树形下拉菜单。以下是关于这个插件及其应用的详细知识点: 1. **树形控件(TreeView)**:树形控件是一...

    Android多级树形列表实现

    在Android开发中,构建多级树形列表是一种常见的需求,比如在展示文件系统、组织结构或者类别分类时。本文将详细讲解如何在Android中实现这种功能。 首先,我们需要理解树形结构的基本概念。树形结构是由节点(Node...

    Android 树形菜单

    通过以上步骤,我们可以构建出一个灵活、可扩展的Android树形菜单。在实际开发中,可以参考开源库,如`android-treeview`或`android-expandable-recycler-view`,它们提供了现成的解决方案,能快速集成到项目中。...

    Android 树形结构开发demo,实现单选多选功能

    在Android应用开发中,树形结构的界面设计是一种常见的数据展示方式,特别是在处理层级关系复杂的数据时,如文件系统、组织架构等。本教程将详细讲解如何利用Android技术实现一个支持单选和多选功能的树形结构示例。...

    android 树形多选框,真正意义上的 树形多选框,和 web的样式 很类似

    android 树形多选框,真正意义上的 树形多选框,和 web的样式 很类似。 android 树形多选框,真正意义上的 树形多选框,和 web的样式 很类似. 我也整理 了好长时间呢, 体谅我下,谢谢!请 尊重劳动成果,需要有分...

    android树形文件结构

    `Demo_zhy_05_tree_view_beta` 可能是一个关于Android树形视图控件(TreeView)的示例代码或教程,这在构建复杂的用户界面时非常有用,特别是当需要显示多层次数据时。TreeView允许用户以层次结构的方式查看数据,...

    android树形结构

    在Android开发中,树形结构是一种常见的数据组织方式,它以层次化的方式组织元素,就像自然界中的树木一样,有根节点、子节点和可能的孙子节点等。在本篇文章中,我们将深入探讨如何在Android中实现树形结构,并讨论...

    Android树形控件

    通过以上步骤,我们可以构建一个高效的Android树形控件,既能展示无限层级的数据,又能提供良好的用户体验。在实际项目中,可能还需要根据具体需求进行调整和优化,比如加入自定义样式、交互反馈等。文件...

    android树形选择框

    在Android开发中,"android树形选择框"通常指的是使用ExpandableListView来实现的一种界面组件。这个组件可以展示数据以树形结构的方式,允许用户进行多级展开和折叠,同时支持单选和多选功能。在给定的场景中,描述...

    android无限级树形控件

    在Android开发中,树形控件(Tree View)是一种常用的数据展示组件,它能够以层级结构展示数据,常用于文件系统、目录结构或者组织结构等场景。标题“android无限级树形控件”指的是该控件可以支持任意深度的嵌套,...

    android 树形文件列表

    本文将深入探讨Android树形文件列表的实现原理、相关API以及如何在实际开发中创建和使用。 1. 文件系统基础: Android基于Linux内核,因此其文件系统遵循POSIX标准,采用的是典型的目录树结构,根目录为"/"。每个...

    Android-TreeView具有高性能和丰富功能的Android树形视图

    在Android应用开发中,UI设计是至关重要的,而树形视图(TreeView)是一种常见的数据结构展示方式,尤其适用于层次关系复杂的数据展示。本篇将深入探讨“Android-TreeView”库,一个专为Android设计的高性能、功能...

    Android树形Demo

    在Android开发中,"Android树形Demo"是一个典型的用例,它主要展示了如何利用ListView控件来实现一种类似于计算机文件系统的树形结构。ListView是Android UI框架中的一个重要组件,用于展示大量的可滚动列表数据。在...

    android树形菜单,树形结构,多级展示

    树形菜单,用来展示有层次结构的数据,像文件管理器,一个文件夹下面有很多文件,文件夹,可能文件夹下面还有文件还有文件夹。我们需要展示这些结构,但是安卓并没有提供一个比较方便的控件来展示,所以就需要我们...

    Android树形结构列表

    下面将详细讲解Android树形结构列表的实现原理、关键组件以及常见设计模式。 1. **树形数据结构**: 树形结构是一种非线性数据结构,由节点(Node)组成,每个节点可以有零个或多个子节点。在Android中,通常用...

    Android Recyclerview实现多级树形列表

    本示例“Android RecyclerView实现多级树形列表”旨在教你如何在RecyclerView中构建一个能够展示层级关系数据的列表。这样的列表常用于展现目录结构、组织架构或者分类信息等。 首先,我们要理解RecyclerView的基本...

Global site tag (gtag.js) - Google Analytics