# Tree2View
[![](https://jitpack.io/v/LeeReindeer/Tree2View.svg)](https://jitpack.io/#LeeReindeer/Tree2View)
> TreeView implementation in Android.
## 主要功能
|Tree2View|文件管理器(一个例子)|
|--------|----------|
|①多级分层的树结构视图 | 基本的文件管理器布局|
|②记忆展开状态 | 自动展开上次打开未关闭的目录|
|③使用适配器设计模式,用户可自定义 TreeAdapter | 对不同类型的文件显示不同的Icon |
|④动态增删节点 | 删除和添加文件后可自动刷新状态 |
|⑤选择模式 | 长按节点进行文件操作(Copy, Cut, Rename, Delete) |
|⑥动画支持,内置增删节点的动画 | 增删文件时带有动画 |
[一个更简单的例子](https://github.com/LeeReindeer/Tree2View-demo)
## 实现原理
- TreeView 继承自 ListView
- DFS遍历可展开的树节点,转化为List 与 [TreeAdapter](https://github.com/LeeReindeer/Tree2View/blob/master/treeview/src/main/java/xyz/leezoom/view/treeview/adapter/TreeAdapter.java) 进行适配。
- 分级的视觉效果通过 [SimpleTreeAdapter](https://github.com/LeeReindeer/Tree2View/blob/master/treeview/src/main/java/xyz/leezoom/view/treeview/adapter/SimpleTreeAdapter.java)(通过对不同深度的节点设置不同的**缩进**)来实现的。
- 使用 [DefaultTreeNode](https://github.com/LeeReindeer/Tree2View/blob/master/treeview/src/main/java/xyz/leezoom/view/treeview/module/DefaultTreeNode.java) 来(用链表保存子节点)增删节点。这样就实现了视觉效果和数据结构统一的设计。
## 效果预览 - Preview
![](https://github.com/LeeReindeer/Tree2View/blob/master/screenshot/tree2view_demo1.png)
![](https://github.com/LeeReindeer/Tree2View/blob/master/screenshot/tree2view_demo2.png)
## 下载
1. 在项目的 build.gradle 中添加:
```
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
```
2. 在 app 目录下的 build.gradle 添加:
```
dependencies {
implementation 'com.github.LeeReindeer:Tree2View:v0.1.2'
}
```
## 使用
1. 在 `xml` 中添加,和 `ListView` 类似的.
```xml
```
2. 在代码里添加初始化,这里使用Kotlin(Java 代码类似)
```kotlin
var root :DefaultTreeNode? = DefaultTreeNode("Root")
tree_view.root = root
val child1 = DefaultTreeNode("Child1")
val child2 = DefaultTreeNode("Child2")
//在你创建节点之后,你需要立即添加她
root.addChild(child1)
root.addChild(child2)
val child3 = DefaultTreeNode("Child3")
child1.addChild(child3)
//是否默认显示根节点的孩子
tree_view.isRootVisible = true
//默认的动画
tree_view.isDefaultAnimation = true
```
3. 设置监听器
`Tree2View` 有默认的点击监听器,你也可以自己实现,可以参考[这里](https://github.com/LeeReindeer/Tree2View/blob/master/app/src/main/java/xyz/leezoom/tree2/activity/MainActivity.kt#L111)。
选择(长按)监听器需要自己实现。
4. 自定义使用
只需要实现 `TreeAapater` ,就那么简单。
```java
public class FileTreeAdapter extends TreeAdapter {
//resourceId 是 itemView 的 xml 视图。
public FileTreeAdapter(Context context, DefaultTreeNode root, int resourceId) {
super(context, root, resourceId);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//your code here
//...
//调用 setPadding 来设置缩进
setPadding(holder.arrowIcon, depth, -1);
//根据数据改变 view 的状态(比如图标什么的)
toggle(node, holder);
}
@Override
public void toggle(Object... objects) {
//需要自己实现
}
}
```
之后只要设置一下适配器:
```kotlin
val adapter = FileTreeAdapter(this@MainActivity, root, R.layout.layout_file_tree_item)
treeView.treeAdapter = adapter
```
## License
Apache 2.0