`
djun100
  • 浏览: 165446 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

listview实现的tree树结构

 
阅读更多

转自:http://www.eoeandroid.com/thread-309141-1-1.html 会更新版本

代码分享
代码名称: myTreeViewDemo
代码描述: 使用listView实现的树状结构
代码托管地址: -
代码作者: 阿富

效果图:





写在前面:
首先说明一下,这个只是最基本的树状组织结构的展现,我自己ps的连接线o(∩_∩)o ,至于实际使用中,可以对+、-号以及节点图标和文本加入点击事件;也可以在节点前加入checkbox等。
在做这个之前,网上也找了很久,找到的比较多的就是这个例子:http://www.apkbus.com/android-83520-1-1.html,但是这个不好看,所以基于这个才有了本例子。o(∩_∩)o 哈哈,第一次发自己写的东西,写的不好的地方请见谅(希望有人对性能优化,本人不是做安卓开发的,工作之余自学这个);上代码:

TreeElement.java
  1. package com.ccl.util.tree;

  2. import java.util.ArrayList;
  3. import java.util.List;

  4. import android.view.View.OnClickListener;

  5. public class TreeElement {
  6. private int img_tree_space_n = R.drawable.tree_space_n;
  7. private int img_tree_space_y = R.drawable.tree_space_y;

  8. private String id;// 节点id
  9. private String caption;// 节点标题
  10. private String value;// 节点的值
  11. private int level;// 层级
  12. private TreeElement parent;// 该节点的父节点
  13. private boolean isHasChild;// 是否有子节点
  14. private boolean isExpanded;// 是否处于展开
  15. private ArrayList<TreeElement> childList;// 子节点数组
  16. private boolean isLastSibling;// 是否是同级节点的最后一个
  17. private ArrayList<Integer> spaceList;// 组织结构线条数组
  18. private int position;// 在listview中所处的位置
  19. private OnClickListener captionOnClickListener;// 节点文本点击事件

  20. public TreeElement() {
  21. super();
  22. }

  23. public TreeElement(String id, String caption, String value,
  24. Boolean isHasChild, OnClickListener captionOnClickListener) {
  25. this.id = id;
  26. this.caption = caption;
  27. this.value = value;
  28. this.parent = null;
  29. this.level = 0;
  30. this.isHasChild = isHasChild;
  31. this.isExpanded = false;
  32. if (isHasChild) {
  33. this.childList = new ArrayList<TreeElement>();
  34. }
  35. this.isLastSibling = false;
  36. this.setSpaceList(new ArrayList<Integer>());
  37. this.position = 0;
  38. this.setCaptionOnClickListener(captionOnClickListener);
  39. }

  40. // 添加子节点
  41. public void addChild(TreeElement treeElement) {
  42. treeElement.parent = this;
  43. if (treeElement.getParent() != null
  44. && treeElement.getParent().getChildList().size() > 0) {// 将之前的同级节点的置为非最后一个节点
  45. List<TreeElement> siblingList = treeElement.getParent()
  46. .getChildList();
  47. treeElement.getParent().getChildList().get(siblingList.size() - 1)
  48. .setLastSibling(false);
  49. }
  50. this.childList.add(treeElement);
  51. this.isHasChild = true;
  52. treeElement.level = this.level + 1;
  53. treeElement.isLastSibling = true;
  54. if (this.level > 0) {
  55. treeElement.getSpaceList().addAll(this.getSpaceList());
  56. if (this.isLastSibling()) {
  57. treeElement.getSpaceList().add(img_tree_space_n);
  58. } else {
  59. treeElement.getSpaceList().add(img_tree_space_y);
  60. }
  61. }
  62. }

  63. public String getId() {
  64. return id;
  65. }

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

  69. public String getCaption() {
  70. return caption;
  71. }

  72. public void setCaption(String caption) {
  73. this.caption = caption;
  74. }

  75. public String getValue() {
  76. return value;
  77. }

  78. public void setValue(String value) {
  79. this.value = value;
  80. }

  81. public TreeElement getParent() {
  82. return parent;
  83. }

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

  87. public boolean isHasChild() {
  88. return isHasChild;
  89. }

  90. public void setHasChild(boolean isHasChild) {
  91. this.isHasChild = isHasChild;
  92. }

  93. public boolean isExpanded() {
  94. return isExpanded;
  95. }

  96. public void setExpanded(boolean isExpanded) {
  97. this.isExpanded = isExpanded;
  98. }

  99. public ArrayList<TreeElement> getChildList() {
  100. return childList;
  101. }

  102. public void setChildList(ArrayList<TreeElement> childList) {
  103. this.childList = childList;
  104. }

  105. public int getLevel() {
  106. return level;
  107. }

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

  111. public boolean isLastSibling() {
  112. return isLastSibling;
  113. }

  114. public void setLastSibling(boolean isLastSibling) {
  115. this.isLastSibling = isLastSibling;
  116. }

  117. public ArrayList<Integer> getSpaceList() {
  118. return spaceList;
  119. }

  120. public void setSpaceList(ArrayList<Integer> spaceList) {
  121. this.spaceList = spaceList;
  122. }

  123. public int getPosition() {
  124. return position;
  125. }

  126. public void setPosition(int position) {
  127. this.position = position;
  128. }

  129. public OnClickListener getCaptionOnClickListener() {
  130. return captionOnClickListener;
  131. }

  132. public void setCaptionOnClickListener(OnClickListener captionOnClickListener) {
  133. this.captionOnClickListener = captionOnClickListener;
  134. }

  135. }
复制代码
TreeViewAdapter.java
  1. package com.ccl.util.tree;

  2. import java.util.ArrayList;
  3. import android.content.Context;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.view.ViewGroup;
  8. import android.widget.ArrayAdapter;
  9. import android.widget.ImageView;
  10. import android.widget.LinearLayout;
  11. import android.widget.TextView;
  12. import android.widget.Toast;

  13. public class TreeViewAdapter extends ArrayAdapter<TreeElement> {
  14. private int img_leaf = R.drawable.icon_user;// 没有子节点的节点图标
  15. private int img_expand = R.drawable.outline_list_expand;// 展开的图标
  16. private int img_collapse = R.drawable.outline_list_collapse;// 收缩的图标
  17. private int img_tree_space_1 = R.drawable.tree_space_1;// 连接线
  18. private int img_tree_space_2 = R.drawable.tree_space_2;

  19. private Context context;
  20. private LayoutInflater mInflater;
  21. private ArrayList<TreeElement> treeElementList;
  22. private int viewResourceId;

  23. public TreeViewAdapter(Context context, int viewResourceId,
  24. ArrayList<TreeElement> objects) {
  25. super(context, viewResourceId, objects);
  26. this.context = context;
  27. this.mInflater = LayoutInflater.from(context);
  28. this.treeElementList = objects;
  29. this.viewResourceId = viewResourceId;
  30. }

  31. @Override
  32. public View getView(int position, View convertView, ViewGroup parent) {
  33. ViewHolder holder;
  34. convertView = mInflater.inflate(viewResourceId, null);
  35. holder = new ViewHolder();
  36. holder.caption = (TextView) convertView.findViewById(R.id.caption);
  37. holder.icon = (ImageView) convertView.findViewById(R.id.icon);
  38. holder.space = (LinearLayout) convertView.findViewById(R.id.space);
  39. convertView.setTag(holder);
  40. TreeElement treeElement = treeElementList.get(position);

  41. int level = treeElement.getLevel();
  42. if (level == 0) {// 根节点

  43. } else {
  44. ArrayList<Integer> spaceList = treeElement.getSpaceList();

  45. // 绘制前面的组织架构线条
  46. for (int i = 0; i < spaceList.size(); i++) {
  47. ImageView img = new ImageView(context);
  48. img.setImageResource(spaceList.get(i));
  49. holder.space.addView(img);
  50. }
  51. ImageView img = new ImageView(context);
  52. // 节点图标
  53. if (treeElement.isLastSibling()) {
  54. img.setImageResource(img_tree_space_2);
  55. } else {
  56. img.setImageResource(img_tree_space_1);
  57. }

  58. holder.space.addView(img);
  59. }
  60. if (treeElement.isHasChild()) {
  61. if (treeElement.isExpanded()) {
  62. holder.icon.setImageResource(img_expand);
  63. } else {
  64. holder.icon.setImageResource(img_collapse);
  65. }
  66. holder.icon.setOnClickListener(new TreeElementIconClickListener(
  67. context, treeElementList, this, treeElement.getPosition()));
  68. } else {
  69. holder.icon.setImageResource(img_leaf);
  70. }
  71. holder.caption.setText(treeElement.getCaption());// 设置标题
  72. if (treeElement.getCaptionOnClickListener() != null) {// 设置文字的点击事件
  73. holder.caption.setTag(treeElement.getValue());
  74. holder.caption.setOnClickListener(treeElement
  75. .getCaptionOnClickListener());

  76. }
  77. return convertView;
  78. }

  79. class ViewHolder {
  80. LinearLayout space;
  81. TextView caption;
  82. ImageView icon;
  83. }

  84. public static class TreeElementIconClickListener implements OnClickListener {
  85. private Context context;
  86. private ArrayList<TreeElement> treeElementList;
  87. private TreeViewAdapter treeViewAdapter;
  88. private int position;

  89. public TreeElementIconClickListener(Context mContext,
  90. ArrayList<TreeElement> mTreeElementList,
  91. TreeViewAdapter mTreeViewAdapter, int position) {
  92. this.context = mContext;
  93. this.treeElementList = mTreeElementList;
  94. this.treeViewAdapter = mTreeViewAdapter;
  95. this.position = position;
  96. }

  97. @Override
  98. public void onClick(View v) {
  99. System.out.println("点击的position:" + position);
  100. if (!treeElementList.get(position).isHasChild()) {
  101. Toast.makeText(context,
  102. treeElementList.get(position).getCaption(),
  103. Toast.LENGTH_SHORT).show();
  104. return;
  105. }

  106. if (treeElementList.get(position).isExpanded()) {
  107. treeElementList.get(position).setExpanded(false);
  108. TreeElement element = treeElementList.get(position);
  109. ArrayList<TreeElement> temp = new ArrayList<TreeElement>();

  110. for (int i = position + 1; i < treeElementList.size(); i++) {
  111. if (element.getLevel() >= treeElementList.get(i).getLevel()) {
  112. break;
  113. }
  114. temp.add(treeElementList.get(i));
  115. }

  116. treeElementList.removeAll(temp);
  117. for (int i = position + 1; i < treeElementList.size(); i++) {
  118. System.out.println(treeElementList.get(i).getCaption()
  119. + "@@@" + i);
  120. treeElementList.get(i).setPosition(i);
  121. }

  122. treeViewAdapter.notifyDataSetChanged();
  123. } else {
  124. TreeElement obj = treeElementList.get(position);
  125. obj.setExpanded(true);
  126. int level = obj.getLevel();
  127. int nextLevel = level + 1;

  128. ArrayList<TreeElement> tempList = obj.getChildList();

  129. for (int i = 0; i < tempList.size(); i++) {
  130. TreeElement element = tempList.get(i);
  131. element.setLevel(nextLevel);
  132. element.setExpanded(false);
  133. treeElementList.add(position + i + 1, element);
  134. }
  135. for (int i = position + 1; i < treeElementList.size(); i++) {
  136. System.out.println(treeElementList.get(i).getCaption()
  137. + "@@@" + i);
  138. treeElementList.get(i).setPosition(i);
  139. }
  140. treeViewAdapter.notifyDataSetChanged();
  141. }

  142. }
  143. }
  144. }
复制代码
MainActivity.java
  1. package com.ccl.util.tree;

  2. import java.util.ArrayList;

  3. import com.ccl.util.tree.TreeViewAdapter.TreeElementIconClickListener;

  4. import android.os.Bundle;
  5. import android.app.Activity;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.widget.ListView;
  9. import android.widget.Toast;

  10. public class MainActivity extends Activity {
  11. private ListView lv_tree;
  12. private TreeViewAdapter treeViewAdapter;
  13. private ArrayList<TreeElement> mRootList;

  14. @Override
  15. protected void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.activity_main);
  18. lv_tree = (ListView) findViewById(R.id.lv_tree);
  19. mRootList = new ArrayList<TreeElement>();
  20. treeViewAdapter = new TreeViewAdapter(this, R.layout.atom_tree,
  21. mRootList);
  22. lv_tree.setAdapter(treeViewAdapter);

  23. OnClickListener myOnClickListener = new OnClickListener() {
  24. @Override
  25. public void onClick(View v) {
  26. Toast.makeText(MainActivity.this, "--" + v.getTag(),
  27. Toast.LENGTH_LONG).show();
  28. }
  29. };

  30. TreeElement rootElement = new TreeElement("root", "root", "1", true,
  31. null);

  32. TreeElement treeElement1 = new TreeElement("node1", "节点1", "1", true,
  33. null);
  34. TreeElement treeElement2 = new TreeElement("node2", "节点2", "2", false,
  35. myOnClickListener);
  36. TreeElement treeElement3 = new TreeElement("node3", "节点3", "1", false,
  37. myOnClickListener);
  38. TreeElement treeElement4 = new TreeElement("node3", "节点4", "1", true,
  39. myOnClickListener);

  40. TreeElement treeElement1_1 = new TreeElement("node14", "节点1_1", "1",
  41. true, myOnClickListener);
  42. TreeElement treeElement1_2 = new TreeElement("node14", "节点1_2", "1",
  43. false, myOnClickListener);
  44. TreeElement treeElement1_3 = new TreeElement("node14", "节点1_3", "1",
  45. true, myOnClickListener);
  46. TreeElement treeElement1_1_1 = new TreeElement("node14", "节点1_1_1",
  47. "1", false, myOnClickListener);
  48. TreeElement treeElement1_3_1 = new TreeElement("node14", "节点1_3_1",
  49. "1", true, myOnClickListener);
  50. TreeElement treeElement1_3_2 = new TreeElement("node14", "节点1_3_2",
  51. "1", false, myOnClickListener);
  52. TreeElement treeElement1_3_1_1 = new TreeElement("node14", "节点1_3_1_1",
  53. "1", false, myOnClickListener);

  54. TreeElement treeElement4_1 = new TreeElement("node14", "节点4_1", "1",
  55. true, myOnClickListener);
  56. TreeElement treeElement4_2 = new TreeElement("node14", "节点4_2", "1",
  57. false, myOnClickListener);
  58. TreeElement treeElement4_3 = new TreeElement("node14", "节点4_3", "1",
  59. true, myOnClickListener);
  60. TreeElement treeElement4_1_1 = new TreeElement("node14", "节点4_1_1",
  61. "1", false, myOnClickListener);
  62. TreeElement treeElement4_3_1 = new TreeElement("node14", "节点4_3_1",
  63. "1", false, myOnClickListener);
  64. mRootList.add(rootElement);
  65. rootElement.addChild(treeElement1);
  66. rootElement.addChild(treeElement2);
  67. rootElement.addChild(treeElement3);
  68. rootElement.addChild(treeElement4);
  69. treeElement1.addChild(treeElement1_1);
  70. treeElement1.addChild(treeElement1_2);
  71. treeElement1.addChild(treeElement1_3);
  72. treeElement1_1.addChild(treeElement1_1_1);
  73. treeElement1_3.addChild(treeElement1_3_1);
  74. treeElement1_3.addChild(treeElement1_3_2);
  75. treeElement1_3_1.addChild(treeElement1_3_1_1);
  76. treeElement4.addChild(treeElement4_1);
  77. treeElement4.addChild(treeElement4_2);
  78. treeElement4.addChild(treeElement4_3);
  79. treeElement4_1.addChild(treeElement4_1_1);
  80. treeElement4_3.addChild(treeElement4_3_1);

  81. treeViewAdapter.notifyDataSetChanged();
  82. System.out.println(1111);

  83. // 展开根目录
  84. TreeElementIconClickListener mtest = new TreeElementIconClickListener(
  85. MainActivity.this, mRootList, treeViewAdapter, 0);
  86. mtest.onClick(null);

  87. }
  88. }
复制代码
最新代码(不定期修改):tree201310231140.zip(788.67 KB, 下载次数: 176)

分享到:
评论

相关推荐

    listview实现树结构

    listview实现的tree树结构 ui美观 高端大气上档次,完美实现结构树,【最好使用真机测试,不然可能会报错】。唯一不足之处在于展开状态的控制,跟节点设置展开后只是图标变了,子节 点都没有出现。

    Android应用源码ListView实现的目录树结构tree

    Android应用源码ListView实现的目录树结构

    Android 自定义ListView和RecycleView实现多级树功能

    自定义ListView和RecycleView实现多级树功能 实现类似qq分组列表

    用listview实现树形tree节点结构

    效果采用了我们安卓中的listview来实现树形tree节点结构布局的,该结构可以分成几部分的,节点一,或分其他的节点等,该布局经常使用在我们的一个流量某些文件时等。

    tree和listview资源管理器

    主要功能:实现了仿windows资源管理器功能,通过txt文件生成左侧树结构,点击树节点右侧listview显示节点目录下的所有文件。 由于数据较多所以采用分段加载节点,也就是在需要展开节点时加载该节点下的节点。

    android 用LIstVew实现树形结构菜单

    我们知道C++中树控制(CTreeCtrl)主要用来显示具有一定层次结构的数据项,如资源管理器中的磁盘目录等,以供用户在其中进行各种选择。Android 本身没有这个CTreeCtrl控件,但可以用ListView模拟出同样的效果

    多级树结构

    企业级的通讯录做成多级树结构,用户打开通讯录模块,只会把一级目录结构请求下来,当用户需要查找人时,点击对应的部门item,就会请求对应部门下的列表,这样在极大程度上减少了用户的流量消耗和等待时间。

    Android 实现自定义多级树控件和全选与反选的效果

    对于多级树的显示其实就是通过数据中各个节点的关系,通过不同的缩进来达到树的效果。而数据中主要要把握id,父节点pId,name的关系,来显示其效果。实例详细的实现的多级树和全选与反选的过程

    SuperGrid-MFC_ListCtrl控件扩展(让ListCtrl控件具有树状列表)

    SuperGrid-MFC_ListCtrl控件扩展,让ListCtrl控件具有树状列表,让ListCtrl控件的每一行都是一个树结构。

    jh-weapp-demo:一个weapp演示

    jh-weapp-demo 小程序 实现的一些效果 ...树结构数据展示 侧滑筛选 custom-tabbar(动态设置、不闪屏) wx.request 封装,云函数请求封装 封装一些组件(在JhComponents文件夹)和工具类(在utils文件夹)

    Ext Js权威指南(.zip.001

    7.5.11 树节点:ext.data.nodeinterface与ext.data.tree / 364 7.5.12 store的方法 / 366 7.5.13 store的事件 / 368 7.5.14 store管理器:ext.data.storemanager / 369 7.6 综合实例 / 369 7.6.1 远程读取json...

    asp.net知识库

    根据基本表结构及其数据生成 INSERT ... 的 SQL 简便的MS SQL 数据库 表内容 脚本 生成器 将表数据生成SQL脚本的存储过程 直接从SQL语句问题贴子数据建表并生成建表语句的存储过程 从SQL中的一个表中导出HTML文件...

    Visual C++2010开发权威指南(共三部分).part1.rar

    5.8 Visual C++ 2010 Tree控件简介与开发 220 5.8.1 树控件样式 221 5.8.2 树控件父项和子项 221 5.8.3 树控件项位置 222 5.8.4 树控件项标签 222 5.8.5 树控件标签编辑 223 5.8.6 树控件项的状态 223 5.8.7 树控件...

    VC++2010权威开发指南+源代码

     5.8 Visual C++ 2010 Tree控件简介与开发 220  5.8.1 树控件样式 221  5.8.2 树控件父项和子项 221  5.8.3 树控件项位置 222  5.8.4 树控件项标签 222  5.8.5 树控件标签编辑 223  5.8.6 树控件项的状态 223...

    VC++2010权威开发指南+源代码.part2

     5.8 Visual C++ 2010 Tree控件简介与开发 220  5.8.1 树控件样式 221  5.8.2 树控件父项和子项 221  5.8.3 树控件项位置 222  5.8.4 树控件项标签 222  5.8.5 树控件标签编辑 223  5.8.6 树控件项的状态 223...

Global site tag (gtag.js) - Google Analytics