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) 

转载于:https://my.oschina.net/u/150685/blog/281841

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值