- 浏览: 165446 次
- 性别:
- 来自: 大连
文章分类
最新评论
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
-
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);
-
-
}
- }
相关推荐
listview实现的tree树结构 ui美观 高端大气上档次,完美实现结构树,【最好使用真机测试,不然可能会报错】。唯一不足之处在于展开状态的控制,跟节点设置展开后只是图标变了,子节 点都没有出现。
Android应用源码ListView实现的目录树结构
自定义ListView和RecycleView实现多级树功能 实现类似qq分组列表
效果采用了我们安卓中的listview来实现树形tree节点结构布局的,该结构可以分成几部分的,节点一,或分其他的节点等,该布局经常使用在我们的一个流量某些文件时等。
主要功能:实现了仿windows资源管理器功能,通过txt文件生成左侧树结构,点击树节点右侧listview显示节点目录下的所有文件。 由于数据较多所以采用分段加载节点,也就是在需要展开节点时加载该节点下的节点。
我们知道C++中树控制(CTreeCtrl)主要用来显示具有一定层次结构的数据项,如资源管理器中的磁盘目录等,以供用户在其中进行各种选择。Android 本身没有这个CTreeCtrl控件,但可以用ListView模拟出同样的效果
企业级的通讯录做成多级树结构,用户打开通讯录模块,只会把一级目录结构请求下来,当用户需要查找人时,点击对应的部门item,就会请求对应部门下的列表,这样在极大程度上减少了用户的流量消耗和等待时间。
对于多级树的显示其实就是通过数据中各个节点的关系,通过不同的缩进来达到树的效果。而数据中主要要把握id,父节点pId,name的关系,来显示其效果。实例详细的实现的多级树和全选与反选的过程
SuperGrid-MFC_ListCtrl控件扩展,让ListCtrl控件具有树状列表,让ListCtrl控件的每一行都是一个树结构。
jh-weapp-demo 小程序 实现的一些效果 ...树结构数据展示 侧滑筛选 custom-tabbar(动态设置、不闪屏) wx.request 封装,云函数请求封装 封装一些组件(在JhComponents文件夹)和工具类(在utils文件夹)
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...
根据基本表结构及其数据生成 INSERT ... 的 SQL 简便的MS SQL 数据库 表内容 脚本 生成器 将表数据生成SQL脚本的存储过程 直接从SQL语句问题贴子数据建表并生成建表语句的存储过程 从SQL中的一个表中导出HTML文件...
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 树控件...
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 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...