本实例以文件浏览器为例。
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",这是一个专门设计用于展示无限层级数据的RecyclerView实现。这种组件在企业级应用中尤其常见,如组织架构、文件目录、分类导航等,...
在Android开发中,实现树形结构的多选CheckBox是一项常见的需求,主要用于展现层次关系的数据,并允许用户进行多项选择。这个“Android 树形结构的多选CheckBox”项目提供了一个易于集成和使用的解决方案。 首先,...
本篇将详细介绍Android树形列表的实现、特点以及常见应用场景。 一、树形列表的概念 树形列表,顾名思义,是将数据以树状结构进行展示,每个节点可以有零个或多个子节点,形成一种层次分明的视图。在Android中,...
本压缩包"Android树形选择插件.zip"提供了一个易于理解和使用的解决方案,它允许开发者快速集成一个任意层级的树形下拉菜单。以下是关于这个插件及其应用的详细知识点: 1. **树形控件(TreeView)**:树形控件是一...
在Android开发中,构建多级树形列表是一种常见的需求,比如在展示文件系统、组织结构或者类别分类时。本文将详细讲解如何在Android中实现这种功能。 首先,我们需要理解树形结构的基本概念。树形结构是由节点(Node...
通过以上步骤,我们可以构建出一个灵活、可扩展的Android树形菜单。在实际开发中,可以参考开源库,如`android-treeview`或`android-expandable-recycler-view`,它们提供了现成的解决方案,能快速集成到项目中。...
在Android应用开发中,树形结构的界面设计是一种常见的数据展示方式,特别是在处理层级关系复杂的数据时,如文件系统、组织架构等。本教程将详细讲解如何利用Android技术实现一个支持单选和多选功能的树形结构示例。...
android 树形多选框,真正意义上的 树形多选框,和 web的样式 很类似。 android 树形多选框,真正意义上的 树形多选框,和 web的样式 很类似. 我也整理 了好长时间呢, 体谅我下,谢谢!请 尊重劳动成果,需要有分...
`Demo_zhy_05_tree_view_beta` 可能是一个关于Android树形视图控件(TreeView)的示例代码或教程,这在构建复杂的用户界面时非常有用,特别是当需要显示多层次数据时。TreeView允许用户以层次结构的方式查看数据,...
在Android开发中,树形结构是一种常见的数据组织方式,它以层次化的方式组织元素,就像自然界中的树木一样,有根节点、子节点和可能的孙子节点等。在本篇文章中,我们将深入探讨如何在Android中实现树形结构,并讨论...
通过以上步骤,我们可以构建一个高效的Android树形控件,既能展示无限层级的数据,又能提供良好的用户体验。在实际项目中,可能还需要根据具体需求进行调整和优化,比如加入自定义样式、交互反馈等。文件...
在Android开发中,"android树形选择框"通常指的是使用ExpandableListView来实现的一种界面组件。这个组件可以展示数据以树形结构的方式,允许用户进行多级展开和折叠,同时支持单选和多选功能。在给定的场景中,描述...
在Android开发中,树形控件(Tree View)是一种常用的数据展示组件,它能够以层级结构展示数据,常用于文件系统、目录结构或者组织结构等场景。标题“android无限级树形控件”指的是该控件可以支持任意深度的嵌套,...
本文将深入探讨Android树形文件列表的实现原理、相关API以及如何在实际开发中创建和使用。 1. 文件系统基础: Android基于Linux内核,因此其文件系统遵循POSIX标准,采用的是典型的目录树结构,根目录为"/"。每个...
在Android应用开发中,UI设计是至关重要的,而树形视图(TreeView)是一种常见的数据结构展示方式,尤其适用于层次关系复杂的数据展示。本篇将深入探讨“Android-TreeView”库,一个专为Android设计的高性能、功能...
在Android开发中,"Android树形Demo"是一个典型的用例,它主要展示了如何利用ListView控件来实现一种类似于计算机文件系统的树形结构。ListView是Android UI框架中的一个重要组件,用于展示大量的可滚动列表数据。在...
树形菜单,用来展示有层次结构的数据,像文件管理器,一个文件夹下面有很多文件,文件夹,可能文件夹下面还有文件还有文件夹。我们需要展示这些结构,但是安卓并没有提供一个比较方便的控件来展示,所以就需要我们...
下面将详细讲解Android树形结构列表的实现原理、关键组件以及常见设计模式。 1. **树形数据结构**: 树形结构是一种非线性数据结构,由节点(Node)组成,每个节点可以有零个或多个子节点。在Android中,通常用...
本示例“Android RecyclerView实现多级树形列表”旨在教你如何在RecyclerView中构建一个能够展示层级关系数据的列表。这样的列表常用于展现目录结构、组织架构或者分类信息等。 首先,我们要理解RecyclerView的基本...