From 82628c4839ecbc7d96b0cc2a1bb49a8cf9ff4a06 Mon Sep 17 00:00:00 2001
From: Xinghaoxiang <herry_xing@126.com>
Date: Tue, 26 Jun 2018 14:08:46 +0800
Subject: [PATCH] =?UTF-8?q?=E6=A0=91=E5=BD=A2=E7=BB=93=E6=9E=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 {app => sample}/.gitignore                    |   0
 {app => sample}/build.gradle                  |   0
 {app => sample}/proguard-rules.pro            |   0
 .../ExampleInstrumentedTest.java              |   0
 {app => sample}/src/main/AndroidManifest.xml  |   0
 .../com/bril/webfilemodule/MainActivity.java  |  28 +++
 .../java/com/bril/webfilemodule/Test.java     |   0
 .../src/main/res/layout/activity_main.xml     |  31 ++-
 .../src/main/res/mipmap-hdpi/ic_launcher.png  | Bin
 .../res/mipmap-hdpi/ic_launcher_round.png     | Bin
 .../src/main/res/mipmap-mdpi/ic_launcher.png  | Bin
 .../res/mipmap-mdpi/ic_launcher_round.png     | Bin
 .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin
 .../res/mipmap-xhdpi/ic_launcher_round.png    | Bin
 .../main/res/mipmap-xxhdpi/ic_launcher.png    | Bin
 .../res/mipmap-xxhdpi/ic_launcher_round.png   | Bin
 .../main/res/mipmap-xxxhdpi/ic_launcher.png   | Bin
 .../res/mipmap-xxxhdpi/ic_launcher_round.png  | Bin
 .../src/main/res/values/colors.xml            |   0
 .../src/main/res/values/strings.xml           |   0
 .../src/main/res/values/styles.xml            |   0
 .../bril/webfilemodule/ExampleUnitTest.java   |   0
 settings.gradle                               |   2 +-
 webfile/src/main/AndroidManifest.xml          |   1 +
 .../java/com/bril/webfile/FileActivity.java   |  36 ++++
 .../com/bril/webfile/NextCloudActivity.java   | 139 +++++++++++++
 .../java/com/bril/webfile/net/Constant.java   |   4 +-
 .../com/bril/webfile/net/api/FileAPI.java     |   7 +
 .../bril/webfile/net/client/FileClient.java   |   6 +
 .../bril/webfile/response/ChildrenBeans.java  |  52 +++++
 .../webfile/response/NextCloudResponse.java   | 137 +++++++++++++
 .../adapter/SimpleTreeListViewAdapter.java    |  62 ++++++
 .../treeview/adapter/TreeViewAdapter.java     |  92 +++++++++
 .../webfile/treeview/annotation/NodeName.java |  16 ++
 .../webfile/treeview/annotation/NodePID.java  |  15 ++
 .../webfile/treeview/annotation/NodeType.java |  16 ++
 .../webfile/treeview/helper/TreeHelper.java   | 188 ++++++++++++++++++
 .../com/bril/webfile/treeview/node/Node.java  | 154 ++++++++++++++
 .../src/main/res/drawable-mdpi/tree_ec.png    | Bin 0 -> 2858 bytes
 .../src/main/res/drawable-mdpi/tree_ex.png    | Bin 0 -> 2848 bytes
 webfile/src/main/res/layout/list_item.xml     |  25 +++
 41 files changed, 1007 insertions(+), 4 deletions(-)
 rename {app => sample}/.gitignore (100%)
 rename {app => sample}/build.gradle (100%)
 rename {app => sample}/proguard-rules.pro (100%)
 rename {app => sample}/src/androidTest/java/com/bril/webfilemodule/ExampleInstrumentedTest.java (100%)
 rename {app => sample}/src/main/AndroidManifest.xml (100%)
 rename {app => sample}/src/main/java/com/bril/webfilemodule/MainActivity.java (73%)
 rename {app => sample}/src/main/java/com/bril/webfilemodule/Test.java (100%)
 rename {app => sample}/src/main/res/layout/activity_main.xml (75%)
 rename {app => sample}/src/main/res/mipmap-hdpi/ic_launcher.png (100%)
 rename {app => sample}/src/main/res/mipmap-hdpi/ic_launcher_round.png (100%)
 rename {app => sample}/src/main/res/mipmap-mdpi/ic_launcher.png (100%)
 rename {app => sample}/src/main/res/mipmap-mdpi/ic_launcher_round.png (100%)
 rename {app => sample}/src/main/res/mipmap-xhdpi/ic_launcher.png (100%)
 rename {app => sample}/src/main/res/mipmap-xhdpi/ic_launcher_round.png (100%)
 rename {app => sample}/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%)
 rename {app => sample}/src/main/res/mipmap-xxhdpi/ic_launcher_round.png (100%)
 rename {app => sample}/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%)
 rename {app => sample}/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png (100%)
 rename {app => sample}/src/main/res/values/colors.xml (100%)
 rename {app => sample}/src/main/res/values/strings.xml (100%)
 rename {app => sample}/src/main/res/values/styles.xml (100%)
 rename {app => sample}/src/test/java/com/bril/webfilemodule/ExampleUnitTest.java (100%)
 create mode 100644 webfile/src/main/java/com/bril/webfile/NextCloudActivity.java
 create mode 100644 webfile/src/main/java/com/bril/webfile/response/ChildrenBeans.java
 create mode 100644 webfile/src/main/java/com/bril/webfile/response/NextCloudResponse.java
 create mode 100644 webfile/src/main/java/com/bril/webfile/treeview/adapter/SimpleTreeListViewAdapter.java
 create mode 100644 webfile/src/main/java/com/bril/webfile/treeview/adapter/TreeViewAdapter.java
 create mode 100644 webfile/src/main/java/com/bril/webfile/treeview/annotation/NodeName.java
 create mode 100644 webfile/src/main/java/com/bril/webfile/treeview/annotation/NodePID.java
 create mode 100644 webfile/src/main/java/com/bril/webfile/treeview/annotation/NodeType.java
 create mode 100644 webfile/src/main/java/com/bril/webfile/treeview/helper/TreeHelper.java
 create mode 100644 webfile/src/main/java/com/bril/webfile/treeview/node/Node.java
 create mode 100644 webfile/src/main/res/drawable-mdpi/tree_ec.png
 create mode 100644 webfile/src/main/res/drawable-mdpi/tree_ex.png
 create mode 100644 webfile/src/main/res/layout/list_item.xml

diff --git a/app/.gitignore b/sample/.gitignore
similarity index 100%
rename from app/.gitignore
rename to sample/.gitignore
diff --git a/app/build.gradle b/sample/build.gradle
similarity index 100%
rename from app/build.gradle
rename to sample/build.gradle
diff --git a/app/proguard-rules.pro b/sample/proguard-rules.pro
similarity index 100%
rename from app/proguard-rules.pro
rename to sample/proguard-rules.pro
diff --git a/app/src/androidTest/java/com/bril/webfilemodule/ExampleInstrumentedTest.java b/sample/src/androidTest/java/com/bril/webfilemodule/ExampleInstrumentedTest.java
similarity index 100%
rename from app/src/androidTest/java/com/bril/webfilemodule/ExampleInstrumentedTest.java
rename to sample/src/androidTest/java/com/bril/webfilemodule/ExampleInstrumentedTest.java
diff --git a/app/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml
similarity index 100%
rename from app/src/main/AndroidManifest.xml
rename to sample/src/main/AndroidManifest.xml
diff --git a/app/src/main/java/com/bril/webfilemodule/MainActivity.java b/sample/src/main/java/com/bril/webfilemodule/MainActivity.java
similarity index 73%
rename from app/src/main/java/com/bril/webfilemodule/MainActivity.java
rename to sample/src/main/java/com/bril/webfilemodule/MainActivity.java
index 7c01d27..86e215e 100644
--- a/app/src/main/java/com/bril/webfilemodule/MainActivity.java
+++ b/sample/src/main/java/com/bril/webfilemodule/MainActivity.java
@@ -7,9 +7,11 @@ import android.util.Log;
 import android.view.View;
 
 import com.bril.webfile.FileActivity;
+import com.bril.webfile.NextCloudActivity;
 
 public class MainActivity extends AppCompatActivity {
     public static final int FILE_CHOOSE = 0x012;
+    public static final int FILE_NEXTCLOUD= 0x013;
     String notification = "";
     String conferenceManagement = "";
     private static final String TAG = "MainActivity";
@@ -86,7 +88,33 @@ public class MainActivity extends AppCompatActivity {
                     String fileId = data.getStringExtra("fileId");
                     Log.d(TAG, "fileID:" + fileId + " filePath:" + filePath + " fileName:" + fileName);
                     break;
+                case FILE_NEXTCLOUD:
+                    String absolutePath = data.getStringExtra("absolutePath");
+                    String filePaths = data.getStringExtra("filePaths");
+                    Log.d(TAG, "onActivityResult: " + absolutePath + "   " + filePaths);
+                    break;
             }
         }
     }
+
+    public void shareFolder(View view) {
+        Intent intent = new Intent(this, NextCloudActivity.class);
+        intent.putExtra("userId", "716");
+        intent.putExtra("moduleName", "shareFolder");
+        startActivityForResult(intent,FILE_NEXTCLOUD);
+    }
+
+    public void myselfNetDisk(View view) {
+        Intent intent = new Intent(this, NextCloudActivity.class);
+        intent.putExtra("userId", "716");
+        intent.putExtra("moduleName", "myselfNetDisk");
+        startActivityForResult(intent,FILE_NEXTCLOUD);
+    }
+
+    public void documentManager(View view) {
+        Intent intent = new Intent(this, NextCloudActivity.class);
+        intent.putExtra("userId", "716");
+        intent.putExtra("moduleName", "documentManager");
+        startActivityForResult(intent,FILE_NEXTCLOUD);
+    }
 }
diff --git a/app/src/main/java/com/bril/webfilemodule/Test.java b/sample/src/main/java/com/bril/webfilemodule/Test.java
similarity index 100%
rename from app/src/main/java/com/bril/webfilemodule/Test.java
rename to sample/src/main/java/com/bril/webfilemodule/Test.java
diff --git a/app/src/main/res/layout/activity_main.xml b/sample/src/main/res/layout/activity_main.xml
similarity index 75%
rename from app/src/main/res/layout/activity_main.xml
rename to sample/src/main/res/layout/activity_main.xml
index c688c93..e3617ed 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/sample/src/main/res/layout/activity_main.xml
@@ -91,7 +91,36 @@
         android:onClick="documentScan"
         />
 
+    <Button
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="共享文件夹"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:onClick="shareFolder"
+        />
 
+    <Button
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="个人网盘"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:onClick="myselfNetDisk"
+        />
 
-
+    <Button
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="文档管理"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:onClick="documentManager"
+        />
 </LinearLayout>
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/sample/src/main/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from app/src/main/res/mipmap-hdpi/ic_launcher.png
rename to sample/src/main/res/mipmap-hdpi/ic_launcher.png
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/sample/src/main/res/mipmap-hdpi/ic_launcher_round.png
similarity index 100%
rename from app/src/main/res/mipmap-hdpi/ic_launcher_round.png
rename to sample/src/main/res/mipmap-hdpi/ic_launcher_round.png
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/sample/src/main/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from app/src/main/res/mipmap-mdpi/ic_launcher.png
rename to sample/src/main/res/mipmap-mdpi/ic_launcher.png
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/sample/src/main/res/mipmap-mdpi/ic_launcher_round.png
similarity index 100%
rename from app/src/main/res/mipmap-mdpi/ic_launcher_round.png
rename to sample/src/main/res/mipmap-mdpi/ic_launcher_round.png
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/sample/src/main/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from app/src/main/res/mipmap-xhdpi/ic_launcher.png
rename to sample/src/main/res/mipmap-xhdpi/ic_launcher.png
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/sample/src/main/res/mipmap-xhdpi/ic_launcher_round.png
similarity index 100%
rename from app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
rename to sample/src/main/res/mipmap-xhdpi/ic_launcher_round.png
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/sample/src/main/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from app/src/main/res/mipmap-xxhdpi/ic_launcher.png
rename to sample/src/main/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/sample/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
similarity index 100%
rename from app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
rename to sample/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/sample/src/main/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
rename to sample/src/main/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/sample/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
similarity index 100%
rename from app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
rename to sample/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
diff --git a/app/src/main/res/values/colors.xml b/sample/src/main/res/values/colors.xml
similarity index 100%
rename from app/src/main/res/values/colors.xml
rename to sample/src/main/res/values/colors.xml
diff --git a/app/src/main/res/values/strings.xml b/sample/src/main/res/values/strings.xml
similarity index 100%
rename from app/src/main/res/values/strings.xml
rename to sample/src/main/res/values/strings.xml
diff --git a/app/src/main/res/values/styles.xml b/sample/src/main/res/values/styles.xml
similarity index 100%
rename from app/src/main/res/values/styles.xml
rename to sample/src/main/res/values/styles.xml
diff --git a/app/src/test/java/com/bril/webfilemodule/ExampleUnitTest.java b/sample/src/test/java/com/bril/webfilemodule/ExampleUnitTest.java
similarity index 100%
rename from app/src/test/java/com/bril/webfilemodule/ExampleUnitTest.java
rename to sample/src/test/java/com/bril/webfilemodule/ExampleUnitTest.java
diff --git a/settings.gradle b/settings.gradle
index de9a801..9db7da3 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1 +1 @@
-include ':app', ':webfile'
+include ':sample', ':webfile'
diff --git a/webfile/src/main/AndroidManifest.xml b/webfile/src/main/AndroidManifest.xml
index 24b0b98..38c8dc1 100644
--- a/webfile/src/main/AndroidManifest.xml
+++ b/webfile/src/main/AndroidManifest.xml
@@ -5,6 +5,7 @@
     <application
         android:supportsRtl="true">
         <activity android:name=".FileActivity" />
+        <activity android:name=".NextCloudActivity" />
     </application>
 
 </manifest>
diff --git a/webfile/src/main/java/com/bril/webfile/FileActivity.java b/webfile/src/main/java/com/bril/webfile/FileActivity.java
index b2b9df1..e686ff1 100644
--- a/webfile/src/main/java/com/bril/webfile/FileActivity.java
+++ b/webfile/src/main/java/com/bril/webfile/FileActivity.java
@@ -67,8 +67,44 @@ public class FileActivity extends AppCompatActivity implements AdapterView.OnIte
                         throwable.printStackTrace();
                     }
                 });
+//        fileClient.nextCloud(userId, "2")
+//                .observeOn(AndroidSchedulers.mainThread())
+//                .subscribeOn(Schedulers.io())
+//                .subscribe(new Consumer<NextCloudResponse>() {
+//                    @Override
+//                    public void accept(NextCloudResponse nextCloudResponses) throws Exception {
+//                        List<NextCloudResponse.ListBean> list = nextCloudResponses.getList();
+//                        for (NextCloudResponse.ListBean listBean : list) {
+//                            ChildrenBeans childrenBeans = new ChildrenBeans();
+//                            String type = listBean.getType();
+//                            String name = listBean.getName();
+//                            childrenBeans.setName(name);
+//                            childrenBeans.setType(type);
+//                            childrenBeansList.add(childrenBeans);
+//                            addData(listBean.getChildren());
+//                        }
+//                        Log.d(TAG, "" + childrenBeansList.size());
+//                        for (ChildrenBeans childrenBeans : childrenBeansList) {
+//                            Log.e(TAG, childrenBeans.toString() );
+//                        }
+//
+//                        SimpleTreeListViewAdapter simpleTreeListViewAdapter
+//                                = new SimpleTreeListViewAdapter(fileLv, FileActivity.this, childrenBeansList, 1);
+//                        fileLv.setAdapter(simpleTreeListViewAdapter);
+//
+//                    }
+//                }, new Consumer<Throwable>() {
+//                    @Override
+//                    public void accept(Throwable throwable) throws Exception {
+//                        throwable.printStackTrace();
+//                    }
+//                });
     }
 
+
+
+
+
     @Override
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
         FileResponse fileResponse = fileBean.get(position);
diff --git a/webfile/src/main/java/com/bril/webfile/NextCloudActivity.java b/webfile/src/main/java/com/bril/webfile/NextCloudActivity.java
new file mode 100644
index 0000000..f80368e
--- /dev/null
+++ b/webfile/src/main/java/com/bril/webfile/NextCloudActivity.java
@@ -0,0 +1,139 @@
+package com.bril.webfile;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v7.app.AppCompatActivity;
+import android.util.Log;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.Toast;
+
+import com.bril.webfile.net.client.FileClient;
+import com.bril.webfile.response.ChildrenBeans;
+import com.bril.webfile.response.NextCloudResponse;
+import com.bril.webfile.treeview.adapter.SimpleTreeListViewAdapter;
+import com.bril.webfile.treeview.adapter.TreeViewAdapter;
+import com.bril.webfile.treeview.node.Node;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import retrofit2.Call;
+import retrofit2.Callback;
+import retrofit2.Response;
+
+/**
+ * Created by Xinghx on 2018/6/26 0026.
+ */
+
+public class NextCloudActivity extends AppCompatActivity {
+    ListView mTree;
+    List<ChildrenBeans> childrenBeansList = new ArrayList<>();
+    private String userId;
+    private static final String TAG = "NextCloudActivity";
+    private String moduleName;
+    private LinearLayout file_img_backs;
+
+    private NextCloudResponse cloudResponse;
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_file_layout);
+        userId = getIntent().getStringExtra("userId");
+        moduleName = getIntent().getStringExtra("moduleName");
+        mTree = (ListView) findViewById(R.id.file_lv);
+        file_img_backs = (LinearLayout) findViewById(R.id.file_img_backs);
+
+        file_img_backs.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                finish();
+            }
+        });
+        initData();
+    }
+
+    public void initData() {
+
+        String realType = "";
+        switch (moduleName) {
+            case "myselfNetDisk":
+                realType = "1";
+                break;
+            case "shareFolder":
+                realType = "2";
+
+                break;
+            case "documentManager":
+                realType = "3";
+                break;
+        }
+
+        FileClient fileClient = new FileClient();
+        fileClient.nextCloud(userId, realType).enqueue(new Callback<NextCloudResponse>() {
+            @Override
+            public void onResponse(Call<NextCloudResponse> call, Response<NextCloudResponse> response) {
+                try {
+                    cloudResponse = response.body();
+
+                    List<NextCloudResponse.ListBean> list = response.body().getList();
+                    for (NextCloudResponse.ListBean listBean : list) {
+                        ChildrenBeans childrenBeans = new ChildrenBeans();
+                        String type = listBean.getType();
+                        String name = listBean.getName();
+                        childrenBeans.setName(name);
+                        childrenBeans.setType(type);
+                        childrenBeansList.add(childrenBeans);
+                        addData(listBean.getChildren());
+                    }
+                    for (ChildrenBeans childrenBeans : childrenBeansList) {
+                        Log.e(TAG, childrenBeans.toString() );
+                    }
+
+                    SimpleTreeListViewAdapter simpleTreeListViewAdapter
+                            = new SimpleTreeListViewAdapter(mTree, NextCloudActivity.this, childrenBeansList, 0);
+                    mTree.setAdapter(simpleTreeListViewAdapter);
+                    simpleTreeListViewAdapter.setOnNodeClickListener(new TreeViewAdapter.OnTreeNodeClickListener() {
+                        @Override
+                        public void onClick(Node node, int position) {
+                            if (node.isFile()) {
+                                Toast.makeText(NextCloudActivity.this, node.getName(), Toast.LENGTH_SHORT).show();
+                                Intent intent = new Intent();
+                                intent.putExtra("absolutePath",cloudResponse.getAbsolutePath());
+                                intent.putExtra("filePaths", node.getName());
+                                setResult(0x013, intent);
+                                finish();
+                            }
+                        }
+                    });
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                }
+
+            }
+
+            @Override
+            public void onFailure(Call<NextCloudResponse> call, Throwable t) {
+                t.printStackTrace();
+            }
+        });
+    }
+
+    private void addData(List<NextCloudResponse.ListBean.ChildrenBean> mList) {
+
+        for (NextCloudResponse.ListBean.ChildrenBean childrenBean : mList) {
+            if (childrenBean == null) return;
+            ChildrenBeans childrenBeans = new ChildrenBeans();
+            String name = childrenBean.getName();
+            String type = childrenBean.getType();
+            childrenBeans.setName(name);
+            childrenBeans.setType(type);
+            childrenBeansList.add(childrenBeans);
+            if (childrenBean.getChildrenBeen() != null) {
+                addData(childrenBean.getChildrenBeen());
+            }
+        }
+    }
+}
diff --git a/webfile/src/main/java/com/bril/webfile/net/Constant.java b/webfile/src/main/java/com/bril/webfile/net/Constant.java
index 6e4e669..cf58e08 100644
--- a/webfile/src/main/java/com/bril/webfile/net/Constant.java
+++ b/webfile/src/main/java/com/bril/webfile/net/Constant.java
@@ -5,6 +5,6 @@ package com.bril.webfile.net;
  */
 
 public class Constant {
-    public static String SWAGGERURL = "http://zjk.haomo-tech.com/zhangjiakouOA/";
-//    public static String SWAGGERURL = "http://143.19.128.79/api/";
+//    public static String SWAGGERURL = "http://zjk.haomo-tech.com/zhangjiakouOA/";
+    public static String SWAGGERURL = "http://143.19.128.79/api/";
 }
diff --git a/webfile/src/main/java/com/bril/webfile/net/api/FileAPI.java b/webfile/src/main/java/com/bril/webfile/net/api/FileAPI.java
index 2430a38..5e4fa22 100644
--- a/webfile/src/main/java/com/bril/webfile/net/api/FileAPI.java
+++ b/webfile/src/main/java/com/bril/webfile/net/api/FileAPI.java
@@ -1,10 +1,12 @@
 package com.bril.webfile.net.api;
 
 import com.bril.webfile.response.FileResponse;
+import com.bril.webfile.response.NextCloudResponse;
 
 import java.util.List;
 
 import io.reactivex.Observable;
+import retrofit2.Call;
 import retrofit2.http.Field;
 import retrofit2.http.FormUrlEncoded;
 import retrofit2.http.POST;
@@ -19,4 +21,9 @@ public interface FileAPI {
     Observable<List<FileResponse>> fileModel(@Field("user_id") String userId,
                                              @Field("module_names") String moduleNames);
 
+    @FormUrlEncoded
+    @POST("get_nextcloud_folders")
+    Call<NextCloudResponse> nextCloud(@Field("userId") String userId,
+                                      @Field("modular") String modular,
+                                      @Field("addEmptyFolder") boolean addEmptyFolder);
 }
diff --git a/webfile/src/main/java/com/bril/webfile/net/client/FileClient.java b/webfile/src/main/java/com/bril/webfile/net/client/FileClient.java
index cf3e075..fdef4b4 100644
--- a/webfile/src/main/java/com/bril/webfile/net/client/FileClient.java
+++ b/webfile/src/main/java/com/bril/webfile/net/client/FileClient.java
@@ -4,10 +4,12 @@ package com.bril.webfile.net.client;
 import com.bril.webfile.net.Constant;
 import com.bril.webfile.net.api.FileAPI;
 import com.bril.webfile.response.FileResponse;
+import com.bril.webfile.response.NextCloudResponse;
 
 import java.util.List;
 
 import io.reactivex.Observable;
+import retrofit2.Call;
 import retrofit2.Retrofit;
 import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
 import retrofit2.converter.gson.GsonConverterFactory;
@@ -29,4 +31,8 @@ public class FileClient extends BaseClient {
         return fileAPI.fileModel(userId,moduleName);
     }
 
+    public Call<NextCloudResponse> nextCloud(String userId, String moduleName) {
+        return fileAPI.nextCloud(userId,moduleName,false);
+    }
+
 }
diff --git a/webfile/src/main/java/com/bril/webfile/response/ChildrenBeans.java b/webfile/src/main/java/com/bril/webfile/response/ChildrenBeans.java
new file mode 100644
index 0000000..64dff57
--- /dev/null
+++ b/webfile/src/main/java/com/bril/webfile/response/ChildrenBeans.java
@@ -0,0 +1,52 @@
+package com.bril.webfile.response;
+
+import com.bril.webfile.treeview.annotation.NodeName;
+import com.bril.webfile.treeview.annotation.NodeType;
+
+/**
+ * Created by Xinghx on 2018/6/25 0025.
+ */
+
+public class ChildrenBeans {
+    @NodeName
+    private String name;
+
+    private String state;
+    @NodeType
+    private String type;
+
+
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getState() {
+        return state;
+    }
+
+    public void setState(String state) {
+        this.state = state;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    @Override
+    public String toString() {
+        return "ChildrenBeans{" +
+                "name='" + name + '\'' +
+                ", state='" + state + '\'' +
+                ", type='" + type + '\'' +
+                '}';
+    }
+}
diff --git a/webfile/src/main/java/com/bril/webfile/response/NextCloudResponse.java b/webfile/src/main/java/com/bril/webfile/response/NextCloudResponse.java
new file mode 100644
index 0000000..aedd229
--- /dev/null
+++ b/webfile/src/main/java/com/bril/webfile/response/NextCloudResponse.java
@@ -0,0 +1,137 @@
+package com.bril.webfile.response;
+
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+/**
+ * Created by Xinghx on 2018/6/21
+ */
+
+public class NextCloudResponse {
+
+    /**
+     * absolutePath : /data/nextcloud/networkdisk/data/19803130208/files/
+     * list : [{"children":[{"children":[],"name":"Photos/Hummingbird.jpg","state":"open","type":"file"},{"children":[],"name":"Photos/Coast.jpg","state":"open","type":"file"},{"children":[],"name":"Photos/Nut.jpg","state":"open","type":"file"}],"name":"Photos","state":"closed","type":"folder"},{"children":[],"name":"Docker������Java Web������.docx","state":"open","type":"file"},{"children":[],"name":"Nex tcloud.mp4","state":"open","type":"file"},{"children":[],"name":"B02D88149D896F1D004B03F4076D218E.jpg","state":"open","type":"file"},{"children":[{"children":[],"name":"Documents/About.odt","state":"open","type":"file"},{"children":[],"name":"Documents/About.txt","state":"open","type":"file"}],"name":"Documents","state":"closed","type":"folder"}]
+     */
+
+    private String absolutePath;
+    private List<ListBean> list;
+
+    public String getAbsolutePath() {
+        return absolutePath;
+    }
+
+    public void setAbsolutePath(String absolutePath) {
+        this.absolutePath = absolutePath;
+    }
+
+    public List<ListBean> getList() {
+        return list;
+    }
+
+    public void setList(List<ListBean> list) {
+        this.list = list;
+    }
+
+    public static class ListBean {
+        /**
+         * children : [{"children":[],"name":"Photos/Hummingbird.jpg","state":"open","type":"file"},{"children":[],"name":"Photos/Coast.jpg","state":"open","type":"file"},{"children":[],"name":"Photos/Nut.jpg","state":"open","type":"file"}]
+         * name : Photos
+         * state : closed
+         * type : folder
+         */
+        private String name;
+        private String state;
+        private String type;
+        private List<ChildrenBean> children;
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public String getState() {
+            return state;
+        }
+
+        public void setState(String state) {
+            this.state = state;
+        }
+
+        public String getType() {
+            return type;
+        }
+
+        public void setType(String type) {
+            this.type = type;
+        }
+
+        public List<ChildrenBean> getChildren() {
+            return children;
+        }
+
+        public void setChildren(List<ChildrenBean> children) {
+            this.children = children;
+        }
+
+        public class ChildrenBean {
+            /**
+             * children : []
+             * name : Photos/Hummingbird.jpg
+             * state : open
+             * type : file
+             */
+            @SerializedName("children")
+            private List<ChildrenBean> childrenBeen;
+            private String name;
+            private String state;
+            private String type;
+
+            public List<ChildrenBean> getChildrenBeen() {
+                return childrenBeen;
+            }
+
+            public void setChildrenBeen(List<ChildrenBean> childrenBeen) {
+                this.childrenBeen = childrenBeen;
+            }
+
+            public String getName() {
+                return name;
+            }
+
+            public void setName(String name) {
+                this.name = name;
+            }
+
+            public String getState() {
+                return state;
+            }
+
+            public void setState(String state) {
+                this.state = state;
+            }
+
+            public String getType() {
+                return type;
+            }
+
+            public void setType(String type) {
+                this.type = type;
+            }
+
+            @Override
+            public String toString() {
+                return "ChildrenBean{" +
+                        "childrenBeen=" + childrenBeen +
+                        ", name='" + name + '\'' +
+                        ", state='" + state + '\'' +
+                        ", type='" + type + '\'' +
+                        '}';
+            }
+        }
+    }
+}
diff --git a/webfile/src/main/java/com/bril/webfile/treeview/adapter/SimpleTreeListViewAdapter.java b/webfile/src/main/java/com/bril/webfile/treeview/adapter/SimpleTreeListViewAdapter.java
new file mode 100644
index 0000000..8494c64
--- /dev/null
+++ b/webfile/src/main/java/com/bril/webfile/treeview/adapter/SimpleTreeListViewAdapter.java
@@ -0,0 +1,62 @@
+package com.bril.webfile.treeview.adapter;
+
+import android.content.Context;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import com.bril.webfile.R;
+import com.bril.webfile.treeview.node.Node;
+
+import java.util.List;
+
+/**
+ * Created by Xinghx on 2018/6/25 0025.
+ */
+
+public class SimpleTreeListViewAdapter extends TreeViewAdapter {
+
+    public SimpleTreeListViewAdapter(ListView tree, Context context, List datas, int defaultLevel) throws IllegalAccessException {
+
+        super(tree, context, datas, defaultLevel);
+    }
+
+    @Override
+    public View getConvertView(Node node, int position, View convertView, ViewGroup parent) {
+        ViewHolder viewHolder = null;
+        if (convertView == null) {
+            convertView = mInflater.inflate(R.layout.list_item, parent, false);
+            viewHolder = new ViewHolder();
+            viewHolder.mIcon = convertView.findViewById(R.id.id_item_icon);
+            viewHolder.mText = convertView.findViewById(R.id.id_item_text);
+            convertView.setTag(viewHolder);
+        } else {
+            viewHolder = (ViewHolder) convertView.getTag();
+        }
+        if (node.getIcon() == -1) {
+            viewHolder.mIcon.setVisibility(View.INVISIBLE);
+        } else {
+            viewHolder.mIcon.setVisibility(View.VISIBLE);
+            viewHolder.mIcon.setImageResource(node.getIcon());
+        }
+        String name = node.getName();
+        int i = name.lastIndexOf("/");
+        String realName = name.substring(i + 1, name.length());
+        viewHolder.mText.setText(realName);
+//        if (i == -1) {
+//            viewHolder.mText.setText(name);
+//        } else {
+//
+//        }
+
+        return convertView;
+    }
+
+    public class ViewHolder{
+        ImageView mIcon;
+        TextView mText;
+
+    }
+}
diff --git a/webfile/src/main/java/com/bril/webfile/treeview/adapter/TreeViewAdapter.java b/webfile/src/main/java/com/bril/webfile/treeview/adapter/TreeViewAdapter.java
new file mode 100644
index 0000000..e687d32
--- /dev/null
+++ b/webfile/src/main/java/com/bril/webfile/treeview/adapter/TreeViewAdapter.java
@@ -0,0 +1,92 @@
+package com.bril.webfile.treeview.adapter;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
+import android.widget.ListView;
+
+import com.bril.webfile.treeview.helper.TreeHelper;
+import com.bril.webfile.treeview.node.Node;
+
+import java.util.List;
+
+/**
+ * Created by Xinghx on 2018/6/25 0025.
+ */
+
+public abstract class TreeViewAdapter<T> extends BaseAdapter{
+
+    private Context mContext;
+    private List<Node> mAllNodes;
+    private List<Node> mVisiableNodes;
+    protected LayoutInflater mInflater;
+    private ListView tree;
+    public interface OnTreeNodeClickListener{
+        void onClick(Node node,int position);
+    }
+
+    private OnTreeNodeClickListener mListener;
+
+    public void setOnNodeClickListener(OnTreeNodeClickListener mListener) {
+        this.mListener = mListener;
+    }
+
+    public TreeViewAdapter(ListView tree, Context context, List<T> datas, int defaultLevel) throws IllegalAccessException {
+        this.mContext = context;
+        mAllNodes = TreeHelper.getSortedNodes(datas, defaultLevel);
+        mVisiableNodes = TreeHelper.filterVisibleNodes(mAllNodes);
+        mInflater= LayoutInflater.from(context);
+        this.tree = tree;
+
+        tree.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+                expandOrCollapse(position);
+                if (mListener != null) {
+                    mListener.onClick(mVisiableNodes.get(position),position);
+                }
+            }
+        });
+    }
+
+    /**
+     * 点击收缩或者展开
+     * @param position
+     */
+    private void expandOrCollapse(int position) {
+        Node n = mVisiableNodes.get(position);
+        if (n.isFile()) return;
+        n.setExpand(!n.isExpand());
+        mVisiableNodes = TreeHelper.filterVisibleNodes(mAllNodes);
+        notifyDataSetChanged();
+    }
+
+    @Override
+    public int getCount() {
+        return mVisiableNodes.size();
+    }
+
+    @Override
+    public Object getItem(int position) {
+        return mVisiableNodes.get(position);
+    }
+
+    @Override
+    public long getItemId(int position) {
+        return position;
+    }
+
+    @Override
+    public View getView(int position, View convertView, ViewGroup parent) {
+        Node node = mVisiableNodes.get(position);
+        convertView = getConvertView(node, position, convertView, parent);
+        // 设置内边距
+        convertView.setPadding(node.getLevel() * 50 ,3 , 3 ,3);
+        return convertView;
+    }
+
+    public abstract View getConvertView(Node node,int position, View convertView, ViewGroup parent);
+}
diff --git a/webfile/src/main/java/com/bril/webfile/treeview/annotation/NodeName.java b/webfile/src/main/java/com/bril/webfile/treeview/annotation/NodeName.java
new file mode 100644
index 0000000..c708478
--- /dev/null
+++ b/webfile/src/main/java/com/bril/webfile/treeview/annotation/NodeName.java
@@ -0,0 +1,16 @@
+package com.bril.webfile.treeview.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by Xinghx on 2018/6/25 0025.
+ */
+
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface NodeName {
+
+}
diff --git a/webfile/src/main/java/com/bril/webfile/treeview/annotation/NodePID.java b/webfile/src/main/java/com/bril/webfile/treeview/annotation/NodePID.java
new file mode 100644
index 0000000..88cc0c2
--- /dev/null
+++ b/webfile/src/main/java/com/bril/webfile/treeview/annotation/NodePID.java
@@ -0,0 +1,15 @@
+package com.bril.webfile.treeview.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by Xinghx on 2018/6/25 0025.
+ */
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface NodePID {
+
+}
diff --git a/webfile/src/main/java/com/bril/webfile/treeview/annotation/NodeType.java b/webfile/src/main/java/com/bril/webfile/treeview/annotation/NodeType.java
new file mode 100644
index 0000000..f29ebab
--- /dev/null
+++ b/webfile/src/main/java/com/bril/webfile/treeview/annotation/NodeType.java
@@ -0,0 +1,16 @@
+package com.bril.webfile.treeview.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by Xinghx on 2018/6/25 0025.
+ */
+
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface NodeType {
+
+}
diff --git a/webfile/src/main/java/com/bril/webfile/treeview/helper/TreeHelper.java b/webfile/src/main/java/com/bril/webfile/treeview/helper/TreeHelper.java
new file mode 100644
index 0000000..b3a9db7
--- /dev/null
+++ b/webfile/src/main/java/com/bril/webfile/treeview/helper/TreeHelper.java
@@ -0,0 +1,188 @@
+package com.bril.webfile.treeview.helper;
+
+import android.util.Log;
+
+import com.bril.webfile.R;
+import com.bril.webfile.treeview.annotation.NodeName;
+import com.bril.webfile.treeview.annotation.NodeType;
+import com.bril.webfile.treeview.node.Node;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Xinghx on 2018/6/25 0025.
+ */
+
+public class TreeHelper {
+    private static final String TAG = "TreeHelper";
+    /**
+     * 把用户提供的数据 转为NODE
+     *
+     * @param <T>
+     * @return
+     */
+    public static <T> List<Node> convertData2Nodes(List<T> datas) throws IllegalAccessException {
+        List<Node> nodes = new ArrayList<>();
+        Node node = null;
+
+        for (T t : datas) {
+            String type = "folder";
+            String name = "";
+
+            Class clazz = t.getClass();
+            Field[] fields = clazz.getDeclaredFields();
+            for (Field field : fields) {
+                if (field.getAnnotation(NodeType.class) != null) {
+                    field.setAccessible(true);
+                    type = (String) field.get(t);
+                }
+                if (field.getAnnotation(NodeName.class) != null) {
+                    field.setAccessible(true);
+                    name = (String) field.get(t);
+                }
+            }
+
+            node = new Node(name, type);
+            nodes.add(node);
+        }
+
+        // 设置node间节点关系
+        for (int i = 0; i < nodes.size(); i++) {
+            Node n = nodes.get(i);
+            for (int j = i + 1; j < nodes.size(); j++) {
+                Node m = nodes.get(j);
+                Log.d(TAG, "" + m.getName() + "  " + n.getName());
+                String aaa = m.getName();
+                String bbb = n.getName();
+                if (aaa.lastIndexOf("/") != -1) {
+                    aaa = aaa.substring(0, aaa.lastIndexOf("/"));
+                }
+
+                if (aaa.equals(n.getName()) && n.isFolder()) {
+                    Log.d(TAG, "convertData2Nodes: " + m.getName() + " " + n.getName());
+                    n.getChildren().add(m);
+                    m.setParent(n);
+                } else if (n.getName().equals(aaa) && m.isFolder()) {
+                    Log.d(TAG, "convertData2Nodes else : " + m.getName() + " " + n.getName());
+                    m.getChildren().add(n);
+                    n.setParent(m);
+                }
+            }
+        }
+
+        for (Node n : nodes) {
+            setNodeIcons(n);
+        }
+
+
+        //方法2
+//        for (int i = 0; i < datas.size(); i++) {
+//            Node n = nodes.get(i);
+//            for (int j = i + 1; j < nodes.size(); j++) {
+//                Node m = nodes.get(j);
+//                if (m.getpId() instanceof String) {
+//                    if (m.getpId().equals(n.getId())) {
+//                        n.getChildren().add(m);
+//                        m.setParent(n);
+//                    } else if (m.getId().equals(n.getpId())) {
+//                        m.getChildren().add(n);
+//                        n.setParent(m);
+//                    }
+//                } else {
+//                    if (m.getpId() == n.getId()) {
+//                        n.getChildren().add(m);
+//                        m.setParent(n);
+//                    } else if (m.getId() == n.getpId()) {
+//                        m.getChildren().add(n);
+//                        n.setParent(m);
+//                    }
+//                }
+//            }
+        return nodes;
+    }
+
+    /**
+     * 为node设置图标
+     *
+     * @param n
+     */
+    public static void setNodeIcons(Node n) {
+        if (n.getChildren().size() > 0 && n.isExpand() && n.isFolder()) {
+            n.setIcon(R.drawable.tree_ex);
+
+        } else if (n.getChildren().size() > 0 && !n.isExpand() && n.isFolder()) {
+            n.setIcon(R.drawable.tree_ec);
+        } else {
+            n.setIcon(-1);
+        }
+    }
+
+    public static <T> List<Node> getSortedNodes(List<T> datas,int defaultExpandLevel) throws IllegalAccessException {
+        List<Node> result = new ArrayList<>();
+        List<Node> nodes = convertData2Nodes(datas);
+
+        List<Node> rootNodes = getRootNodes(nodes);
+
+        for (Node node : rootNodes) {
+            addNode(result, node, defaultExpandLevel, 1);
+        }
+
+        Log.e("TAG", result.size() + "");
+        return result;
+
+    }
+
+
+    /**
+     * 从所有节点中过滤出根节点
+     *
+     * @param nodes
+     * @return
+     */
+    private static List<Node> getRootNodes(List<Node> nodes) {
+        List<Node> root = new ArrayList<Node>();
+        for (Node node : nodes) {
+            if (node.isRoot()) {
+                root.add(node);
+            }
+        }
+        return root;
+    }
+
+    private static void addNode(List<Node> result, Node node,
+                                int defaultExpandLevel, int currentLevel) {
+        result.add(node);
+        if (defaultExpandLevel >= currentLevel) {
+            node.setExpand(true);
+        }
+        if (node.isFile())
+            return;
+
+        for (int i = 0; i < node.getChildren().size(); i++) {
+            addNode(result, node.getChildren().get(i), defaultExpandLevel,
+                    currentLevel + 1);
+        }
+
+    }
+
+
+    /**
+     * 过滤出可见的节点
+     *
+     * @param nodes
+     * @return
+     */
+    public static List<Node> filterVisibleNodes(List<Node> nodes) {
+        List<Node> result = new ArrayList<Node>();
+
+        for (Node node : nodes) {
+            if (node.isRoot() || node.isParentExpand()) {
+                setNodeIcons(node);
+                result.add(node);
+            }
+        }
+        return result;
+    }
+}
diff --git a/webfile/src/main/java/com/bril/webfile/treeview/node/Node.java b/webfile/src/main/java/com/bril/webfile/treeview/node/Node.java
new file mode 100644
index 0000000..3103f64
--- /dev/null
+++ b/webfile/src/main/java/com/bril/webfile/treeview/node/Node.java
@@ -0,0 +1,154 @@
+package com.bril.webfile.treeview.node;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Xinghx on 2018/6/25 0025.
+ */
+
+public class Node {
+
+    private String id;
+    private String pId = "0";
+    private String name; // 文件的名字
+    private String type = "folder"; // 属于文件还是文件夹
+
+    private int level; // 树的深度
+
+    private boolean isExpand; // 是否展开
+    private int icon;
+    private Node parent;
+    private List<Node> children = new ArrayList<>();
+
+    public Node() {
+    }
+
+    public Node(String pId, String name, String type) {
+        this.pId = pId;
+        this.name = name;
+        this.type = type;
+    }
+
+    public Node(String name, String type) {
+        this.name = name;
+        this.type = type;
+    }
+
+    /**
+     * 是否是根节点
+     * @return
+     */
+    public boolean isRoot() {
+        return parent == null;
+    }
+
+
+    public boolean isParentExpand() {
+        if (parent == null) return false;
+
+        return parent.isExpand();
+    }
+
+    /**
+     * 是否是文件夹
+     * @return
+     */
+    public boolean isFolder() {
+        return "folder".equals(getType());
+    }
+
+    public boolean isFile() {
+        return "file".equals(getType());
+    }
+
+    /**
+     * 是否是叶子节点
+     * @return
+     */
+    public boolean isLeaf() {
+        return children.size() == 0;
+    }
+
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getpId() {
+        return pId;
+    }
+
+    public void setpId(String pId) {
+        this.pId = pId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    /**
+     * 得到当前节点的层级
+     * @return
+     */
+    public int getLevel() {
+        return parent == null ? 0 : parent.getLevel() + 1;
+    }
+
+    public void setLevel(int level) {
+        this.level = level;
+    }
+
+    public boolean isExpand() {
+        return isExpand;
+    }
+
+    public void setExpand(boolean expand) {
+        isExpand = expand;
+        if (!isExpand) {
+            for (Node node : children) {
+                node.setExpand(false);
+            }
+        }
+    }
+
+    public int getIcon() {
+        return icon;
+    }
+
+    public void setIcon(int icon) {
+        this.icon = icon;
+    }
+
+    public Node getParent() {
+        return parent;
+    }
+
+    public void setParent(Node parent) {
+        this.parent = parent;
+    }
+
+    public List<Node> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<Node> children) {
+        this.children = children;
+    }
+}
diff --git a/webfile/src/main/res/drawable-mdpi/tree_ec.png b/webfile/src/main/res/drawable-mdpi/tree_ec.png
new file mode 100644
index 0000000000000000000000000000000000000000..5d6bfe9b7850be3eacfc9eb574024ede698f61c8
GIT binary patch
literal 2858
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
IM6N<$g67(47ytkO

literal 0
HcmV?d00001

diff --git a/webfile/src/main/res/drawable-mdpi/tree_ex.png b/webfile/src/main/res/drawable-mdpi/tree_ex.png
new file mode 100644
index 0000000000000000000000000000000000000000..bdb9352cc91f79f985aaed7e65c190709928bf3b
GIT binary patch
literal 2848
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

literal 0
HcmV?d00001

diff --git a/webfile/src/main/res/layout/list_item.xml b/webfile/src/main/res/layout/list_item.xml
new file mode 100644
index 0000000..fcb963b
--- /dev/null
+++ b/webfile/src/main/res/layout/list_item.xml
@@ -0,0 +1,25 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:minHeight="40dp" >
+
+    <ImageView
+        android:id="@+id/id_item_icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerVertical="true"
+        android:layout_marginLeft="5dp"
+        android:layout_marginRight="5dp"
+        android:src="@drawable/tree_ec" />
+
+    <TextView
+        android:layout_centerVertical="true"
+        android:id="@+id/id_item_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_toRightOf="@id/id_item_icon"
+        android:text=""
+        android:textSize="18sp" />
+
+</RelativeLayout>
\ No newline at end of file
-- 
2.21.0