TreeView implementation in Android.
TreeView | File Explorer(Advanced Example) |
---|---|
①Multi-level tree view | Basic file manager layout |
②Remember expansion state | Automatically expand the last unclosed directory |
③Customize TreeAdapter | Different types of documents show different Icon |
④Dynamic add and delete nodes | refresh status after delete and add files |
⑤Select listener | Long press node for file operations (Copy, Cut, Rename, Delete) |
⑥Animation support | Add or delete files with animation |
You can also see a more simple example.
-
TreeView extends from ListView.
-
DFS travel the expandable tree node, and convert it to List which adapt with TreeAdapter.
-
Use SimpleTreeAdapter ot set different indentation on nodes of different depths.
-
Use LinkedList to store node's children, see DefaultTreeNode.
To-do: upload to jCenter.
- But now, you can just clone this repo to use Tree2View.
git clone git@github.com:LeeReindeer/Tree2View.git
-
Open your project in Android Studio, then Click
FIle
->New
->Import Module
, to import this module. -
Add dependence in your
build.gradle
implementation project(path: ':treeview')
//or
compile project(path: ':treeview')
- Add in your xml:
Feel free to use it as ListView
.
<xyz.leezoom.view.treeview.TreeView
android:id="@+id/tree_view"
android:layout_marginTop="16dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="#ffffff"
android:dividerHeight="1px">
</xyz.leezoom.view.treeview.TreeView>
- Add children in Kotlin code(Java is similar whit it)
var root :DefaultTreeNode? = DefaultTreeNode("Root")
tree_view.root = root
val child1 = DefaultTreeNode("Child1")
val child2 = DefaultTreeNode("Child2")
// After create a node your should immediately add it.
root.addChild(child1)
root.addChild(child2)
val child3 = DefaultTreeNode("Child3")
child1.addChild(child3)
//whether the root's children is expanded by default
tree_view.isRootVisible = true
//animation
tree_view.isDefaultAnimation = true
- Add click listener and select listener
Tree2View has a default click listener, but it's ok to add your own.You can refer to here.
- If you want to use customized item view, you should implement
TreeAapater
, like this:
public class FileTreeAdapter extends TreeAdapter<FileItem> {
//resourceId is your customized view resourceId, please use RelativeLayout, and let view neighbour.
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
//...
//call padding for a better UI
setPadding(holder.arrowIcon, depth, -1);
//toggle your view's status here
toggle(node, holder);
}
@Override
public void toggle(Object... objects) {
}
Then simply add:
val adapter = FileTreeAdapter(this@MainActivity, root, R.layout.layout_file_tree_item)
treeView.treeAdapter = adapter
Apache 2.0