转自: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
- package com.ccl.util.tree;
-
- import java.util.ArrayList;
- import java.util.List;
-
- import android.view.View.OnClickListener;
-
- public class TreeElement {
- private int img_tree_space_n = R.drawable.tree_space_n;
- private int img_tree_space_y = R.drawable.tree_space_y;
-
- private String id;// 节点id
- private String caption;// 节点标题
- private String value;// 节点的值
- private int level;// 层级
- private TreeElement parent;// 该节点的父节点
- private boolean isHasChild;// 是否有子节点
- private boolean isExpanded;// 是否处于展开
- private ArrayList<TreeElement> childList;// 子节点数组
- private boolean isLastSibling;// 是否是同级节点的最后一个
- private ArrayList<Integer> spaceList;// 组织结构线条数组
- private int position;// 在listview中所处的位置
- private OnClickListener captionOnClickListener;// 节点文本点击事件
-
- public TreeElement() {
- super();
- }
-
- public TreeElement(String id, String caption, String value,
- Boolean isHasChild, OnClickListener captionOnClickListener) {
- this.id = id;
- this.caption = caption;
- this.value = value;
- this.parent = null;
- this.level = 0;
- this.isHasChild = isHasChild;
- this.isExpanded = false;
- if (isHasChild) {
- this.childList = new ArrayList<TreeElement>();
- }
- this.isLastSibling = false;
- this.setSpaceList(new ArrayList<Integer>());
- this.position = 0;
- this.setCaptionOnClickListener(captionOnClickListener);
- }
-
- // 添加子节点
- public void addChild(TreeElement treeElement) {
- treeElement.parent = this;
- if (treeElement.getParent() != null
- && treeElement.getParent().getChildList().size() > 0) {// 将之前的同级节点的置为非最后一个节点
- List<TreeElement> siblingList = treeElement.getParent()
- .getChildList();
- treeElement.getParent().getChildList().get(siblingList.size() - 1)
- .setLastSibling(false);
- }
- this.childList.add(treeElement);
- this.isHasChild = true;
- treeElement.level = this.level + 1;
- treeElement.isLastSibling = true;
- if (this.level > 0) {
- treeElement.getSpaceList().addAll(this.getSpaceList());
- if (this.isLastSibling()) {
- treeElement.getSpaceList().add(img_tree_space_n);
- } else {
- treeElement.getSpaceList().add(img_tree_space_y);
- }
- }
- }
-
- public String getId() {
- return id;
- }
-
- public void setId(String id) {
- this.id = id;
- }
-
- public String getCaption() {
- return caption;
- }
-
- public void setCaption(String caption) {
- this.caption = caption;
- }
-
- public String getValue() {
- return value;
- }
-
- public void setValue(String value) {
- this.value = value;
- }
-
- public TreeElement getParent() {
- return parent;
- }
-
- public void setParent(TreeElement parent) {
- this.parent = parent;
- }
-
- public boolean isHasChild() {
- return isHasChild;
- }
-
- public void setHasChild(boolean isHasChild) {
- this.isHasChild = isHasChild;
- }
-
- public boolean isExpanded() {
- return isExpanded;
- }
-
- public void setExpanded(boolean isExpanded) {
- this.isExpanded = isExpanded;
- }
-
- public ArrayList<TreeElement> getChildList() {
- return childList;
- }
-
- public void setChildList(ArrayList<TreeElement> childList) {
- this.childList = childList;
- }
-
- public int getLevel() {
- return level;
- }
-
- public void setLevel(int level) {
- this.level = level;
- }
-
- public boolean isLastSibling() {
- return isLastSibling;
- }
-
- public void setLastSibling(boolean isLastSibling) {
- this.isLastSibling = isLastSibling;
- }
-
- public ArrayList<Integer> getSpaceList() {
- return spaceList;
- }
-
- public void setSpaceList(ArrayList<Integer> spaceList) {
- this.spaceList = spaceList;
- }
-
- public int getPosition() {
- return position;
- }
-
- public void setPosition(int position) {
- this.position = position;
- }
-
- public OnClickListener getCaptionOnClickListener() {
- return captionOnClickListener;
- }
-
- public void setCaptionOnClickListener(OnClickListener captionOnClickListener) {
- this.captionOnClickListener = captionOnClickListener;
- }
-
- }
- package com.ccl.util.tree;
-
- import java.util.ArrayList;
- import android.content.Context;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.ViewGroup;
- import android.widget.ArrayAdapter;
- import android.widget.ImageView;
- import android.widget.LinearLayout;
- import android.widget.TextView;
- import android.widget.Toast;
-
- public class TreeViewAdapter extends ArrayAdapter<TreeElement> {
- private int img_leaf = R.drawable.icon_user;// 没有子节点的节点图标
- private int img_expand = R.drawable.outline_list_expand;// 展开的图标
- private int img_collapse = R.drawable.outline_list_collapse;// 收缩的图标
- private int img_tree_space_1 = R.drawable.tree_space_1;// 连接线
- private int img_tree_space_2 = R.drawable.tree_space_2;
-
- private Context context;
- private LayoutInflater mInflater;
- private ArrayList<TreeElement> treeElementList;
- private int viewResourceId;
-
- public TreeViewAdapter(Context context, int viewResourceId,
- ArrayList<TreeElement> objects) {
- super(context, viewResourceId, objects);
- this.context = context;
- this.mInflater = LayoutInflater.from(context);
- this.treeElementList = objects;
- this.viewResourceId = viewResourceId;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- ViewHolder holder;
- convertView = mInflater.inflate(viewResourceId, null);
- holder = new ViewHolder();
- holder.caption = (TextView) convertView.findViewById(R.id.caption);
- holder.icon = (ImageView) convertView.findViewById(R.id.icon);
- holder.space = (LinearLayout) convertView.findViewById(R.id.space);
- convertView.setTag(holder);
- TreeElement treeElement = treeElementList.get(position);
-
- int level = treeElement.getLevel();
- if (level == 0) {// 根节点
-
- } else {
- ArrayList<Integer> spaceList = treeElement.getSpaceList();
-
- // 绘制前面的组织架构线条
- for (int i = 0; i < spaceList.size(); i++) {
- ImageView img = new ImageView(context);
- img.setImageResource(spaceList.get(i));
- holder.space.addView(img);
- }
- ImageView img = new ImageView(context);
- // 节点图标
- if (treeElement.isLastSibling()) {
- img.setImageResource(img_tree_space_2);
- } else {
- img.setImageResource(img_tree_space_1);
- }
-
- holder.space.addView(img);
- }
- if (treeElement.isHasChild()) {
- if (treeElement.isExpanded()) {
- holder.icon.setImageResource(img_expand);
- } else {
- holder.icon.setImageResource(img_collapse);
- }
- holder.icon.setOnClickListener(new TreeElementIconClickListener(
- context, treeElementList, this, treeElement.getPosition()));
- } else {
- holder.icon.setImageResource(img_leaf);
- }
- holder.caption.setText(treeElement.getCaption());// 设置标题
- if (treeElement.getCaptionOnClickListener() != null) {// 设置文字的点击事件
- holder.caption.setTag(treeElement.getValue());
- holder.caption.setOnClickListener(treeElement
- .getCaptionOnClickListener());
-
- }
- return convertView;
- }
-
- class ViewHolder {
- LinearLayout space;
- TextView caption;
- ImageView icon;
- }
-
- public static class TreeElementIconClickListener implements OnClickListener {
- private Context context;
- private ArrayList<TreeElement> treeElementList;
- private TreeViewAdapter treeViewAdapter;
- private int position;
-
- public TreeElementIconClickListener(Context mContext,
- ArrayList<TreeElement> mTreeElementList,
- TreeViewAdapter mTreeViewAdapter, int position) {
- this.context = mContext;
- this.treeElementList = mTreeElementList;
- this.treeViewAdapter = mTreeViewAdapter;
- this.position = position;
- }
-
- @Override
- public void onClick(View v) {
- System.out.println("点击的position:" + position);
- if (!treeElementList.get(position).isHasChild()) {
- Toast.makeText(context,
- treeElementList.get(position).getCaption(),
- Toast.LENGTH_SHORT).show();
- return;
- }
-
- if (treeElementList.get(position).isExpanded()) {
- treeElementList.get(position).setExpanded(false);
- TreeElement element = treeElementList.get(position);
- ArrayList<TreeElement> temp = new ArrayList<TreeElement>();
-
- for (int i = position + 1; i < treeElementList.size(); i++) {
- if (element.getLevel() >= treeElementList.get(i).getLevel()) {
- break;
- }
- temp.add(treeElementList.get(i));
- }
-
- treeElementList.removeAll(temp);
- for (int i = position + 1; i < treeElementList.size(); i++) {
- System.out.println(treeElementList.get(i).getCaption()
- + "@@@" + i);
- treeElementList.get(i).setPosition(i);
- }
-
- treeViewAdapter.notifyDataSetChanged();
- } else {
- TreeElement obj = treeElementList.get(position);
- obj.setExpanded(true);
- int level = obj.getLevel();
- int nextLevel = level + 1;
-
- ArrayList<TreeElement> tempList = obj.getChildList();
-
- for (int i = 0; i < tempList.size(); i++) {
- TreeElement element = tempList.get(i);
- element.setLevel(nextLevel);
- element.setExpanded(false);
- treeElementList.add(position + i + 1, element);
- }
- for (int i = position + 1; i < treeElementList.size(); i++) {
- System.out.println(treeElementList.get(i).getCaption()
- + "@@@" + i);
- treeElementList.get(i).setPosition(i);
- }
- treeViewAdapter.notifyDataSetChanged();
- }
-
- }
- }
- }
- package com.ccl.util.tree;
-
- import java.util.ArrayList;
-
- import com.ccl.util.tree.TreeViewAdapter.TreeElementIconClickListener;
-
- import android.os.Bundle;
- import android.app.Activity;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.ListView;
- import android.widget.Toast;
-
- public class MainActivity extends Activity {
- private ListView lv_tree;
- private TreeViewAdapter treeViewAdapter;
- private ArrayList<TreeElement> mRootList;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- lv_tree = (ListView) findViewById(R.id.lv_tree);
- mRootList = new ArrayList<TreeElement>();
- treeViewAdapter = new TreeViewAdapter(this, R.layout.atom_tree,
- mRootList);
- lv_tree.setAdapter(treeViewAdapter);
-
- OnClickListener myOnClickListener = new OnClickListener() {
- @Override
- public void onClick(View v) {
- Toast.makeText(MainActivity.this, "--" + v.getTag(),
- Toast.LENGTH_LONG).show();
- }
- };
-
- TreeElement rootElement = new TreeElement("root", "root", "1", true,
- null);
-
- TreeElement treeElement1 = new TreeElement("node1", "节点1", "1", true,
- null);
- TreeElement treeElement2 = new TreeElement("node2", "节点2", "2", false,
- myOnClickListener);
- TreeElement treeElement3 = new TreeElement("node3", "节点3", "1", false,
- myOnClickListener);
- TreeElement treeElement4 = new TreeElement("node3", "节点4", "1", true,
- myOnClickListener);
-
- TreeElement treeElement1_1 = new TreeElement("node14", "节点1_1", "1",
- true, myOnClickListener);
- TreeElement treeElement1_2 = new TreeElement("node14", "节点1_2", "1",
- false, myOnClickListener);
- TreeElement treeElement1_3 = new TreeElement("node14", "节点1_3", "1",
- true, myOnClickListener);
- TreeElement treeElement1_1_1 = new TreeElement("node14", "节点1_1_1",
- "1", false, myOnClickListener);
- TreeElement treeElement1_3_1 = new TreeElement("node14", "节点1_3_1",
- "1", true, myOnClickListener);
- TreeElement treeElement1_3_2 = new TreeElement("node14", "节点1_3_2",
- "1", false, myOnClickListener);
- TreeElement treeElement1_3_1_1 = new TreeElement("node14", "节点1_3_1_1",
- "1", false, myOnClickListener);
-
- TreeElement treeElement4_1 = new TreeElement("node14", "节点4_1", "1",
- true, myOnClickListener);
- TreeElement treeElement4_2 = new TreeElement("node14", "节点4_2", "1",
- false, myOnClickListener);
- TreeElement treeElement4_3 = new TreeElement("node14", "节点4_3", "1",
- true, myOnClickListener);
- TreeElement treeElement4_1_1 = new TreeElement("node14", "节点4_1_1",
- "1", false, myOnClickListener);
- TreeElement treeElement4_3_1 = new TreeElement("node14", "节点4_3_1",
- "1", false, myOnClickListener);
- mRootList.add(rootElement);
- rootElement.addChild(treeElement1);
- rootElement.addChild(treeElement2);
- rootElement.addChild(treeElement3);
- rootElement.addChild(treeElement4);
- treeElement1.addChild(treeElement1_1);
- treeElement1.addChild(treeElement1_2);
- treeElement1.addChild(treeElement1_3);
- treeElement1_1.addChild(treeElement1_1_1);
- treeElement1_3.addChild(treeElement1_3_1);
- treeElement1_3.addChild(treeElement1_3_2);
- treeElement1_3_1.addChild(treeElement1_3_1_1);
- treeElement4.addChild(treeElement4_1);
- treeElement4.addChild(treeElement4_2);
- treeElement4.addChild(treeElement4_3);
- treeElement4_1.addChild(treeElement4_1_1);
- treeElement4_3.addChild(treeElement4_3_1);
-
- treeViewAdapter.notifyDataSetChanged();
- System.out.println(1111);
-
- // 展开根目录
- TreeElementIconClickListener mtest = new TreeElementIconClickListener(
- MainActivity.this, mRootList, treeViewAdapter, 0);
- mtest.onClick(null);
-
- }
- }