`
iaiai
  • 浏览: 2204344 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 多层树完美实现

 
阅读更多
效果:


main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="horizontal" android:layout_width="fill_parent"
	android:layout_height="wrap_content">
	<ImageView android:id="@+id/icon" android:layout_width="wrap_content"
		android:layout_height="fill_parent" android:layout_marginRight="6.0dip"
		android:layout_alignParentTop="true" android:layout_alignParentBottom="true" />
	<!--<TextView android:id="@+id/text" android:layout_gravity="center_vertical" 
		android:layout_weight="1.0" android:layout_height="wrap_content" android:layout_width="0dip" 
		android:textAppearance="?android:attr/textAppearanceMedium" android:singleLine="true" 
		android:textColor="#ffffff" /> -->
	<TextView android:textAppearance="?android:textAppearanceMedium"
		android:gravity="center_vertical" android:id="@+id/text"
		android:textColor="#ffffff" android:layout_width="fill_parent"
		android:layout_height="fill_parent" android:singleLine="true"
		android:layout_toRightOf="@id/icon" android:layout_alignParentTop="true"
		android:layout_alignParentBottom="true" />
</RelativeLayout>


TreeElement.java:
package com.iaiai;

import java.util.ArrayList;

/**
 * 
 * <p>
 * Title: TreeElement.java
 * </p>
 * <p>
 * E-Mail: 176291935@qq.com
 * </p>
 * <p>
 * QQ: 176291935
 * </p>
 * <p>
 * Http: iaiai.iteye.com
 * </p>
 * <p>
 * Create time: 2011-8-20
 * </p>
 * 
 * @author 丸子
 * @version 0.0.1
 */
public class TreeElement {

	private String id;
	private String outlineTitle;
	private boolean mhasParent;
	private boolean mhasChild;
	private TreeElement parent;
	private int level;
	private ArrayList<TreeElement> childList = new ArrayList<TreeElement>();

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getOutlineTitle() {
		return outlineTitle;
	}

	public void setOutlineTitle(String outlineTitle) {
		this.outlineTitle = outlineTitle;
	}

	public boolean isMhasParent() {
		return mhasParent;
	}

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

	public boolean isMhasChild() {
		return mhasChild;
	}

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

	public int getLevel() {
		return level;
	}

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

	public boolean isExpanded() {
		return expanded;
	}

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

	public ArrayList<TreeElement> getChildList() {
		return childList;
	}

	public TreeElement getParent() {
		return parent;
	}

	public void setParent(TreeElement parent) {
		this.parent = parent;
	}

	// private OutlineElement outlineElement;
	private boolean expanded;

	public void addChild(TreeElement c) {
		this.childList.add(c);
		this.mhasParent = false;
		this.mhasChild = true;
		c.parent = this;
		c.level = this.level + 1;

	}

	public TreeElement(String id, String title) {
		super();
		this.id = id;
		this.outlineTitle = title;
		this.level = 0;
		this.mhasParent = true;
		this.mhasChild = false;
		this.parent = null;
	}

	public TreeElement(String id, String outlineTitle, boolean mhasParent,
			boolean mhasChild, TreeElement parent, int level, boolean expanded) {
		super();
		this.id = id;
		this.outlineTitle = outlineTitle;
		this.mhasParent = mhasParent;
		this.mhasChild = mhasChild;
		this.parent = parent;
		if (parent != null) {
			this.parent.getChildList().add(this);
		}
		this.level = level;
		this.expanded = expanded;
	}

}


TreeView.java:
package com.iaiai;

import java.util.ArrayList;
import java.util.List;

import android.app.ListActivity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

/**
 * 
 * <p>
 * Title: TreeView.java
 * </p>
 * <p>
 * E-Mail: 176291935@qq.com
 * </p>
 * <p>
 * QQ: 176291935
 * </p>
 * <p>
 * Http: iaiai.iteye.com
 * </p>
 * <p>
 * Create time: 2011-8-20
 * </p>
 * 
 * @author 丸子
 * @version 0.0.1
 */
public class TreeView extends ListActivity {
	private ArrayList<TreeElement> mPdfOutlinesCount = new ArrayList<TreeElement>();
	private TreeViewAdapter treeViewAdapter = null;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		initialData();
		treeViewAdapter = new TreeViewAdapter(this, R.layout.main,
				mPdfOutlinesCount);
		setListAdapter(treeViewAdapter);
		registerForContextMenu(getListView());
	}

	private void initialData() {
		TreeElement element1 = new TreeElement("01", "关键类");
		TreeElement element2 = new TreeElement("02", "应用程序组件");
		TreeElement element3 = new TreeElement("03", "Activity和任务");
		TreeElement element4 = new TreeElement("04", "激活组件:intent");
		TreeElement element5 = new TreeElement("05", "关闭组件");
		TreeElement element6 = new TreeElement("06", "manifest文件");
		TreeElement element7 = new TreeElement("07", "Intent过滤器");
		TreeElement element8 = new TreeElement("08", "Affinity(吸引力)和新任务");
		TreeElement element9 = new TreeElement("09", "加载模式");
		TreeElement element10 = new TreeElement("10", "加载模式孩子1");
		TreeElement element11 = new TreeElement("11", "加载模式孩子2");
		TreeElement element12 = new TreeElement("12", "加载模式孩子2的孩子1");
		TreeElement element13 = new TreeElement("13", "加载模式孩子2的孩子2");
		TreeElement element14 = new TreeElement("14", "加载模式孩子1的孩子1");
		TreeElement element15 = new TreeElement("15", "加载模式孩子1的孩子2");
		TreeElement element16 = new TreeElement("16", "加载模式孩子1的孩子3");
		TreeElement element17 = new TreeElement("17", "加载模式孩子1的孩子4");
		TreeElement element18 = new TreeElement("18", "加载模式孩子1的孩子5");
		TreeElement element19 = new TreeElement("19", "加载模式孩子1的孩子6");

		mPdfOutlinesCount.add(element1);
		mPdfOutlinesCount.add(element2);
		mPdfOutlinesCount.add(element9);
		element2.addChild(element3);
		element1.addChild(element4);
		element1.addChild(element5);
		element1.addChild(element6);
		element1.addChild(element7);
		element7.addChild(element8);
		element9.addChild(element10);
		element9.addChild(element11);
		element11.addChild(element12);
		element11.addChild(element13);
		element10.addChild(element14);
		element10.addChild(element15);
		element10.addChild(element16);
		element10.addChild(element17);
		element10.addChild(element18);
		element10.addChild(element19);

	}

	@SuppressWarnings("unchecked")
	private class TreeViewAdapter extends ArrayAdapter {
		public TreeViewAdapter(Context context, int textViewResourceId,
				List objects) {
			super(context, textViewResourceId, objects);
			mInflater = LayoutInflater.from(context);
			mfilelist = objects;
			mIconCollapse = BitmapFactory.decodeResource(
					context.getResources(), R.drawable.outline_list_collapse);
			mIconExpand = BitmapFactory.decodeResource(context.getResources(),
					R.drawable.outline_list_expand);
		}

		private LayoutInflater mInflater;
		private List<TreeElement> mfilelist;
		private Bitmap mIconCollapse;
		private Bitmap mIconExpand;

		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.main, null);
			holder = new ViewHolder();
			holder.text = (TextView) convertView.findViewById(R.id.text);
			holder.icon = (ImageView) convertView.findViewById(R.id.icon);
			convertView.setTag(holder);
			/*
			 * } else { holder = (ViewHolder) convertView.getTag(); }
			 */

			final TreeElement obj = mfilelist.get(position);

			holder.text.setOnClickListener(new View.OnClickListener() {

				@Override
				public void onClick(View v) {
					Log.i("TreeView", "obj.id:" + obj.getId());
				}
			});

			int level = obj.getLevel();
			holder.icon.setPadding(25 * (level + 1),
					holder.icon.getPaddingTop(), 0,
					holder.icon.getPaddingBottom());
			holder.text.setText(obj.getOutlineTitle());
			if (obj.isMhasChild() && (obj.isExpanded() == false)) {
				holder.icon.setImageBitmap(mIconCollapse);
			} else if (obj.isMhasChild() && (obj.isExpanded() == true)) {
				holder.icon.setImageBitmap(mIconExpand);
			} else if (!obj.isMhasChild()) {
				holder.icon.setImageBitmap(mIconCollapse);
				holder.icon.setVisibility(View.INVISIBLE);
			}
			return convertView;
		}

		class ViewHolder {
			TextView text;
			ImageView icon;

		}
	}

	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		super.onListItemClick(l, v, position, id);
		Log.i("TreeView", "position:" + position);
		if (!mPdfOutlinesCount.get(position).isMhasChild()) {
			Toast.makeText(this, mPdfOutlinesCount.get(position)
					.getOutlineTitle(), 2000);
			/*
			 * int pageNumber; Intent i = getIntent(); element element =
			 * mPdfOutlinesCount .get(position); pageNumber =
			 * element.getOutlineElement().pageNumber; if (pageNumber <= 0) {
			 * String name = element.getOutlineElement().destName; pageNumber =
			 * idocviewer.getPageNumberForNameForOutline(name);
			 * element.getOutlineElement().pageNumber = pageNumber;
			 * element.getOutlineElement().destName = null; }
			 * i.putExtra("PageNumber", pageNumber); setResult(RESULT_OK, i);
			 * finish();
			 */

			return;
		}

		if (mPdfOutlinesCount.get(position).isExpanded()) {
			mPdfOutlinesCount.get(position).setExpanded(false);
			TreeElement element = mPdfOutlinesCount.get(position);
			ArrayList<TreeElement> temp = new ArrayList<TreeElement>();

			for (int i = position + 1; i < mPdfOutlinesCount.size(); i++) {
				if (element.getLevel() >= mPdfOutlinesCount.get(i).getLevel()) {
					break;
				}
				temp.add(mPdfOutlinesCount.get(i));
			}

			mPdfOutlinesCount.removeAll(temp);

			treeViewAdapter.notifyDataSetChanged();
			/*
			 * fileExploreAdapter = new TreeViewAdapter(this, R.layout.outline,
			 * mPdfOutlinesCount);
			 */

			// setListAdapter(fileExploreAdapter);

		} else {
			TreeElement obj = mPdfOutlinesCount.get(position);
			obj.setExpanded(true);
			int level = obj.getLevel();
			int nextLevel = level + 1;

			for (TreeElement element : obj.getChildList()) {
				element.setLevel(nextLevel);
				element.setExpanded(false);
				mPdfOutlinesCount.add(position + 1, element);

			}
			treeViewAdapter.notifyDataSetChanged();
			/*
			 * fileExploreAdapter = new TreeViewAdapter(this, R.layout.outline,
			 * mPdfOutlinesCount);
			 */

			// setListAdapter(fileExploreAdapter);
		}
	}

}


下面是用到的两张图片:

  • 大小: 46.3 KB
  • 大小: 1.5 KB
  • 大小: 1.4 KB
分享到:
评论

相关推荐

    仿qq多层树完美实现

    "仿qq多层树完美实现"这个项目就是针对这一需求进行的实践,它通过ExpandableListView控件来创建一个类似QQ下拉菜单的交互体验。 首先,我们要理解什么是ExpandableListView。在Android开发中,ExpandableListView...

    Android ExpandableListView双层嵌套实现三级树形菜单

    在这个"Android ExpandableListView双层嵌套实现三级树形菜单"的例子中,我们将深入探讨如何通过扩展这个控件来创建一个包含三层结构的树形菜单。 首先,我们要理解ExpandableListView的基本工作原理。...

    androidrecyclerView多层级无限层级列表折叠树

    在本教程中,我们将探讨如何利用RecyclerView实现一个多层级、无限层级的列表折叠树效果。 首先,我们需要理解RecyclerView的基本工作原理。RecyclerView通过Adapter与数据集进行绑定,Adapter负责将数据项转化为...

    android实现两层tab嵌套

    3. `TabLayout`配合`PagerAdapter`:`TabLayout`是Android Design Support Library的一部分,用于展示Tab,与`ViewPager`结合可以实现Tab的可视化切换效果。`PagerAdapter`是`ViewPager`的数据适配器,负责为每个Tab...

    vue+elementui实现多层树形菜单

    在本文中,我们将深入探讨如何使用Vue.js框架与Element UI库来实现多层树形菜单。Vue.js是一个轻量级的前端JavaScript框架,以其简洁的API和强大的功能深受开发者喜爱。而Element UI则是一个基于Vue.js的企业级UI...

    android一个recyclerView实现无限层级多层级列表折叠树(csdn)————程序.pdf

    在处理具有无限层级和多层级折叠树结构的数据时,直接使用嵌套的RecyclerView会导致性能问题,因为每次嵌套都会增加渲染复杂度。本文将介绍如何仅使用一个RecyclerView实现无限层级的折叠树列表。 首先,我们需要...

    安卓仿QQ树形

    在Android开发中,构建一个类似QQ好友菜单的多层树形结构是一项常见的需求。这种结构通常用于展现层次分明的数据,例如组织架构、文件系统或菜单导航等。在本篇文章中,我们将深入探讨如何在Android中实现这样的功能...

    android多层级树形菜单

    3. **数据结构与适配器**: 在实现树形菜单时,我们需要一个合适的数据结构来存储菜单及其子菜单。通常,我们可以使用递归的数据模型,如TreeNode类,每个节点包含自身的数据以及对子节点的引用。Adapter将根据这个...

    Android多层抽屉菜单(MultiCardMenu)

    实现多层抽屉效果可能涉及对Android的布局管理器如LinearLayout、RelativeLayout或RecyclerView的使用。特别是RecyclerView,它常用于创建可滚动的列表,适用于展示大量数据或层级结构。 7. **触摸事件处理**: ...

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

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

    android-多级树形选择列表demo

    在Android中,我们可以使用`ExpandableListView`或自定义控件来实现树形结构。在这个案例中,我们将采用自定义控件的方式,因为这提供了更多的灵活性和定制化选项。 1. **创建自定义View** - 创建一个自定义的`...

    Android使用Kotlin利用Gson解析多层嵌套Json数据

    Android使用Kotlin利用Gson解析多层嵌套Json数据

    Android Oracle数据库使用手册源码,使用技术多层树,Fragmnet,左右滑动,焦点解决

    在Android中,我们可以使用ExpandableListView或者自定义ViewGroup实现树形结构。每个节点可以包含子节点,通过递归遍历数据结构,动态生成对应的视图层次。这在处理分层级的数据,如组织架构、菜单系统时非常实用。...

    Android-复杂界面实现RecyclerView嵌套ViewPagerRecyclerView多布局实现

    在`RecyclerViewApplication-master`这个项目中,你可以找到相关的代码实现和示例,通过学习和研究,可以加深对Android复杂界面实现的理解,提升你的开发技能。记得在实际项目中根据需求进行调整,保持代码的简洁性...

    android实现三级联动菜单

    本示例主要讲解如何使用Android原生组件和一些设计模式来实现这样的功能。 首先,我们要理解"联动菜单"的概念。联动菜单是指在一个菜单的选择项被选中时,会影响并展示与其相关的下一级菜单。在Android中,我们可以...

    android 全局悬浮按钮实现key事件

    在Android开发中,全局悬浮按钮(通常称为Float Button或Floating Action Button, FAB)是一种设计模式,用于提供主要的操作或快捷方式。...开发者需要理解Android的多层架构和权限管理,以便正确地实施这样的功能。

    OpenGL的实现多层显示

    在本项目中,“OpenGL的实现多层显示”指的是使用OpenGL和MFC结合,来实现一个具有多层或者多层次显示效果的应用程序。 首先,我们需要理解OpenGL的基础概念。OpenGL是一个跨语言、跨平台的编程接口,它允许程序员...

    Android多级菜单的简单实现

    "Android多级菜单的简单实现"这个主题主要关注如何构建类似于京东分类界面的多层导航结构。这样的菜单通常包含主菜单、子菜单以及可能的孙子菜单,允许用户逐级深入探索内容。 首先,我们需要理解Android菜单的基本...

    Android 分层级筛选控件

    在Android开发中,为了提供用户友好的交互体验,开发者经常需要实现各种自定义控件以满足特定需求。"Android分层级筛选控件"是一个这样的自定义控件,它旨在模仿大众点评应用中的筛选功能,允许用户按照不同层级的...

    javascript,jquery 多层树形菜单

    在多层树形菜单的实现中,我们通常会用到以下核心概念和技术: 1. **HTML结构**:菜单的基础是HTML结构,通常使用`&lt;ul&gt;`和`&lt;li&gt;`标签来表示层次关系。每一级菜单项可以是`&lt;li&gt;`,而子菜单则作为`&lt;ul&gt;`嵌套在其中。 ...

Global site tag (gtag.js) - Google Analytics