liupeng 5 vuotta sitten
commit
11c38dee5b
100 muutettua tiedostoa jossa 11482 lisäystä ja 0 poistoa
  1. 8 0
      .gitignore
  2. BIN
      .idea/caches/build_file_checksums.ser
  3. 113 0
      .idea/codeStyles/Project.xml
  4. 19 0
      .idea/gradle.xml
  5. 6 0
      .idea/kotlinc.xml
  6. 48 0
      .idea/misc.xml
  7. 9 0
      .idea/modules.xml
  8. 12 0
      .idea/runConfigurations.xml
  9. 6 0
      .idea/vcs.xml
  10. 1 0
      app/.gitignore
  11. 64 0
      app/build.gradle
  12. 1 0
      app/debug/output.json
  13. BIN
      app/libs/AMap.jar
  14. BIN
      app/libs/pinyin4j-2.5.0.jar
  15. 17 0
      app/proguard-rules.pro
  16. 13 0
      app/src/androidTest/java/com/zhilin/patrol/ApplicationTest.java
  17. 136 0
      app/src/main/AndroidManifest.xml
  18. 92 0
      app/src/main/java/com/fuyin/adapter/ImagePreviewAdapter.java
  19. 60 0
      app/src/main/java/com/fuyin/base/BaseAdapter.java
  20. 29 0
      app/src/main/java/com/fuyin/base/BaseHelper.java
  21. 43 0
      app/src/main/java/com/fuyin/base/BaseHolder.java
  22. 12 0
      app/src/main/java/com/fuyin/constans/P.java
  23. 9 0
      app/src/main/java/com/fuyin/interfaces/OnItemPictureClickListener.java
  24. 173 0
      app/src/main/java/com/fuyin/ui/ImagePreviewActivity.java
  25. 13 0
      app/src/main/java/com/fuyin/utils/Name.java
  26. 43 0
      app/src/main/java/com/fuyin/utils/Utils.java
  27. 49 0
      app/src/main/java/com/fuyin/views/CustomViewPager.java
  28. 258 0
      app/src/main/java/com/fuyin/views/NineGridLayout.java
  29. 54 0
      app/src/main/java/com/fuyin/views/NineGridTestLayout.java
  30. 86 0
      app/src/main/java/com/fuyin/views/RatioImageView.java
  31. 52 0
      app/src/main/java/com/zhilin/patrol/adapter/FragmentAdapter.java
  32. 177 0
      app/src/main/java/com/zhilin/patrol/adapter/QuestionImgAdapter.java
  33. 190 0
      app/src/main/java/com/zhilin/patrol/adapter/UpImageAdapter.java
  34. 194 0
      app/src/main/java/com/zhilin/patrol/adapter/UpImageAdapterRectify.java
  35. 39 0
      app/src/main/java/com/zhilin/patrol/adapter/helper/GridItemDecoration.java
  36. 121 0
      app/src/main/java/com/zhilin/patrol/adapter/helper/MyItemTouchCallback.java
  37. 61 0
      app/src/main/java/com/zhilin/patrol/adapter/helper/OnRecyclerItemClickListener.java
  38. 36 0
      app/src/main/java/com/zhilin/patrol/app/PatrolApp.java
  39. 55 0
      app/src/main/java/com/zhilin/patrol/bean/AddressAreaEntity.java
  40. 42 0
      app/src/main/java/com/zhilin/patrol/bean/BaseEntity.java
  41. 38 0
      app/src/main/java/com/zhilin/patrol/bean/FinishTaskEntity.java
  42. 208 0
      app/src/main/java/com/zhilin/patrol/bean/HomeEntity.java
  43. 148 0
      app/src/main/java/com/zhilin/patrol/bean/ImageInfo.java
  44. 88 0
      app/src/main/java/com/zhilin/patrol/bean/LoginEntity.java
  45. 88 0
      app/src/main/java/com/zhilin/patrol/bean/LoginEntityNull.java
  46. 142 0
      app/src/main/java/com/zhilin/patrol/bean/MapLocationInfo.java
  47. 120 0
      app/src/main/java/com/zhilin/patrol/bean/MyTaskEntity.java
  48. 37 0
      app/src/main/java/com/zhilin/patrol/bean/PatrolFormEntity.java
  49. 38 0
      app/src/main/java/com/zhilin/patrol/bean/PatrolFormEntityNull.java
  50. 145 0
      app/src/main/java/com/zhilin/patrol/bean/PatrolRecordEntity.java
  51. 37 0
      app/src/main/java/com/zhilin/patrol/bean/PatrolRecordNumEntity.java
  52. 93 0
      app/src/main/java/com/zhilin/patrol/bean/QuestionKindEntity.java
  53. 49 0
      app/src/main/java/com/zhilin/patrol/bean/ReconsiderActivityEntity.java
  54. 18 0
      app/src/main/java/com/zhilin/patrol/bean/RectifyFormEntity.java
  55. 68 0
      app/src/main/java/com/zhilin/patrol/bean/RectifyTaskEntity.java
  56. 69 0
      app/src/main/java/com/zhilin/patrol/bean/RectifyTaskImgEntity.java
  57. 50 0
      app/src/main/java/com/zhilin/patrol/bean/RectifyUploadEntity.java
  58. 94 0
      app/src/main/java/com/zhilin/patrol/bean/TaskTypeEntity.java
  59. 47 0
      app/src/main/java/com/zhilin/patrol/http/HttpUrl.java
  60. 106 0
      app/src/main/java/com/zhilin/patrol/tool/CheckPermissionUtils.java
  61. 395 0
      app/src/main/java/com/zhilin/patrol/tool/Compresser.java
  62. 46 0
      app/src/main/java/com/zhilin/patrol/tool/DensityUtil.java
  63. 52 0
      app/src/main/java/com/zhilin/patrol/tool/DialogUtil.java
  64. 401 0
      app/src/main/java/com/zhilin/patrol/tool/EncryptUtil.java
  65. 128 0
      app/src/main/java/com/zhilin/patrol/tool/IpUtils.java
  66. 88 0
      app/src/main/java/com/zhilin/patrol/tool/JsonUtils.java
  67. 263 0
      app/src/main/java/com/zhilin/patrol/tool/LocationUtils.java
  68. 206 0
      app/src/main/java/com/zhilin/patrol/tool/SPUtil.java
  69. 78 0
      app/src/main/java/com/zhilin/patrol/tool/Utils.java
  70. 140 0
      app/src/main/java/com/zhilin/patrol/ui/activity/AddressSelectActivity.java
  71. 214 0
      app/src/main/java/com/zhilin/patrol/ui/activity/BaseActivity.java
  72. 276 0
      app/src/main/java/com/zhilin/patrol/ui/activity/LoginActivity.java
  73. 294 0
      app/src/main/java/com/zhilin/patrol/ui/activity/MainActivity.java
  74. 263 0
      app/src/main/java/com/zhilin/patrol/ui/activity/MapActivity.java
  75. 220 0
      app/src/main/java/com/zhilin/patrol/ui/activity/MyTaskActivity.java
  76. 201 0
      app/src/main/java/com/zhilin/patrol/ui/activity/MyTaskTypeActivity.java
  77. 257 0
      app/src/main/java/com/zhilin/patrol/ui/activity/PatrolRecordActivity.java
  78. 1116 0
      app/src/main/java/com/zhilin/patrol/ui/activity/PatrolUploadActivity.java
  79. 185 0
      app/src/main/java/com/zhilin/patrol/ui/activity/QuestionTypeActivity.java
  80. 108 0
      app/src/main/java/com/zhilin/patrol/ui/activity/QuestionTypeSelectActivity.java
  81. 732 0
      app/src/main/java/com/zhilin/patrol/ui/activity/RecifyUploadActivity.java
  82. 201 0
      app/src/main/java/com/zhilin/patrol/ui/activity/ReconsiderActivity.java
  83. 121 0
      app/src/main/java/com/zhilin/patrol/ui/activity/RectifyMainActivity.java
  84. 319 0
      app/src/main/java/com/zhilin/patrol/ui/activity/RectifyTaskActivity.java
  85. 520 0
      app/src/main/java/com/zhilin/patrol/ui/activity/TaskTypeActivity.java
  86. 260 0
      app/src/main/java/com/zhilin/patrol/ui/fragment/PatrolRecordFragment.java
  87. 69 0
      app/src/main/java/com/zhilin/patrol/ui/sort/PinyinUtils.java
  88. 180 0
      app/src/main/java/com/zhilin/patrol/views/AlertDialog.java
  89. 41 0
      app/src/main/java/com/zhilin/patrol/views/CustomProgressDialog.java
  90. BIN
      app/src/main/jniLibs/armeabi/libAMapSDK_MAP_v6_3_0.so
  91. BIN
      app/src/main/jniLibs/armeabi/libAMapSDK_NAVI_v6_1_0.so
  92. BIN
      app/src/main/jniLibs/armeabi/librtbt828.so
  93. BIN
      app/src/main/jniLibs/armeabi/libwtbt828.so
  94. BIN
      app/src/main/jniLibs/armeabi/libztcodec2.so
  95. 19 0
      app/src/main/res/anim/activity_zoom_close.xml
  96. 19 0
      app/src/main/res/anim/activity_zoom_open.xml
  97. 18 0
      app/src/main/res/anim/scale_in_center.xml
  98. 18 0
      app/src/main/res/anim/scale_out_center.xml
  99. 5 0
      app/src/main/res/anim/slide_in_right.xml
  100. 5 0
      app/src/main/res/anim/slide_out_right.xml

+ 8 - 0
.gitignore

xqd
@@ -0,0 +1,8 @@
+*.iml
+.gradle
+/local.properties
+/.idea/workspace.xml
+/.idea/libraries
+.DS_Store
+/build
+/captures

BIN
.idea/caches/build_file_checksums.ser


+ 113 - 0
.idea/codeStyles/Project.xml

xqd
@@ -0,0 +1,113 @@
+<component name="ProjectCodeStyleConfiguration">
+  <code_scheme name="Project" version="173">
+    <codeStyleSettings language="XML">
+      <arrangement>
+        <rules>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>xmlns:android</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>xmlns:.*</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>BY_NAME</order>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*:id</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*:name</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>name</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>style</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>BY_NAME</order>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>ANDROID_ATTRIBUTE_ORDER</order>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>.*</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>BY_NAME</order>
+            </rule>
+          </section>
+        </rules>
+      </arrangement>
+    </codeStyleSettings>
+  </code_scheme>
+</component>

+ 19 - 0
.idea/gradle.xml

xqd
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="GradleSettings">
+    <option name="linkedExternalProjectsSettings">
+      <GradleProjectSettings>
+        <option name="distributionType" value="DEFAULT_WRAPPED" />
+        <option name="externalProjectPath" value="$PROJECT_DIR$" />
+        <option name="modules">
+          <set>
+            <option value="$PROJECT_DIR$" />
+            <option value="$PROJECT_DIR$/app" />
+          </set>
+        </option>
+        <option name="resolveModulePerSourceSet" value="false" />
+        <option name="testRunner" value="PLATFORM" />
+      </GradleProjectSettings>
+    </option>
+  </component>
+</project>

+ 6 - 0
.idea/kotlinc.xml

xqd
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Kotlin2JsCompilerArguments">
+    <option name="sourceMapEmbedSources" />
+  </component>
+</project>

+ 48 - 0
.idea/misc.xml

xqd
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="NullableNotNullManager">
+    <option name="myDefaultNullable" value="android.support.annotation.Nullable" />
+    <option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
+    <option name="myNullables">
+      <value>
+        <list size="12">
+          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
+          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
+          <item index="2" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
+          <item index="3" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
+          <item index="4" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
+          <item index="5" class="java.lang.String" itemvalue="androidx.annotation.Nullable" />
+          <item index="6" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNullable" />
+          <item index="7" class="java.lang.String" itemvalue="android.annotation.Nullable" />
+          <item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.Nullable" />
+          <item index="9" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableDecl" />
+          <item index="10" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableType" />
+          <item index="11" class="java.lang.String" itemvalue="com.android.annotations.Nullable" />
+        </list>
+      </value>
+    </option>
+    <option name="myNotNulls">
+      <value>
+        <list size="11">
+          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
+          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
+          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
+          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
+          <item index="4" class="java.lang.String" itemvalue="androidx.annotation.NonNull" />
+          <item index="5" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNonNull" />
+          <item index="6" class="java.lang.String" itemvalue="android.annotation.NonNull" />
+          <item index="7" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.NonNull" />
+          <item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullDecl" />
+          <item index="9" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullType" />
+          <item index="10" class="java.lang.String" itemvalue="com.android.annotations.NonNull" />
+        </list>
+      </value>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/build/classes" />
+  </component>
+  <component name="ProjectType">
+    <option name="id" value="Android" />
+  </component>
+</project>

+ 9 - 0
.idea/modules.xml

xqd
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/Patrol.iml" filepath="$PROJECT_DIR$/Patrol.iml" />
+      <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
+    </modules>
+  </component>
+</project>

+ 12 - 0
.idea/runConfigurations.xml

xqd
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RunConfigurationProducerService">
+    <option name="ignoredProducers">
+      <set>
+        <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
+        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
+        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
+      </set>
+    </option>
+  </component>
+</project>

+ 6 - 0
.idea/vcs.xml

xqd
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="" />
+  </component>
+</project>

+ 1 - 0
app/.gitignore

xqd
@@ -0,0 +1 @@
+/build

+ 64 - 0
app/build.gradle

xqd
@@ -0,0 +1,64 @@
+apply plugin: 'com.android.application'
+
+android {
+    compileSdkVersion 27
+    buildToolsVersion '27.0.3'
+
+    defaultConfig {
+        applicationId "com.zhilin.patrol"
+        minSdkVersion 16
+        targetSdkVersion 26
+        versionCode 5
+        versionName "1.0.5"
+    }
+    signingConfigs {
+        debug {
+            storeFile file('../xuncha.jks')
+            storePassword 'xuncha2018'
+            keyAlias 'xuncha'
+            keyPassword 'xuncha2018'
+        }
+    }
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+        debug {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+    }
+
+    sourceSets {
+        main {
+            jniLibs.srcDirs = ['libs','src/main/jniLibs']
+        }
+    }
+}
+
+dependencies {
+    implementation fileTree(include: ['*.jar'], dir: 'libs')
+    testImplementation 'junit:junit:4.12'
+    implementation 'com.android.support:support-v4:27.1.1'
+    implementation 'com.android.support:appcompat-v7:27.1.1'
+    implementation 'com.android.support:design:27.1.1'
+    implementation 'com.android.support:cardview-v7:27.1.1'
+    implementation 'com.android.support:recyclerview-v7:27.1.1'
+    implementation 'com.jakewharton:butterknife:8.8.1'
+    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
+    implementation 'com.github.bumptech.glide:glide:4.1.1'
+    implementation 'com.zhy:base-rvadapter:3.0.3'
+    implementation 'com.yqritc:recyclerview-flexibledivider:1.4.0'
+    implementation 'com.github.chrisbanes:PhotoView:2.0.0'
+    implementation 'com.squareup.picasso:picasso:2.5.2'
+    implementation 'com.zhy:okhttputils:2.6.2'
+    implementation 'com.google.code.gson:gson:2.8.4'
+    implementation 'com.github.ybq:Android-SpinKit:1.0.4'
+    implementation 'com.cjj.materialrefeshlayout:library:1.3.0'
+    implementation 'q.rorbin:badgeview:1.1.3'
+    implementation 'me.drakeet.multitype:multitype:2.2.2'
+    implementation files('libs/AMap.jar')
+    implementation files('libs/pinyin4j-2.5.0.jar')
+    implementation 'com.squareup.okhttp3:okhttp:3.10.0'
+}

+ 1 - 0
app/debug/output.json

xqd
@@ -0,0 +1 @@
+[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-debug.apk","fullName":"debug","baseName":"debug"},"path":"app-debug.apk","properties":{}}]

BIN
app/libs/AMap.jar


BIN
app/libs/pinyin4j-2.5.0.jar


+ 17 - 0
app/proguard-rules.pro

xqd
@@ -0,0 +1,17 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in C:\Android\sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}

+ 13 - 0
app/src/androidTest/java/com/zhilin/patrol/ApplicationTest.java

xqd
@@ -0,0 +1,13 @@
+package com.zhilin.patrol;
+
+import android.app.Application;
+import android.test.ApplicationTestCase;
+
+/**
+ * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
+ */
+public class ApplicationTest extends ApplicationTestCase<Application> {
+    public ApplicationTest() {
+        super(Application.class);
+    }
+}

+ 136 - 0
app/src/main/AndroidManifest.xml

xqd
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.zhilin.patrol">
+
+
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+    <!--允许程序读写手机状态和身份-->   <!--允许程序打开网络套接字-->
+    <uses-permission android:name="android.permission.INTERNET" />
+    <!--允许程序设置内置sd卡的写权限-->
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <!--允许程序获取网络状态-->
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+    <!--允许程序访问CellID或WiFi热点来获取粗略的位置-->
+    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
+
+    <uses-permission android:name="android.permission.CAMERA" />
+
+    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
+    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
+    <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
+    <uses-permission android:name="android.permission.INTERNET" />
+
+    <!--用于进行网络定位-->
+    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
+    <!--用于访问GPS定位-->
+    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
+    <!--获取运营商信息,用于支持提供运营商信息相关的接口-->
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
+    <!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
+    <!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
+    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
+    <!--用于访问网络,网络定位需要上网-->
+    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
+    <!--用于读取手机当前的状态-->
+    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
+    <!--写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据-->
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
+    <!--用于申请调用A-GPS模块-->
+    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
+    <!--用于申请获取蓝牙信息进行室内定位-->
+    <uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
+    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>
+
+    <!-- 高德导航需要的权限 -->
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+    <uses-permission android:name="android.permission.WAKE_LOCK" />
+
+    <application
+        android:name=".app.PatrolApp"
+        android:allowBackup="true"
+        android:icon="@mipmap/ic_app"
+        android:label="@string/app_name"
+        android:supportsRtl="true"
+        android:theme="@style/AppTheme"
+        android:usesCleartextTraffic="true">
+
+        <uses-library
+            android:name="org.apache.http.legacy"
+            android:required="false" />
+
+        <meta-data
+            android:name="com.amap.api.v2.apikey"
+            android:value="18afa1ca57c1d46804a651dcc5b917ae" />
+
+        <service android:name="com.amap.api.location.APSService" />
+
+
+        <activity
+            android:name=".ui.activity.MainActivity"
+            android:screenOrientation="portrait"></activity>
+        <activity
+            android:name=".ui.activity.PatrolUploadActivity"
+            android:screenOrientation="portrait"></activity>
+        <activity
+            android:name=".ui.activity.PatrolRecordActivity"
+            android:screenOrientation="portrait"></activity>
+        <activity
+            android:name="com.fuyin.ui.ImagePreviewActivity"
+            android:screenOrientation="portrait"></activity>
+        <activity
+            android:name=".ui.activity.QuestionTypeActivity"
+            android:screenOrientation="portrait"></activity>
+        <activity
+            android:name=".ui.activity.MyTaskActivity"
+            android:screenOrientation="portrait"></activity>
+        <activity
+            android:name=".ui.activity.MapActivity"
+            android:screenOrientation="portrait"></activity>
+        <activity
+            android:name=".ui.activity.QuestionTypeSelectActivity"
+            android:screenOrientation="portrait"></activity>
+        <activity
+            android:name=".ui.activity.AddressSelectActivity"
+            android:screenOrientation="portrait"></activity>
+        <activity
+            android:name=".ui.activity.MyTaskTypeActivity"
+            android:screenOrientation="portrait"></activity>
+        <activity
+            android:name=".ui.activity.TaskTypeActivity"
+            android:screenOrientation="portrait"></activity>
+        <activity
+            android:name=".ui.activity.RecifyUploadActivity"
+            android:screenOrientation="portrait"></activity>
+        <activity
+            android:name=".ui.activity.RectifyTaskActivity"
+            android:screenOrientation="portrait"></activity>
+        <activity android:name=".ui.activity.RectifyMainActivity"
+            android:screenOrientation="portrait"></activity>
+        <activity android:name=".ui.activity.ReconsiderActivity"
+            android:screenOrientation="portrait"></activity>
+
+        <activity
+            android:name="com.amap.api.navi.AmapRouteActivity"
+            android:configChanges="orientation|keyboardHidden|screenSize"
+            android:theme="@android:style/Theme.NoTitleBar" />
+
+        <activity
+            android:name=".ui.activity.LoginActivity"
+            android:screenOrientation="portrait">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>

+ 92 - 0
app/src/main/java/com/fuyin/adapter/ImagePreviewAdapter.java

xqd
@@ -0,0 +1,92 @@
+package com.fuyin.adapter;
+
+import android.app.Activity;
+import android.content.Context;
+import android.net.Uri;
+import android.support.v4.view.PagerAdapter;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+import com.fuyin.utils.Utils;
+import com.github.chrisbanes.photoview.PhotoView;
+import com.squareup.picasso.Picasso;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * @Description:
+ * @Author: Liangchaojie
+ * @Create On 2018/3/30 10:33
+ */
+public class ImagePreviewAdapter extends PagerAdapter {
+    private Context context;
+    private List<String> imageList;
+    private int itemPosition;
+    private PhotoView photoView;
+    public ImagePreviewAdapter(Context context, List<String> imageList, int itemPosition) {
+        this.context = context;
+        this.imageList = imageList;
+        this.itemPosition = itemPosition;
+    }
+
+    @Override
+    public int getCount() {
+        return imageList==null?0:imageList.size();
+    }
+
+    @Override
+    public boolean isViewFromObject(View view, Object object) {
+        return view==object;
+    }
+
+    @Override
+    public Object instantiateItem(ViewGroup container, final int position) {
+        final PhotoView image = new PhotoView(context);
+        image.setEnabled(true);
+        image.setScaleType(ImageView.ScaleType.FIT_CENTER);
+        image.setMaximumScale(2.0F);
+        image.setMinimumScale(0.8F);
+
+        String path = imageList.get(position);
+        final Uri uri;
+        if (path.startsWith("http")) {
+            uri = Uri.parse(path);
+        } else {
+            uri = Uri.fromFile(new File(path));
+        }
+        Picasso.with(context).load(uri).into(image);
+
+
+       image.setOnClickListener(new View.OnClickListener() {
+           @Override
+           public void onClick(View v) {
+               image.setEnabled(false);
+               ((Activity)context).onBackPressed();
+           }
+       });
+        container.addView(image);
+        return image;
+    }
+
+    @Override
+    public void setPrimaryItem(ViewGroup container, int position, Object object) {
+        super.setPrimaryItem(container, position, object);
+        photoView = (PhotoView) object;
+        photoView.setTag(Utils.getNameByPosition(itemPosition,position));
+        photoView.setTransitionName(Utils.getNameByPosition(itemPosition,position));
+    }
+
+
+    @Override
+    public void destroyItem(ViewGroup container, int position, Object object) {
+        container.removeView((View) object);
+    }
+
+
+    public PhotoView getPhotoView() {
+        return photoView;
+    }
+
+}

+ 60 - 0
app/src/main/java/com/fuyin/base/BaseAdapter.java

xqd
@@ -0,0 +1,60 @@
+package com.fuyin.base;
+
+import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.view.ViewGroup;
+
+import java.util.List;
+
+/**
+ * Description
+ * Created by Administrator
+ * Time 2018/1/4  23:01
+ */
+
+public abstract class BaseAdapter<T> extends RecyclerView.Adapter<BaseHolder> {
+    private Context context;
+    private List<T> list;
+
+    public BaseAdapter(Context context, List<T> list) {
+        this.context = context;
+        this.list = list;
+    }
+
+    @Override
+    public BaseHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        BaseHolder holder = createBaseHolder(parent, viewType);
+        holder.setAdapter(this);
+        return holder;
+    }
+
+    @Override
+    public void onBindViewHolder(BaseHolder holder, int position) {
+        holder.bindViewHolder(list.get(position),position,null);
+    }
+
+
+    @Override
+    public void onBindViewHolder(BaseHolder holder, int position, List<Object> payloads) {
+        if(payloads==null||payloads.size()==0){
+            onBindViewHolder(holder,position);
+        }else {
+            holder.bindViewHolder(list.get(position), position, payloads);
+        }
+    }
+
+    @Override
+    public int getItemCount() {
+        return list==null?0:list.size();
+    }
+
+    @Override
+    public int getItemViewType(int position) {
+        return getHolderType(position);
+    }
+
+
+    public abstract int getHolderType(int position);
+    public abstract BaseHolder createBaseHolder(ViewGroup parent, int viewType);
+
+}

+ 29 - 0
app/src/main/java/com/fuyin/base/BaseHelper.java

xqd
@@ -0,0 +1,29 @@
+package com.fuyin.base;
+
+import android.content.Context;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+
+/**
+ * Description
+ * Created by Administrator
+ * Time 2018/1/4  23:32
+ */
+
+public class BaseHelper {
+    private static void setLinearLayoutManager(Context context, RecyclerView recyclerView, RecyclerView.Adapter adapter,int direction){
+        if(context==null||recyclerView==null||adapter==null){
+            throw new IllegalArgumentException("setLinearLayoutManagerVertical has null params!");
+        }
+        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
+        linearLayoutManager.setOrientation(direction);
+        recyclerView.setLayoutManager(linearLayoutManager);
+        recyclerView.setAdapter(adapter);
+    }
+    public static void setLinearLayoutManagerVertical(Context context, RecyclerView recyclerView, RecyclerView.Adapter adapter){
+        setLinearLayoutManager(context,recyclerView,adapter,LinearLayoutManager.VERTICAL);
+    }
+    public static void setLinearLayoutManagerHorizontal(Context context, RecyclerView recyclerView, RecyclerView.Adapter adapter){
+        setLinearLayoutManager(context,recyclerView,adapter,LinearLayoutManager.HORIZONTAL);
+    }
+}

+ 43 - 0
app/src/main/java/com/fuyin/base/BaseHolder.java

xqd
@@ -0,0 +1,43 @@
+package com.fuyin.base;
+
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+
+import java.util.List;
+
+/**
+ * Description
+ * Created by Administrator
+ * Time 2018/1/3  21:46
+ */
+
+public abstract class BaseHolder<T> extends RecyclerView.ViewHolder {
+
+    private BaseAdapter<T> adapter;
+
+    public BaseHolder(View itemView) {
+        super(itemView);
+        initView(itemView);
+    }
+
+    public abstract void initView(View view);
+
+    public abstract void bindViewHolder(T t, int position);
+    public void bindViewHolderPayLoads(T t, int position, List<Object> payloads){}
+
+    void bindViewHolder(T t, int position, List<Object> payloads){
+        if(payloads==null){
+            bindViewHolder(t,position);
+        }else {
+            bindViewHolderPayLoads(t,position,payloads);
+        }
+    }
+
+    public BaseAdapter<T> getAdapter() {
+        return adapter;
+    }
+
+    public void setAdapter(BaseAdapter<T> adapter) {
+        this.adapter = adapter;
+    }
+}

+ 12 - 0
app/src/main/java/com/fuyin/constans/P.java

xqd
@@ -0,0 +1,12 @@
+package com.fuyin.constans;
+
+/**
+ * 位置的常量
+ */
+public interface P {
+     String START_ITEM_POSITION   = "start_item_position";//初始的Item位置
+     String START_IAMGE_POSITION = "start_item_image_position"; //初始的图片位置
+
+    String CURRENT_ITEM_POSITION   = "current_item_position";
+    String CURRENT_IAMGE_POSITION = "current_item_image_position";
+}

+ 9 - 0
app/src/main/java/com/fuyin/interfaces/OnItemPictureClickListener.java

xqd
@@ -0,0 +1,9 @@
+package com.fuyin.interfaces;
+
+import android.widget.ImageView;
+
+import java.util.List;
+
+public interface OnItemPictureClickListener{
+    void onItemPictureClick(int itemPostion,int i, String url, List<String> urlList, ImageView imageView);
+}

+ 173 - 0
app/src/main/java/com/fuyin/ui/ImagePreviewActivity.java

xqd
@@ -0,0 +1,173 @@
+package com.fuyin.ui;
+
+import android.app.SharedElementCallback;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v4.view.ViewPager;
+import android.support.v7.app.AppCompatActivity;
+import android.util.Log;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+
+import com.fuyin.constans.P;
+import com.fuyin.views.CustomViewPager;
+import com.fuyin.adapter.ImagePreviewAdapter;
+import com.zhilin.patrol.R;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 图片预览 Activity
+ */
+public class ImagePreviewActivity extends AppCompatActivity {
+
+    private int itemPosition;
+    private List<String> imageList;
+    private CustomViewPager viewPager;
+    private LinearLayout main_linear;
+    private boolean      mIsReturning;
+    private int            mStartPosition;
+    private int            mCurrentPosition;
+    private ImagePreviewAdapter adapter;
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_image_preview);
+//        initShareElement();
+        getIntentData();
+        initView();
+        renderView();
+        getData();
+        setListener();
+        Log.i("imageList", String.valueOf(imageList));
+    }
+
+//    private void initShareElement() {
+//        setEnterSharedElementCallback(mCallback);
+//    }
+    private void setListener() {
+        main_linear.getChildAt(mCurrentPosition).setEnabled(true);
+        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
+            @Override
+            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+
+            }
+
+            @Override
+            public void onPageSelected(int position) {
+                hideAllIndicator(position);
+                main_linear.getChildAt(position).setEnabled(true);
+                mCurrentPosition = position;
+            }
+
+            @Override
+            public void onPageScrollStateChanged(int state) {
+
+            }
+        });
+        viewPager.setPageTransformer(false, new ViewPager.PageTransformer() {
+            @Override
+            public void transformPage(@NonNull View page, float position) {
+                final float normalizedposition = Math.abs(Math.abs(position) - 1);
+                page.setScaleX(normalizedposition/2  + 0.5f);
+                page.setScaleY(normalizedposition/2  + 0.5f);
+            }
+        });
+    }
+    private void  hideAllIndicator(int position){
+        for(int i=0;i<imageList.size();i++){
+            if(i!=position){
+                main_linear.getChildAt(i).setEnabled(false);
+            }
+        }
+    }
+
+    private void initView() {
+        viewPager = findViewById(R.id.imageBrowseViewPager);
+        main_linear = findViewById(R.id.main_linear);
+    }
+
+    private void renderView() {
+        if(imageList==null) return;
+        if(imageList.size()==1){
+            main_linear.setVisibility(View.GONE);
+        }else {
+            main_linear.setVisibility(View.VISIBLE);
+        }
+        adapter = new ImagePreviewAdapter(this,imageList,itemPosition);
+        viewPager.setAdapter(adapter);
+        viewPager.setCurrentItem(mCurrentPosition);
+    }
+
+    private void getIntentData() {
+        if(getIntent()!=null){
+            mStartPosition = getIntent().getIntExtra(P.START_IAMGE_POSITION, 0);
+            mCurrentPosition = mStartPosition;
+            itemPosition = getIntent().getIntExtra(P.START_ITEM_POSITION, 0);
+            imageList = getIntent().getStringArrayListExtra("imageList");
+        }
+    }
+
+    /**
+     * 获取数据
+     */
+    private void getData() {
+
+        View view;
+        for (String pic : imageList) {
+
+            //创建底部指示器(小圆点)
+            view = new View(ImagePreviewActivity.this);
+            view.setBackgroundResource(R.drawable.indicator);
+            view.setEnabled(false);
+            //设置宽高
+            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(20, 20);
+            //设置间隔
+            if (!pic.equals(imageList.get(0))) {
+                layoutParams.leftMargin = 20;
+            }
+            //添加到LinearLayout
+            main_linear.addView(view, layoutParams);
+        }
+    }
+
+    @Override
+    protected void onPause() {
+        overridePendingTransition(0,0);
+        super.onPause();
+    }
+
+//    @Override
+//    public void finishAfterTransition() {
+//        mIsReturning = true;
+//        Intent data = new Intent();
+//        data.putExtra(P.START_IAMGE_POSITION, mStartPosition);
+//        data.putExtra(P.CURRENT_IAMGE_POSITION, mCurrentPosition);
+//        data.putExtra(P.CURRENT_ITEM_POSITION, itemPosition);
+//        setResult(RESULT_OK, data);
+//        super.finishAfterTransition();
+//    }
+
+
+//    private final SharedElementCallback mCallback = new SharedElementCallback() {
+//
+//        @Override
+//        public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {
+//            if (mIsReturning) {
+//                ImageView sharedElement = adapter.getPhotoView();
+//                if (sharedElement == null) {
+//                    names.clear();
+//                    sharedElements.clear();
+//                } else if (mStartPosition != mCurrentPosition) {
+//                    names.clear();
+//                    names.add(sharedElement.getTransitionName());
+//                    sharedElements.clear();
+//                    sharedElements.put(sharedElement.getTransitionName(), sharedElement);
+//                }
+//            }
+//        }
+//    };
+}

+ 13 - 0
app/src/main/java/com/fuyin/utils/Name.java

xqd
@@ -0,0 +1,13 @@
+package com.fuyin.utils;
+
+public interface Name {
+    String IMAGE_1 = "0";
+    String IMAGE_2 = "1";
+    String IMAGE_3 = "2";
+    String IMAGE_4 = "3";
+    String IMAGE_5 = "4";
+    String IMAGE_6 = "5";
+    String IMAGE_7 = "6";
+    String IMAGE_8 = "7";
+    String IMAGE_9=  "8";
+}

+ 43 - 0
app/src/main/java/com/fuyin/utils/Utils.java

xqd
@@ -0,0 +1,43 @@
+package com.fuyin.utils;
+
+/**
+ * @Description:
+ * @Author: Liangchaojie
+ * @Create On 2018/4/2 19:40
+ */
+public class Utils {
+    public static String getNameByPosition(int itemPosition,int i) {
+        String name = itemPosition+"_"+Name.IMAGE_1;
+        switch (i){
+            case 0:
+                name = itemPosition+"_"+Name.IMAGE_1;
+                break;
+            case 1:
+                name = itemPosition+"_"+Name.IMAGE_2;
+                break;
+            case 2:
+                name = itemPosition+"_"+Name.IMAGE_3;
+                break;
+            case 3:
+                name = itemPosition+"_"+Name.IMAGE_4;
+                break;
+            case 4:
+                name = itemPosition+"_"+Name.IMAGE_5;
+                break;
+            case 5:
+                name = itemPosition+"_"+Name.IMAGE_6;
+                break;
+            case 6:
+                name = itemPosition+"_"+Name.IMAGE_7;
+                break;
+            case 7:
+                name = itemPosition+"_"+Name.IMAGE_8;
+                break;
+            case 8:
+                name = itemPosition+"_"+Name.IMAGE_9;
+                break;
+
+        }
+        return name;
+    }
+}

+ 49 - 0
app/src/main/java/com/fuyin/views/CustomViewPager.java

xqd
@@ -0,0 +1,49 @@
+package com.fuyin.views;
+
+import android.content.Context;
+import android.support.v4.view.ViewPager;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.MotionEvent;
+
+public class CustomViewPager extends ViewPager {
+
+    public CustomViewPager(Context context) {
+
+        this(context, null);
+
+    }
+
+
+
+    public CustomViewPager(Context context, AttributeSet attrs) {
+
+        super(context, attrs);
+
+    }
+
+
+
+    @Override
+
+    public boolean onInterceptTouchEvent(MotionEvent ev) {
+
+        try {
+
+            return super.onInterceptTouchEvent(ev);
+
+        } catch (IllegalArgumentException e) {
+
+            Log.i("TAG", "onInterceptTouchEvent: 多点触摸系统Bug");
+
+        } catch (ArrayIndexOutOfBoundsException e) {
+
+            Log.i("TAG", "onInterceptTouchEvent: 多点触摸系统Bug");
+
+        }
+
+        return false;
+
+    }
+
+}

+ 258 - 0
app/src/main/java/com/fuyin/views/NineGridLayout.java

xqd
@@ -0,0 +1,258 @@
+package com.fuyin.views;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+
+import com.zhilin.patrol.R;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.TimerTask;
+
+/**
+ * @Description:  九宫格布局显示图片
+ *                1    显示1张图片的时候可以按照自适应或者长宽比
+ *                2    显示2张及2张以上都是正方形
+ *                3    4张图片显示排列方式是 2*2
+ * @Author: Liangchaojie
+ * @Create On 2018/3/29 18:22
+ */
+public abstract class NineGridLayout extends ViewGroup {
+    private static final float DEFUALT_SPACING = 3f;
+    private float image_ratio = 1.7f;//默认图片长宽比例
+    private int oneImageWidth;//一张图的宽度
+    private int oneImageHeight;//一张图的高度
+    protected Context mContext;
+    private float mSpacing = DEFUALT_SPACING;
+    private int mColumns;
+    private int mRows;
+    private int mTotalWidth;
+    private int mSingleWidth;
+
+    private boolean mIsShowAll = false;
+    private boolean mIsFirst = true;
+    private List<String> mUrlList = new ArrayList<>();
+
+    public NineGridLayout(Context context) {
+        this(context, null);
+    }
+
+    public NineGridLayout(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.NineGridLayout);
+        mSpacing = typedArray.getDimension(R.styleable.NineGridLayout_sapcing, DEFUALT_SPACING);
+        oneImageWidth = (int) typedArray.getDimension(R.styleable.NineGridLayout_oneImageWidth, 0);
+        oneImageHeight = (int) typedArray.getDimension(R.styleable.NineGridLayout_oneImageHeight, 0);
+        image_ratio =   typedArray.getFloat(R.styleable.NineGridLayout_image_ratio, image_ratio);
+        typedArray.recycle();
+        init(context);
+    }
+
+    private void init(Context context) {
+        mContext = context;
+        if (getListSize(mUrlList) == 0) {
+            setVisibility(GONE);
+        }else {
+            setVisibility(VISIBLE);
+        }
+    }
+
+
+
+    @Override
+    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+        mTotalWidth = right - left;
+        mSingleWidth = (int) ((mTotalWidth - mSpacing * (3 - 1)) / 3);
+        if (mIsFirst) {//只绘制一次
+            notifyDataSetChanged();
+            mIsFirst = false;
+        }
+    }
+
+    /**
+     * 设置间隔
+     *
+     * @param spacing
+     */
+    public void setSpacing(float spacing) {
+        mSpacing = spacing;
+    }
+
+    /**
+     * 设置是否显示所有图片(超过最大数时)
+     *
+     * @param isShowAll
+     */
+    public void setIsShowAll(boolean isShowAll) {
+        mIsShowAll = isShowAll;
+    }
+
+    public void setUrlList(List<String> urlList) {
+        if (getListSize(urlList) == 0) {
+            setVisibility(GONE);
+            return;
+        }
+        setVisibility(VISIBLE);
+
+        mUrlList.clear();
+        mUrlList.addAll(urlList);
+        if (!mIsFirst) {//由于使用在RecyclerView中牵扯到复用布局,所以需要判断当前布局是不是第一次使用,是的话就直接绘制,不是的话就移除掉恰他的布局再绘制
+            notifyDataSetChanged();
+        }
+    }
+
+    public void notifyDataSetChanged() {
+        post(new TimerTask() {
+            @Override
+            public void run() {
+                refresh();
+            }
+        });
+    }
+
+    private void refresh() {
+        removeAllViews();
+        int size = getListSize(mUrlList);
+        if (size > 0) {
+            setVisibility(VISIBLE);
+        } else {
+            setVisibility(GONE);
+            return;
+        }
+
+        if (size == 1) {
+            String url = mUrlList.get(0);
+            RatioImageView imageView = createImageView(0, url);
+
+            getRealOneImageSize();
+            imageView.layout(0, 0, oneImageWidth, oneImageHeight);
+            LayoutParams params = getLayoutParams();
+            params.height = oneImageHeight;
+            setLayoutParams(params);
+            addView(imageView);
+            displayImage(0,imageView, url);
+            return;
+        }
+
+        generateChildrenLayout(size);
+        layoutParams();
+
+        for (int i = 0; i < size; i++) {
+            String url = mUrlList.get(i);
+            RatioImageView imageView = createImageView(i, url);
+            layoutImageView(imageView, i, url);
+        }
+    }
+
+    private void getRealOneImageSize() {
+        if(oneImageWidth==0){
+            oneImageWidth = mSingleWidth;
+        }
+
+        if(oneImageHeight==0){
+            oneImageHeight = (int) (oneImageWidth * image_ratio);
+        }
+    }
+
+    private void layoutParams() {
+        int singleHeight = mSingleWidth;
+
+        //根据子view数量确定高度
+        LayoutParams params = getLayoutParams();
+        params.height = (int) (singleHeight * mRows + mSpacing * (mRows - 1));
+        setLayoutParams(params);
+    }
+
+    private RatioImageView createImageView(final int i, final String url) {
+        final RatioImageView imageView = new RatioImageView(mContext);
+        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
+        imageView.setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                onClickImage(i, url, mUrlList,imageView);
+            }
+        });
+        return imageView;
+    }
+
+    /**
+     * @param imageView
+     * @param url
+     */
+    private void layoutImageView(RatioImageView imageView, int i, String url) {
+        final int singleWidth = (int) ((mTotalWidth - mSpacing * (3 - 1)) / 3);
+        int singleHeight = singleWidth;
+
+        int[] position = findPosition(i);
+        int left = (int) ((singleWidth + mSpacing) * position[1]);
+        int top = (int) ((singleHeight + mSpacing) * position[0]);
+        int right = left + singleWidth;
+        int bottom = top + singleHeight;
+
+        imageView.layout(left, top, right, bottom);
+        addView(imageView);
+        displayImage(i,imageView, url);
+    }
+
+    private int[] findPosition(int childNum) {
+        int[] position = new int[2];
+        for (int i = 0; i < mRows; i++) {
+            for (int j = 0; j < mColumns; j++) {
+                if ((i * mColumns + j) == childNum) {
+                    position[0] = i;//行
+                    position[1] = j;//列
+                    break;
+                }
+            }
+        }
+        return position;
+    }
+
+    /**
+     * 根据图片个数确定行列数量
+     *
+     * @param length
+     */
+    private void generateChildrenLayout(int length) {
+        if (length <= 3) {
+            mRows = 1;
+            mColumns = length;
+        } else if (length <= 6) {
+            mRows = 2;
+            mColumns = 3;
+            if (length == 4) {
+                mColumns = 2;
+            }
+        } else {
+            mColumns = 3;
+            if (mIsShowAll) {
+                mRows = length / 3;
+                int b = length % 3;
+                if (b > 0) {
+                    mRows++;
+                }
+            } else {
+                mRows = 3;
+            }
+        }
+
+    }
+
+    private int getListSize(List<String> list) {
+        if (list == null || list.size() == 0) {
+            return 0;
+        }
+        return list.size();
+    }
+
+
+
+    protected abstract void displayImage(int position,RatioImageView imageView, String url);
+
+    protected abstract void onClickImage(int position, String url, List<String> urlList,ImageView imageView);
+}

+ 54 - 0
app/src/main/java/com/fuyin/views/NineGridTestLayout.java

xqd
@@ -0,0 +1,54 @@
+package com.fuyin.views;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.ImageView;
+
+import com.fuyin.interfaces.OnItemPictureClickListener;
+import com.fuyin.utils.Utils;
+import com.squareup.picasso.Picasso;
+
+import java.util.List;
+
+/**
+ * 一般项目就实现NineGridLayout类即可,如果没有特殊需求,不要改动NineGridLayout类
+ */
+public class NineGridTestLayout extends NineGridLayout {
+
+    private Context context;
+    private int itemPosition;
+    private OnItemPictureClickListener listener;
+
+    public NineGridTestLayout(Context context) {
+        this(context,null);
+    }
+
+    public NineGridTestLayout(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        this.context = context;
+    }
+
+
+    @Override
+    protected void displayImage(int position,RatioImageView imageView, String url) {
+        if(context!=null){
+            Picasso.with(context).load(url).into(imageView);
+            imageView.setTag(Utils.getNameByPosition(itemPosition,position));
+            imageView.setTransitionName(Utils.getNameByPosition(itemPosition,position));
+        }
+    }
+
+    @Override
+    protected void onClickImage(int imageIndex, String url, List<String> urlList, ImageView imageView) {
+        listener.onItemPictureClick(itemPosition,imageIndex,url,urlList,imageView);
+    }
+
+
+    public void setItemPosition(int itemPosition) {
+        this.itemPosition = itemPosition;
+    }
+
+    public void setListener(OnItemPictureClickListener listener) {
+        this.listener = listener;
+    }
+}

+ 86 - 0
app/src/main/java/com/fuyin/views/RatioImageView.java

xqd
@@ -0,0 +1,86 @@
+package com.fuyin.views;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Color;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
+import android.support.v7.widget.AppCompatImageView;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+
+import com.zhilin.patrol.R;
+
+
+/**
+ * @Description:
+ * @Author: Liangchaojie
+ * @Create On 2018/3/29 18:25
+ */
+public class RatioImageView extends AppCompatImageView {
+
+    /**
+     * 宽高比例
+     */
+    private float mRatio = 0f;
+
+    public RatioImageView(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    public RatioImageView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RatioImageView);
+
+        mRatio = typedArray.getFloat(R.styleable.RatioImageView_ratio, 0f);
+        typedArray.recycle();
+    }
+
+    public RatioImageView(Context context) {
+        super(context);
+    }
+
+    /**
+     * 设置ImageView的宽高比
+     *
+     * @param ratio
+     */
+    public void setRatio(float ratio) {
+        mRatio = ratio;
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        int width = MeasureSpec.getSize(widthMeasureSpec);
+        if (mRatio != 0) {
+            float height = width / mRatio;
+            heightMeasureSpec = MeasureSpec.makeMeasureSpec((int) height, MeasureSpec.EXACTLY);
+        }
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+
+        switch (event.getAction()) {
+            case MotionEvent.ACTION_DOWN:
+                Drawable drawable = getDrawable();
+                if (drawable != null) {
+                    drawable.mutate().setColorFilter(Color.GRAY,
+                            PorterDuff.Mode.MULTIPLY);
+                }
+                break;
+            case MotionEvent.ACTION_MOVE:
+                break;
+            case MotionEvent.ACTION_CANCEL:
+            case MotionEvent.ACTION_UP:
+                Drawable drawableUp = getDrawable();
+                if (drawableUp != null) {
+                    drawableUp.mutate().clearColorFilter();
+                }
+                break;
+        }
+
+        return super.onTouchEvent(event);
+    }
+}

+ 52 - 0
app/src/main/java/com/zhilin/patrol/adapter/FragmentAdapter.java

xqd
@@ -0,0 +1,52 @@
+package com.zhilin.patrol.adapter;
+
+import android.content.Context;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentPagerAdapter;
+
+import java.util.List;
+
+/**
+ * fragment适配器
+ */
+public class FragmentAdapter extends FragmentPagerAdapter {
+
+    private List<Fragment> mListFragment;
+
+    private List<String> mListTitle;
+
+    private Context mContext;
+
+    public FragmentAdapter(FragmentManager fm, Context context, List<Fragment> listFragment) {
+        super(fm);
+        this.mContext = context;
+        this.mListFragment = listFragment;
+    }
+
+
+    public FragmentAdapter(FragmentManager fm, Context context, List<Fragment> listFragment, List<String> listTitle) {
+        super(fm);
+        this.mContext = context;
+        this.mListFragment = listFragment;
+        this.mListTitle = listTitle;
+    }
+
+    @Override
+    public Fragment getItem(int position) {
+        return mListFragment.get(position);
+    }
+
+    @Override
+    public int getCount() {
+        return mListFragment.size();
+    }
+
+    @Override
+    public CharSequence getPageTitle(int position) {
+        if (mListTitle == null) {
+            return super.getPageTitle(position);
+        }
+        return mListTitle.get(position);
+    }
+}

+ 177 - 0
app/src/main/java/com/zhilin/patrol/adapter/QuestionImgAdapter.java

xqd
@@ -0,0 +1,177 @@
+package com.zhilin.patrol.adapter;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.ImageView;
+
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.request.RequestOptions;
+import com.fuyin.constans.P;
+import com.fuyin.ui.ImagePreviewActivity;
+import com.zhilin.patrol.R;
+import com.zhilin.patrol.adapter.helper.MyItemTouchCallback;
+import com.zhilin.patrol.tool.DensityUtil;
+import com.zhilin.patrol.tool.Utils;
+import com.zhilin.patrol.ui.activity.RecifyUploadActivity;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+/**
+ * 选择图片适配器
+ */
+public class QuestionImgAdapter extends RecyclerView.Adapter<QuestionImgAdapter.ViewHolder> implements MyItemTouchCallback.ItemTouchAdapter {
+
+    /** 上传图片最大数 */
+    public static final int MAX_IMAGE_SIZE = 9;
+    private ArrayList<String> mDataList = new ArrayList<>();
+    private Context mContext;
+    private int mSpanCount;//一列行数
+
+    public QuestionImgAdapter(Context context, ArrayList<String> dataList, int spanCount) {
+        this.mDataList = dataList;
+        this.mContext = context;
+        this.mSpanCount = spanCount;
+    }
+
+    public Object getItem(int position) {
+        if (mDataList != null
+                && mDataList.size() == MAX_IMAGE_SIZE) {
+            return mDataList.get(position);
+        } else if (mDataList == null || position - 1 < 0
+                || position > mDataList.size()) {
+            return null;
+        } else {
+            return mDataList.get(position - 1);
+        }
+    }
+
+    @Override
+    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        View view = View.inflate(mContext, R.layout.item_publish, null);
+        return new ViewHolder(view);
+    }
+
+    @Override
+    public void onBindViewHolder(ViewHolder holder, final int position) {
+        if (isShowAddItem(position)) {
+            holder.imageIv.setImageResource(R.drawable.btn_add_null);
+            holder.imageIv.setBackgroundResource(R.color.white);
+            holder.delIv.setVisibility(View.GONE);
+        } else {
+            holder.delIv.setVisibility(View.GONE);
+            final String imgPath = mDataList.get(position);
+            //            if (isFromPremises || mIsUploadAddress) {
+            //                ImageDisplayer.getInstance(mContext).displayBmp(holder.imageIv,
+            //                        item.thumbnailPath, item.compressDir);
+            //            } else {
+            //                ImageDisplayer.getInstance(mContext).displayBmp(holder.imageIv,
+            //                        item.thumbnailPath, item.sourcePath);
+            //            }
+            //Glide加载图片
+            final RequestOptions options = new RequestOptions();
+            options.centerCrop()
+                    .placeholder(R.mipmap.bg_img)
+                    .error(R.mipmap.bg_img);
+            Glide.with(mContext)
+                    .load(imgPath)
+//                    .diskCacheStrategy(DiskCacheStrategy.NONE)
+//                    .error(R.mipmap.bg_img)
+                    .into(holder.imageIv);
+
+        }
+        //添加图片和浏览图片点击
+        holder.imageIv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                if (isShowAddItem(position)) {
+//                    PhotoPicker.builder()
+//                            .setPhotoCount(9)
+//                            .setGridColumnCount(4)
+//                            .setSelected(mDataList)
+//                            .start((Activity) mContext);
+//                    ((RecifyUploadActivity) mContext).toCamera();
+                } else {
+//                    PhotoPreview.builder()
+//                            .setPhotos(mDataList)
+//                            .setCurrentItem(position)
+//                            .start((Activity) mContext);
+
+                    Intent intent = new Intent(mContext, ImagePreviewActivity.class);
+                    intent.putStringArrayListExtra("imageList", (ArrayList<String>) mDataList);
+                    intent.putExtra(P.START_ITEM_POSITION, position);
+                    intent.putExtra(P.START_IAMGE_POSITION, position);
+//                        ActivityOptions compat = ActivityOptions.makeSceneTransitionAnimation(getActivity(), imageView, imageView.getTransitionName());
+//                        startActivity(intent, compat.toBundle());
+                    mContext.startActivity(intent);
+                    ((Activity) mContext).overridePendingTransition(0, 0);
+                }
+            }
+        });
+    }
+
+    @Override
+    public int getItemCount() {
+        // 多返回一个用于展示添加图标
+        if (mDataList == null) {
+            return 1;
+        } else if (mDataList.size() == MAX_IMAGE_SIZE) {
+            return MAX_IMAGE_SIZE;
+        } else {
+            return mDataList.size() + 1;
+        }
+    }
+
+    private boolean isShowAddItem(int position) {
+        int size = mDataList == null ? 0 : mDataList.size();
+        return position == size;
+    }
+
+    @Override
+    public void onMove(int fromPosition, int toPosition) {
+        if (fromPosition == mDataList.size() || toPosition == mDataList.size()) {
+            return;
+        }
+        if (fromPosition < toPosition) {
+            for (int i = fromPosition; i < toPosition; i++) {
+                Collections.swap(mDataList, i, i + 1);
+            }
+        } else {
+            for (int i = fromPosition; i > toPosition; i--) {
+                Collections.swap(mDataList, i, i - 1);
+            }
+        }
+        notifyItemMoved(fromPosition, toPosition);
+    }
+
+    @Override
+    public void onSwiped(int position) {
+        mDataList.remove(position);
+        notifyItemRemoved(position);
+    }
+
+    public class ViewHolder extends RecyclerView.ViewHolder {
+
+        ImageView imageIv;
+        ImageView delIv;
+        View itemView;
+
+        public ViewHolder(View view) {
+            super(view);
+            this.itemView = view;
+            imageIv = (ImageView) itemView.findViewById(R.id.item_grid_image);
+            delIv = (ImageView) itemView.findViewById(R.id.item_img_del);
+            WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
+            int width = wm.getDefaultDisplay().getWidth() - (mSpanCount + 1) * DensityUtil.dip2px(mContext, 8);
+            ViewGroup.LayoutParams layoutParams = imageIv.getLayoutParams();
+            layoutParams.height = width / mSpanCount;
+            imageIv.setLayoutParams(layoutParams);
+        }
+    }
+
+}

+ 190 - 0
app/src/main/java/com/zhilin/patrol/adapter/UpImageAdapter.java

xqd
@@ -0,0 +1,190 @@
+package com.zhilin.patrol.adapter;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.ImageView;
+
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.request.RequestOptions;
+import com.fuyin.constans.P;
+import com.fuyin.ui.ImagePreviewActivity;
+import com.zhilin.patrol.R;
+import com.zhilin.patrol.adapter.helper.MyItemTouchCallback;
+import com.zhilin.patrol.tool.DensityUtil;
+import com.zhilin.patrol.tool.Utils;
+import com.zhilin.patrol.ui.activity.PatrolUploadActivity;
+import com.zhilin.patrol.ui.activity.RecifyUploadActivity;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+/**
+ * 选择图片适配器
+ */
+public class UpImageAdapter extends RecyclerView.Adapter<UpImageAdapter.ViewHolder> implements MyItemTouchCallback.ItemTouchAdapter {
+
+    /** 上传图片最大数 */
+    public static final int MAX_IMAGE_SIZE = 9;
+    private ArrayList<String> mDataList = new ArrayList<>();
+    private Context mContext;
+    private int mSpanCount;//一列行数
+
+    public UpImageAdapter(Context context, ArrayList<String> dataList, int spanCount) {
+        this.mDataList = dataList;
+        this.mContext = context;
+        this.mSpanCount = spanCount;
+    }
+
+    public Object getItem(int position) {
+        if (mDataList != null
+                && mDataList.size() == MAX_IMAGE_SIZE) {
+            return mDataList.get(position);
+        } else if (mDataList == null || position - 1 < 0
+                || position > mDataList.size()) {
+            return null;
+        } else {
+            return mDataList.get(position - 1);
+        }
+    }
+
+    @Override
+    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        View view = View.inflate(mContext, R.layout.item_publish, null);
+        return new ViewHolder(view);
+    }
+
+    @Override
+    public void onBindViewHolder(ViewHolder holder, final int position) {
+        if (isShowAddItem(position)) {
+            holder.imageIv.setImageResource(R.drawable.btn_add_pic);
+            holder.imageIv.setBackgroundResource(R.color.bg_gray);
+            holder.delIv.setVisibility(View.GONE);
+        } else {
+            holder.delIv.setVisibility(View.VISIBLE);
+            final String imgPath = mDataList.get(position);
+            //            if (isFromPremises || mIsUploadAddress) {
+            //                ImageDisplayer.getInstance(mContext).displayBmp(holder.imageIv,
+            //                        item.thumbnailPath, item.compressDir);
+            //            } else {
+            //                ImageDisplayer.getInstance(mContext).displayBmp(holder.imageIv,
+            //                        item.thumbnailPath, item.sourcePath);
+            //            }
+            //Glide加载图片
+            final RequestOptions options = new RequestOptions();
+            options.centerCrop()
+                    .placeholder(R.mipmap.bg_img)
+                    .error(R.mipmap.bg_img);
+            Glide.with(mContext)
+                    .load(imgPath)
+//                    .diskCacheStrategy(DiskCacheStrategy.NONE)
+//                    .error(R.mipmap.bg_img)
+                    .into(holder.imageIv);
+            //删除图片
+            holder.delIv.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View view) {
+                    mDataList.remove(imgPath);
+                    Utils.delSingleFile(imgPath);
+                    notifyDataSetChanged();
+                    if (mContext instanceof PatrolUploadActivity) {
+                        ((PatrolUploadActivity) mContext).setImageNum();
+                    }
+
+                }
+            });
+        }
+        //添加图片和浏览图片点击
+        holder.imageIv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                if (isShowAddItem(position)) {
+//                    PhotoPicker.builder()
+//                            .setPhotoCount(9)
+//                            .setGridColumnCount(4)
+//                            .setSelected(mDataList)
+//                            .start((Activity) mContext);
+                    ((PatrolUploadActivity) mContext).toCamera();
+                } else {
+//                    PhotoPreview.builder()
+//                            .setPhotos(mDataList)
+//                            .setCurrentItem(position)
+//                            .start((Activity) mContext);
+
+                    Intent intent = new Intent(mContext, ImagePreviewActivity.class);
+                    intent.putStringArrayListExtra("imageList", (ArrayList<String>) mDataList);
+                    intent.putExtra(P.START_ITEM_POSITION, position);
+                    intent.putExtra(P.START_IAMGE_POSITION, position);
+//                        ActivityOptions compat = ActivityOptions.makeSceneTransitionAnimation(getActivity(), imageView, imageView.getTransitionName());
+//                        startActivity(intent, compat.toBundle());
+                    mContext.startActivity(intent);
+                    ((Activity) mContext).overridePendingTransition(0, 0);
+                }
+            }
+        });
+    }
+
+    @Override
+    public int getItemCount() {
+        // 多返回一个用于展示添加图标
+        if (mDataList == null) {
+            return 1;
+        } else if (mDataList.size() == MAX_IMAGE_SIZE) {
+            return MAX_IMAGE_SIZE;
+        } else {
+            return mDataList.size() + 1;
+        }
+    }
+
+    private boolean isShowAddItem(int position) {
+        int size = mDataList == null ? 0 : mDataList.size();
+        return position == size;
+    }
+
+    @Override
+    public void onMove(int fromPosition, int toPosition) {
+        if (fromPosition == mDataList.size() || toPosition == mDataList.size()) {
+            return;
+        }
+        if (fromPosition < toPosition) {
+            for (int i = fromPosition; i < toPosition; i++) {
+                Collections.swap(mDataList, i, i + 1);
+            }
+        } else {
+            for (int i = fromPosition; i > toPosition; i--) {
+                Collections.swap(mDataList, i, i - 1);
+            }
+        }
+        notifyItemMoved(fromPosition, toPosition);
+    }
+
+    @Override
+    public void onSwiped(int position) {
+        mDataList.remove(position);
+        notifyItemRemoved(position);
+    }
+
+    public class ViewHolder extends RecyclerView.ViewHolder {
+
+        ImageView imageIv;
+        ImageView delIv;
+        View itemView;
+
+        public ViewHolder(View view) {
+            super(view);
+            this.itemView = view;
+            imageIv = (ImageView) itemView.findViewById(R.id.item_grid_image);
+            delIv = (ImageView) itemView.findViewById(R.id.item_img_del);
+            WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
+            int width = wm.getDefaultDisplay().getWidth() - (mSpanCount + 1) * DensityUtil.dip2px(mContext, 8);
+            ViewGroup.LayoutParams layoutParams = imageIv.getLayoutParams();
+            layoutParams.height = width / mSpanCount;
+            imageIv.setLayoutParams(layoutParams);
+        }
+    }
+
+}

+ 194 - 0
app/src/main/java/com/zhilin/patrol/adapter/UpImageAdapterRectify.java

xqd
@@ -0,0 +1,194 @@
+package com.zhilin.patrol.adapter;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.ImageView;
+
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.request.RequestOptions;
+import com.fuyin.constans.P;
+import com.fuyin.ui.ImagePreviewActivity;
+import com.zhilin.patrol.R;
+import com.zhilin.patrol.adapter.helper.MyItemTouchCallback;
+import com.zhilin.patrol.tool.DensityUtil;
+import com.zhilin.patrol.tool.Utils;
+import com.zhilin.patrol.ui.activity.PatrolUploadActivity;
+import com.zhilin.patrol.ui.activity.RecifyUploadActivity;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+/**
+ * 选择图片适配器
+ */
+public class UpImageAdapterRectify extends RecyclerView.Adapter<UpImageAdapterRectify.ViewHolder> implements MyItemTouchCallback.ItemTouchAdapter {
+
+    /** 上传图片最大数 */
+    public static final int MAX_IMAGE_SIZE = 9;
+    private ArrayList<String> mDataList = new ArrayList<>();
+    private Context mContext;
+    private int mSpanCount;//一列行数
+
+    public UpImageAdapterRectify(Context context, ArrayList<String> dataList, int spanCount) {
+        this.mDataList = dataList;
+        this.mContext = context;
+        this.mSpanCount = spanCount;
+    }
+
+    public Object getItem(int position) {
+        if (mDataList != null
+                && mDataList.size() == MAX_IMAGE_SIZE) {
+            return mDataList.get(position);
+        } else if (mDataList == null || position - 1 < 0
+                || position > mDataList.size()) {
+            return null;
+        } else {
+            return mDataList.get(position - 1);
+        }
+    }
+
+    @Override
+    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        View view = View.inflate(mContext, R.layout.item_publish, null);
+        return new ViewHolder(view);
+    }
+
+    @Override
+    public void onBindViewHolder(ViewHolder holder, final int position) {
+        if (isShowAddItem(position)) {
+            holder.imageIv.setImageResource(R.drawable.btn_add_pic);
+            holder.imageIv.setBackgroundResource(R.color.bg_gray);
+            holder.delIv.setVisibility(View.GONE);
+        } else {
+            holder.delIv.setVisibility(View.VISIBLE);
+            Log.i("mdataList", String.valueOf(mDataList));
+            final String imgPath = mDataList.get(position);
+            //            if (isFromPremises || mIsUploadAddress) {
+            //                ImageDisplayer.getInstance(mContext).displayBmp(holder.imageIv,
+            //                        item.thumbnailPath, item.compressDir);
+            //            } else {
+            //                ImageDisplayer.getInstance(mContext).displayBmp(holder.imageIv,
+            //                        item.thumbnailPath, item.sourcePath);
+            //            }
+            //Glide加载图片
+            final RequestOptions options = new RequestOptions();
+            options.centerCrop()
+                    .placeholder(R.mipmap.bg_img)
+                    .error(R.mipmap.bg_img);
+            Glide.with(mContext)
+                    .load(imgPath)
+//                    .diskCacheStrategy(DiskCacheStrategy.NONE)
+//                    .error(R.mipmap.bg_img)
+                    .into(holder.imageIv);
+            //删除图片
+            holder.delIv.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View view) {
+                    mDataList.remove(imgPath);
+                    Utils.delSingleFile(imgPath);
+                    notifyDataSetChanged();
+                    if (mContext instanceof RecifyUploadActivity) {
+                        ((RecifyUploadActivity) mContext).setImageNum();
+                    }
+                }
+            });
+        }
+        //添加图片和浏览图片点击
+        holder.imageIv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                if (isShowAddItem(position)) {
+//                    PhotoPicker.builder()
+//                            .setPhotoCount(9)
+//                            .setGridColumnCount(4)
+//                            .setSelected(mDataList)
+//                            .start((Activity) mContext);
+//                    ((RecifyUploadActivity) mContext).toCamera();
+                    ((RecifyUploadActivity) mContext).takePhotoOrSelectPicture();
+                } else {
+//                    PhotoPreview.builder()
+//                            .setPhotos(mDataList)
+//                            .setCurrentItem(position)
+//                            .start((Activity) mContext);
+
+                    Intent intent = new Intent(mContext, ImagePreviewActivity.class);
+                    intent.putStringArrayListExtra("imageList", (ArrayList<String>) mDataList);
+                    intent.putExtra(P.START_ITEM_POSITION, position);
+                    intent.putExtra(P.START_IAMGE_POSITION, position);
+//                        ActivityOptions compat = ActivityOptions.makeSceneTransitionAnimation(getActivity(), imageView, imageView.getTransitionName());
+//                        startActivity(intent, compat.toBundle());
+                    mContext.startActivity(intent);
+                    ((Activity) mContext).overridePendingTransition(0, 0);
+                }
+            }
+        });
+    }
+
+
+    @Override
+    public int getItemCount() {
+        // 多返回一个用于展示添加图标
+        if (mDataList == null) {
+            return 1;
+        } else if (mDataList.size() == MAX_IMAGE_SIZE) {
+            return MAX_IMAGE_SIZE;
+        } else {
+            return mDataList.size() + 1;
+        }
+    }
+
+    private boolean isShowAddItem(int position) {
+        int size = mDataList == null ? 0 : mDataList.size();
+        return position == size;
+    }
+
+    @Override
+    public void onMove(int fromPosition, int toPosition) {
+        if (fromPosition == mDataList.size() || toPosition == mDataList.size()) {
+            return;
+        }
+        if (fromPosition < toPosition) {
+            for (int i = fromPosition; i < toPosition; i++) {
+                Collections.swap(mDataList, i, i + 1);
+            }
+        } else {
+            for (int i = fromPosition; i > toPosition; i--) {
+                Collections.swap(mDataList, i, i - 1);
+            }
+        }
+        notifyItemMoved(fromPosition, toPosition);
+    }
+
+    @Override
+    public void onSwiped(int position) {
+        mDataList.remove(position);
+        notifyItemRemoved(position);
+    }
+
+    public class ViewHolder extends RecyclerView.ViewHolder {
+
+        ImageView imageIv;
+        ImageView delIv;
+        View itemView;
+
+        public ViewHolder(View view) {
+            super(view);
+            this.itemView = view;
+            imageIv = (ImageView) itemView.findViewById(R.id.item_grid_image);
+            delIv = (ImageView) itemView.findViewById(R.id.item_img_del);
+            WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
+            int width = wm.getDefaultDisplay().getWidth() - (mSpanCount + 1) * DensityUtil.dip2px(mContext, 8);
+            ViewGroup.LayoutParams layoutParams = imageIv.getLayoutParams();
+            layoutParams.height = width / mSpanCount;
+            imageIv.setLayoutParams(layoutParams);
+        }
+    }
+
+}

+ 39 - 0
app/src/main/java/com/zhilin/patrol/adapter/helper/GridItemDecoration.java

xqd
@@ -0,0 +1,39 @@
+package com.zhilin.patrol.adapter.helper;
+
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.support.v7.widget.GridLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+
+/**
+ *
+ */
+public class GridItemDecoration extends RecyclerView.ItemDecoration {
+
+    private int spaceSize;
+
+    public GridItemDecoration(int spaceSize) {
+        this.spaceSize = spaceSize;
+    }
+
+    @Override
+    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
+        int position = parent.getChildAdapterPosition(view); // item position
+        GridLayoutManager layoutManager = (GridLayoutManager) parent.getLayoutManager();
+//        boolean b = state.willRunPredictiveAnimations();
+        int spanCount = layoutManager.getSpanCount();
+        int column = position % spanCount; // item column
+
+        int left = spaceSize - column * spaceSize / spanCount;
+        int right = (column + 1) * spaceSize / spanCount;
+        int top = spaceSize;
+
+        outRect.set(left, top, right, 0);
+    }
+
+    @Override
+    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
+    }
+
+}

+ 121 - 0
app/src/main/java/com/zhilin/patrol/adapter/helper/MyItemTouchCallback.java

xqd
@@ -0,0 +1,121 @@
+package com.zhilin.patrol.adapter.helper;
+
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.drawable.Drawable;
+import android.support.v7.widget.GridLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.helper.ItemTouchHelper;
+
+/**
+ * Created by Administrator on 2016/4/12.
+ */
+public class MyItemTouchCallback extends ItemTouchHelper.Callback {
+
+    private ItemTouchAdapter itemTouchAdapter;
+
+    public MyItemTouchCallback(ItemTouchAdapter itemTouchAdapter) {
+        this.itemTouchAdapter = itemTouchAdapter;
+    }
+
+    @Override
+    public boolean isLongPressDragEnabled() {
+        return false;
+    }
+
+    @Override
+    public boolean isItemViewSwipeEnabled() {
+        return true;
+    }
+
+
+    @Override
+    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
+        if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
+            final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
+            final int swipeFlags = 0;
+            return makeMovementFlags(dragFlags, swipeFlags);
+        } else {
+            final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
+            //final int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
+            final int swipeFlags = 0;
+            return makeMovementFlags(dragFlags, swipeFlags);
+        }
+    }
+
+    @Override
+    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
+        int fromPosition = viewHolder.getAdapterPosition();//得到拖动ViewHolder的position
+        int toPosition = target.getAdapterPosition();//得到目标ViewHolder的position
+        itemTouchAdapter.onMove(fromPosition, toPosition);
+        return true;
+    }
+
+    @Override
+    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
+        int position = viewHolder.getAdapterPosition();
+        itemTouchAdapter.onSwiped(position);
+    }
+
+    @Override
+    public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
+        if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
+            //滑动时改变Item的透明度
+            final float alpha = 1 - Math.abs(dX) / (float) viewHolder.itemView.getWidth();
+            viewHolder.itemView.setAlpha(alpha);
+            viewHolder.itemView.setTranslationX(dX);
+        } else {
+            super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
+        }
+    }
+
+    @Override
+    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
+        if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
+            if (background == null && bkcolor == -1) {
+                Drawable drawable = viewHolder.itemView.getBackground();
+                if (drawable == null) {
+                    bkcolor = 0;
+                } else {
+                    background = drawable;
+                }
+            }
+            viewHolder.itemView.setBackgroundColor(Color.LTGRAY);
+        }
+        super.onSelectedChanged(viewHolder, actionState);
+    }
+
+    @Override
+    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
+        super.clearView(recyclerView, viewHolder);
+
+        viewHolder.itemView.setAlpha(1.0f);
+        if (background != null) viewHolder.itemView.setBackgroundDrawable(background);
+        if (bkcolor != -1) viewHolder.itemView.setBackgroundColor(bkcolor);
+        //viewHolder.itemView.setBackgroundColor(0);
+
+        if (onDragListener != null) {
+            onDragListener.onFinishDrag();
+        }
+    }
+
+    private Drawable background = null;
+    private int bkcolor = -1;
+
+    private OnDragListener onDragListener;
+
+    public MyItemTouchCallback setOnDragListener(OnDragListener onDragListener) {
+        this.onDragListener = onDragListener;
+        return this;
+    }
+
+    public interface OnDragListener {
+        void onFinishDrag();
+    }
+
+    public interface ItemTouchAdapter {
+        void onMove(int fromPosition, int toPosition);
+
+        void onSwiped(int position);
+    }
+}

+ 61 - 0
app/src/main/java/com/zhilin/patrol/adapter/helper/OnRecyclerItemClickListener.java

xqd
@@ -0,0 +1,61 @@
+package com.zhilin.patrol.adapter.helper;
+
+import android.support.v4.view.GestureDetectorCompat;
+import android.support.v7.widget.RecyclerView;
+import android.view.GestureDetector;
+import android.view.MotionEvent;
+import android.view.View;
+
+/**
+ * Created by Administrator on 2016/4/14.
+ */
+public class OnRecyclerItemClickListener implements RecyclerView.OnItemTouchListener{
+    private GestureDetectorCompat mGestureDetector;
+    private RecyclerView recyclerView;
+
+    public OnRecyclerItemClickListener(RecyclerView recyclerView){
+        this.recyclerView = recyclerView;
+        mGestureDetector = new GestureDetectorCompat(recyclerView.getContext(),new ItemTouchHelperGestureListener());
+    }
+
+    @Override
+    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
+        mGestureDetector.onTouchEvent(e);
+        return false;
+    }
+
+    @Override
+    public void onTouchEvent(RecyclerView rv, MotionEvent e) {
+        mGestureDetector.onTouchEvent(e);
+    }
+
+    @Override
+    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
+
+    }
+
+    private class ItemTouchHelperGestureListener extends GestureDetector.SimpleOnGestureListener {
+
+        @Override
+        public boolean onSingleTapUp(MotionEvent e) {
+//            View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
+//            if (child!=null) {
+//                RecyclerView.ViewHolder vh = recyclerView.getChildViewHolder(child);
+//                onItemClick(vh);
+//            }
+            return true;
+        }
+
+        @Override
+        public void onLongPress(MotionEvent e) {
+            View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
+            if (child!=null) {
+                RecyclerView.ViewHolder vh = recyclerView.getChildViewHolder(child);
+                onLongClick(vh);
+            }
+        }
+    }
+
+    public void onLongClick(RecyclerView.ViewHolder vh){}
+    public void onItemClick(RecyclerView.ViewHolder vh){}
+}

+ 36 - 0
app/src/main/java/com/zhilin/patrol/app/PatrolApp.java

xqd
@@ -0,0 +1,36 @@
+package com.zhilin.patrol.app;
+
+import android.app.Application;
+
+import com.zhy.http.okhttp.OkHttpUtils;
+
+import java.util.concurrent.TimeUnit;
+
+import okhttp3.OkHttpClient;
+
+/**
+ * 全局类
+ */
+public class PatrolApp extends Application {
+
+    private static PatrolApp application;
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        application = this;
+        OkHttpClient okHttpClient = new OkHttpClient.Builder()
+//                .addInterceptor(new LoggerInterceptor("TAG"))
+                .connectTimeout(10000L, TimeUnit.MILLISECONDS)
+                .readTimeout(10000L, TimeUnit.MILLISECONDS)
+                //其他配置
+                .build();
+
+        OkHttpUtils.initClient(okHttpClient);
+    }
+
+    public static PatrolApp getApplication() {
+        return application;
+    }
+
+}

+ 55 - 0
app/src/main/java/com/zhilin/patrol/bean/AddressAreaEntity.java

xqd
@@ -0,0 +1,55 @@
+package com.zhilin.patrol.bean;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 附近小区实体
+ */
+public class AddressAreaEntity extends BaseEntity<List<AddressAreaEntity.InfoListBean>> implements Serializable{
+
+    public static class InfoListBean implements Serializable {
+        /** 平台巡点识别号 */
+        private String addrCode;
+        /** 地址 */
+        private String address;
+        /** 巡点与上传者之间的距离 */
+        private String distance;
+
+        private boolean isSelected;
+
+        public boolean isSelected() {
+            return isSelected;
+        }
+
+        public void setSelected(boolean selected) {
+            isSelected = selected;
+        }
+
+        public String getAddrCode() {
+            return addrCode;
+        }
+
+        public void setAddrCode(String addrCode) {
+            this.addrCode = addrCode;
+        }
+
+        public String getAddress() {
+            return address;
+        }
+
+        public void setAddress(String address) {
+            this.address = address;
+        }
+
+        public String getDistance() {
+            return distance;
+        }
+
+        public void setDistance(String distance) {
+            this.distance = distance;
+        }
+    }
+
+
+}

+ 42 - 0
app/src/main/java/com/zhilin/patrol/bean/BaseEntity.java

xqd
@@ -0,0 +1,42 @@
+package com.zhilin.patrol.bean;
+
+/**
+ *
+ * @param <T>
+ */
+public class BaseEntity<T> {
+    /**
+     * 返回code
+     */
+    private String returnCode;
+    /**
+     * 返回信息
+     */
+    private String returnMsg;
+
+    private  T infoList;
+
+    public String getReturnCode() {
+        return returnCode;
+    }
+
+    public void setReturnCode(String returnCode) {
+        this.returnCode = returnCode;
+    }
+
+    public String getReturnMsg() {
+        return returnMsg;
+    }
+
+    public void setReturnMsg(String returnMsg) {
+        this.returnMsg = returnMsg;
+    }
+
+    public T getInfoList() {
+        return infoList;
+    }
+
+    public void setInfoList(T infoList) {
+        this.infoList = infoList;
+    }
+}

+ 38 - 0
app/src/main/java/com/zhilin/patrol/bean/FinishTaskEntity.java

xqd
@@ -0,0 +1,38 @@
+package com.zhilin.patrol.bean;
+
+public class FinishTaskEntity{
+    /**
+     * 返回code
+     */
+    private String returnCode;
+    /**
+     * 返回信息
+     */
+    private String returnMsg;
+
+    private  boolean infoList;
+
+    public String getReturnCode() {
+        return returnCode;
+    }
+
+    public void setReturnCode(String returnCode) {
+        this.returnCode = returnCode;
+    }
+
+    public String getReturnMsg() {
+        return returnMsg;
+    }
+
+    public void setReturnMsg(String returnMsg) {
+        this.returnMsg = returnMsg;
+    }
+
+    public boolean getInfoList() {
+        return infoList;
+    }
+
+    public void setInfoList(boolean infoList) {
+        this.infoList = infoList;
+    }
+}

+ 208 - 0
app/src/main/java/com/zhilin/patrol/bean/HomeEntity.java

xqd
@@ -0,0 +1,208 @@
+package com.zhilin.patrol.bean;
+
+import java.io.Serializable;
+
+/**
+ * 首页实体
+ */
+public class HomeEntity extends BaseEntity<HomeEntity.InfoListBean> {
+
+    public static class InfoListBean implements Serializable {
+        /**
+         * finishNum : 10
+         * unfinishNum : 5
+         * reviewNum : 2
+         * comTel : 027-64536254
+         * extTask : {"address":"深圳龙华-小区1","longitude":"113.993701","latitude":"31.731305","endTime":"2018-06-20"}
+         */
+        /** 完成目标数 */
+        private int finishNum;
+        /** 未完成目标数 */
+        private int unfinishNum;
+        /** 审核数 */
+        private int reviewNum;
+        /*不通过数*/
+        private int unpassNum;
+        /** 电话 */
+        private String comTel;
+        /**
+         * address : 深圳龙华-小区1
+         * longitude : 113.993701
+         * latitude : 31.731305
+         * endTime : 2018-06-20
+         */
+        private int hasEndingPlan;//1显示0不显示
+        private String noticeMsg;//提示内容
+        private String smartPlanCode;//抽样数量
+        private String reChangePlanCode;//整改数量
+        private String expirePlanCode;//逾期
+        private String endingPlanCode;//首页提示
+        private String defaultPlanCode;//判断普通任务是否有任务
+        private String unReChangePlanCode;//判断整改不通过任务是否有任务
+        private ExtTaskBean extTask;
+
+        public String getDefaultPlanCode() {
+            return defaultPlanCode;
+        }
+
+        public String getUnReChangePlanCode() {
+            return unReChangePlanCode;
+        }
+
+        public void setUnReChangePlanCode(String unReChangePlanCode) {
+            this.unReChangePlanCode = unReChangePlanCode;
+        }
+
+        public void setDefaultPlanCode(String defaultPlanCode) {
+            this.defaultPlanCode = defaultPlanCode;
+        }
+
+        public String getSmartPlanCode() {
+            return smartPlanCode;
+        }
+
+        public String getReChangePlanCode() {
+            return reChangePlanCode;
+        }
+
+        public String getExpirePlanCode() {
+            return expirePlanCode;
+        }
+
+        public String getEndingPlanCode() {
+            return endingPlanCode;
+        }
+
+        public int getHasEndingPlan() {
+            return hasEndingPlan;
+        }
+
+        public void setHasEndingPlan(int hasEndingPlan) {
+            this.hasEndingPlan = hasEndingPlan;
+        }
+
+        public String getNoticeMsg() {
+            return noticeMsg;
+        }
+
+        public void setNoticeMsg(String noticeMsg) {
+            this.noticeMsg = noticeMsg;
+        }
+
+        public int getFinishNum() {
+            return finishNum;
+        }
+
+        public void setFinishNum(int finishNum) {
+            this.finishNum = finishNum;
+        }
+
+        public int getUnfinishNum() {
+            return unfinishNum;
+        }
+
+        public void setUnfinishNum(int unfinishNum) {
+            this.unfinishNum = unfinishNum;
+        }
+
+        public int getReviewNum() {
+            return reviewNum;
+        }
+
+        public void setReviewNum(int reviewNum) {
+            this.reviewNum = reviewNum;
+        }
+
+        public int getUnpassNum(){return unpassNum;}
+        public void setUnpassNum(int unpassNum){this.unpassNum=unpassNum;}
+
+        public String getComTel() {
+            return comTel;
+        }
+
+        public void setComTel(String comTel) {
+            this.comTel = comTel;
+        }
+
+        public ExtTaskBean getExtTask() {
+            return extTask;
+        }
+
+        public void setExtTask(ExtTaskBean extTask) {
+            this.extTask = extTask;
+        }
+
+        public static class ExtTaskBean {
+            /** 地址 */
+            private String address;
+            /*指派任务code*/
+            private String pCode;
+            /** 经度 */
+            private String longitude;
+            /** 纬度 */
+            private String latitude;
+            /** 最后时间 */
+            private String endTime;
+            /*需巡次数*/
+            private String checkNum;
+            /*已巡次数*/
+            private String postNum;
+
+            public String getCheckNum() {
+                return checkNum;
+            }
+
+            public void setCheckNum(String checkNum) {
+                this.checkNum = checkNum;
+            }
+
+            public String getPostNum() {
+                return postNum;
+            }
+
+            public void setPostNum(String postNum) {
+                this.postNum = postNum;
+            }
+
+            public String getPCdoe() {
+                return pCode;
+            }
+
+            public void setPCdoe(String pCode) {
+                this.pCode = pCode;
+            }
+
+            public String getAddress() {
+                return address;
+            }
+
+            public void setAddress(String address) {
+                this.address = address;
+            }
+
+            public String getLongitude() {
+                return longitude;
+            }
+
+            public void setLongitude(String longitude) {
+                this.longitude = longitude;
+            }
+
+            public String getLatitude() {
+                return latitude;
+            }
+
+            public void setLatitude(String latitude) {
+                this.latitude = latitude;
+            }
+
+            public String getEndTime() {
+                return endTime;
+            }
+
+            public void setEndTime(String endTime) {
+                this.endTime = endTime;
+            }
+        }
+    }
+}

+ 148 - 0
app/src/main/java/com/zhilin/patrol/bean/ImageInfo.java

xqd
@@ -0,0 +1,148 @@
+package com.zhilin.patrol.bean;
+
+import java.io.Serializable;
+
+public class ImageInfo implements Serializable {
+
+    private Long id;
+    private String consultingId;
+    private String imgPath;
+    private String imgName;
+    private String imgAddress;
+    private String imgSize;
+    private String uploadTime;
+    private Boolean uploadStatus;
+    private String fileId;
+    private String imgDir;
+    private String typeCode;
+    private Integer sortNo;
+
+    // KEEP FIELDS - put your custom fields here
+    // KEEP FIELDS END
+
+    public ImageInfo() {
+    }
+
+    public ImageInfo(Long id) {
+        this.id = id;
+    }
+
+    public ImageInfo(String imgPath) {
+        this.imgPath = imgPath;
+    }
+
+    public ImageInfo(Long id, String consultingId, String imgPath, String imgName, String imgAddress, String imgSize, String uploadTime, Boolean uploadStatus, String fileId, String imgDir, String typeCode, Integer sortNo, Boolean isShowDetail) {
+        this.id = id;
+        this.consultingId = consultingId;
+        this.imgPath = imgPath;
+        this.imgName = imgName;
+        this.imgAddress = imgAddress;
+        this.imgSize = imgSize;
+        this.uploadTime = uploadTime;
+        this.uploadStatus = uploadStatus;
+        this.fileId = fileId;
+        this.imgDir = imgDir;
+        this.typeCode = typeCode;
+        this.sortNo = sortNo;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getConsultingId() {
+        return consultingId;
+    }
+
+    public void setConsultingId(String consultingId) {
+        this.consultingId = consultingId;
+    }
+
+    public String getImgPath() {
+        return imgPath;
+    }
+
+    public void setImgPath(String imgPath) {
+        this.imgPath = imgPath;
+    }
+
+    public String getImgName() {
+        return imgName;
+    }
+
+    public void setImgName(String imgName) {
+        this.imgName = imgName;
+    }
+
+    public String getImgAddress() {
+        return imgAddress;
+    }
+
+    public void setImgAddress(String imgAddress) {
+        this.imgAddress = imgAddress;
+    }
+
+    public String getImgSize() {
+        return imgSize;
+    }
+
+    public void setImgSize(String imgSize) {
+        this.imgSize = imgSize;
+    }
+
+    public String getUploadTime() {
+        return uploadTime;
+    }
+
+    public void setUploadTime(String uploadTime) {
+        this.uploadTime = uploadTime;
+    }
+
+    public Boolean getUploadStatus() {
+        if (uploadStatus == null) {
+            return false;
+        }
+        return uploadStatus;
+    }
+
+    public void setUploadStatus(Boolean uploadStatus) {
+        this.uploadStatus = uploadStatus;
+    }
+
+    public String getFileId() {
+        return fileId;
+    }
+
+    public void setFileId(String fileId) {
+        this.fileId = fileId;
+    }
+
+    public String getImgDir() {
+        return imgDir;
+    }
+
+    public void setImgDir(String imgDir) {
+        this.imgDir = imgDir;
+    }
+
+    public String getTypeCode() {
+        return typeCode;
+    }
+
+    public void setTypeCode(String typeCode) {
+        this.typeCode = typeCode;
+    }
+
+    public Integer getSortNo() {
+        return sortNo;
+    }
+
+    public void setSortNo(Integer sortNo) {
+        this.sortNo = sortNo;
+    }
+
+}

+ 88 - 0
app/src/main/java/com/zhilin/patrol/bean/LoginEntity.java

xqd
@@ -0,0 +1,88 @@
+package com.zhilin.patrol.bean;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+ * 登录实体
+ */
+public class LoginEntity extends BaseEntity<LoginEntity.InfoListBean> {
+
+    public static class InfoListBean implements Serializable {
+        private int state;
+        /**
+         * userCode : u18082asdacj
+         * userRole : 2
+         * userName : 司机1
+         * userImg : http://www.huijiamao.cn/patrol/upfiles/userimg/a.jpg
+         * userSex : 男
+         */
+
+        private UserInfoBean userInfo;
+
+        public int getState() {
+            return state;
+        }
+
+        public void setState(int state) {
+            this.state = state;
+        }
+
+        public UserInfoBean getUserInfo() {
+            return userInfo;
+        }
+
+        public void setUserInfo(UserInfoBean userInfo) {
+            this.userInfo = userInfo;
+        }
+
+        public static class UserInfoBean implements Serializable{
+            private String userCode;
+            private int userRole;
+            private String userName;
+            private String userImg;
+            private String userSex;
+
+            public String getUserCode() {
+                return userCode;
+            }
+
+            public void setUserCode(String userCode) {
+                this.userCode = userCode;
+            }
+
+            public int getUserRole() {
+                return userRole;
+            }
+
+            public void setUserRole(int userRole) {
+                this.userRole = userRole;
+            }
+
+            public String getUserName() {
+                return userName;
+            }
+
+            public void setUserName(String userName) {
+                this.userName = userName;
+            }
+
+            public String getUserImg() {
+                return userImg;
+            }
+
+            public void setUserImg(String userImg) {
+                this.userImg = userImg;
+            }
+
+            public String getUserSex() {
+                return userSex;
+            }
+
+            public void setUserSex(String userSex) {
+                this.userSex = userSex;
+            }
+        }
+    }
+}

+ 88 - 0
app/src/main/java/com/zhilin/patrol/bean/LoginEntityNull.java

xqd
@@ -0,0 +1,88 @@
+package com.zhilin.patrol.bean;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+ * 登录实体
+ */
+public class LoginEntityNull extends BaseEntity<List<LoginEntity.InfoListBean>> {
+
+    public static class InfoListBean implements Serializable {
+        private int state;
+        /**
+         * userCode : u18082asdacj
+         * userRole : 2
+         * userName : 司机1
+         * userImg : http://www.huijiamao.cn/patrol/upfiles/userimg/a.jpg
+         * userSex : 男
+         */
+
+        private UserInfoBean userInfo;
+
+        public int getState() {
+            return state;
+        }
+
+        public void setState(int state) {
+            this.state = state;
+        }
+
+        public UserInfoBean getUserInfo() {
+            return userInfo;
+        }
+
+        public void setUserInfo(UserInfoBean userInfo) {
+            this.userInfo = userInfo;
+        }
+
+        public static class UserInfoBean implements Serializable{
+            private String userCode;
+            private int userRole;
+            private String userName;
+            private String userImg;
+            private String userSex;
+
+            public String getUserCode() {
+                return userCode;
+            }
+
+            public void setUserCode(String userCode) {
+                this.userCode = userCode;
+            }
+
+            public int getUserRole() {
+                return userRole;
+            }
+
+            public void setUserRole(int userRole) {
+                this.userRole = userRole;
+            }
+
+            public String getUserName() {
+                return userName;
+            }
+
+            public void setUserName(String userName) {
+                this.userName = userName;
+            }
+
+            public String getUserImg() {
+                return userImg;
+            }
+
+            public void setUserImg(String userImg) {
+                this.userImg = userImg;
+            }
+
+            public String getUserSex() {
+                return userSex;
+            }
+
+            public void setUserSex(String userSex) {
+                this.userSex = userSex;
+            }
+        }
+    }
+}

+ 142 - 0
app/src/main/java/com/zhilin/patrol/bean/MapLocationInfo.java

xqd
@@ -0,0 +1,142 @@
+/*
+ * @Title:  MapLocation.java
+ * @Description:  地图信息
+ * @version:  V1.0
+ * @data:  2015-12-16 下午2:03:01
+ * @Copyright:  Zac Co., Ltd. Copyright 2003-2015,  All rights reserved
+ */
+package com.zhilin.patrol.bean;
+
+import android.text.TextUtils;
+
+import java.io.Serializable;
+
+/**
+ * @author hanli
+ */
+public class MapLocationInfo implements Serializable {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+    /** 地址 */
+    private String address;
+    /** 省份 */
+    private String province;
+    /** 城市 */
+    private String city;
+    /** 区域 */
+    private String district;
+    /** 街道 */
+    private String street;
+    /** 纬度 */
+    private double latitude;
+    /** 精度 */
+    private double longitude;
+    /** 附近点 */
+    private String aoi;
+    /** 兴趣点 */
+    private String poi;
+
+    public MapLocationInfo() {
+    }
+
+    public MapLocationInfo(String address, String province, String city, String district, String street, double latitude, double longitude, String aoi, String poi) {
+        super();
+        this.address = address;
+        this.province = province;
+        this.city = city;
+        this.street = street;
+        this.district = district;
+        this.latitude = latitude;
+        this.longitude = longitude;
+        this.aoi = aoi;
+        this.poi = poi;
+    }
+
+    public String getAoi() {
+        return TextUtils.isEmpty(aoi) ? "" : aoi;
+    }
+
+    public void setAoi(String aoi) {
+        this.aoi = aoi;
+    }
+
+    public String getPoi() {
+        return TextUtils.isEmpty(poi) ? "" : poi;
+    }
+
+    public void setPoi(String poi) {
+        this.poi = poi;
+    }
+
+    public String getStreet() {
+        return TextUtils.isEmpty(street) ? "" : street;
+    }
+
+    public void setStreet(String street) {
+        this.street = street;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getProvince() {
+        return TextUtils.isEmpty(province) ? "" : province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    public String getCity() {
+        return TextUtils.isEmpty(city) ? "" : city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    public String getDistrict() {
+        return TextUtils.isEmpty(district) ? "" : district;
+    }
+
+    public void setDistrict(String district) {
+        this.district = district;
+    }
+
+    public double getLatitude() {
+        return latitude;
+    }
+
+    public void setLatitude(double latitude) {
+        this.latitude = latitude;
+    }
+
+    public double getLongitude() {
+        return longitude;
+    }
+
+    public void setLongitude(double longitude) {
+        this.longitude = longitude;
+    }
+
+    @Override
+    public String toString() {
+        return "MapLocationInfo{" +
+                "address='" + address + '\'' +
+                ", province='" + province + '\'' +
+                ", city='" + city + '\'' +
+                ", district='" + district + '\'' +
+                ", street='" + street + '\'' +
+                ", latitude=" + latitude +
+                ", longitude=" + longitude +
+                '}';
+    }
+}

+ 120 - 0
app/src/main/java/com/zhilin/patrol/bean/MyTaskEntity.java

xqd
@@ -0,0 +1,120 @@
+package com.zhilin.patrol.bean;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 我的任务实体
+ */
+public class MyTaskEntity extends BaseEntity<List<MyTaskEntity.InfoListBean>> {
+
+    public static class InfoListBean implements Serializable {
+        /** 显示名 */
+       private String  disName;
+
+       private List<Bean> sonArr;
+
+        public String getDisName() {
+            return disName;
+        }
+
+        public void setDisName(String disName) {
+            this.disName = disName;
+        }
+
+        public List<Bean> getSonArr() {
+            return sonArr;
+        }
+
+        public void setSonArr(List<Bean> sonArr) {
+            this.sonArr = sonArr;
+        }
+    }
+
+    public static class Bean implements Serializable {
+
+        /**
+         * address : 武汉常青花园花园5区
+         * taskNum : 3
+         * finishNum : 3
+         * isFinish : 1
+         * longitude : 114.239659
+         * latitude : 30.641005
+         */
+        /** 地址 */
+        private String address;
+        /** 任务数 */
+        private int taskNum;
+        /** 完成数 */
+        private int finishNum;
+        /*已巡数*/
+        private int postNum;
+        /** 是否完成  0-未完成 1-已完成*/
+        private int isFinish;
+        /** 经度 */
+        private String longitude;
+        /** 纬度 */
+        private String latitude;
+        private String pCode;
+        private String addrId;
+        public String getAddrId(){
+            return addrId;
+        }
+        public void setAddrId(String addrId){this.addrId=addrId;}
+        public int getPostNum(){return postNum;}
+        public void setPostNum(int patrolNum){this.postNum=patrolNum;}
+        public String getPCode(){
+            return pCode;
+        }
+        public void setPCode(String pCode){
+            this.pCode=pCode;
+        }
+        public String getAddress() {
+            return address;
+        }
+
+        public void setAddress(String address) {
+            this.address = address;
+        }
+
+        public int getTaskNum() {
+            return taskNum;
+        }
+
+        public void setTaskNum(int taskNum) {
+            this.taskNum = taskNum;
+        }
+
+        public int getFinishNum() {
+            return finishNum;
+        }
+
+        public void setFinishNum(int finishNum) {
+            this.finishNum = finishNum;
+        }
+
+        public int getIsFinish() {
+            return isFinish;
+        }
+
+        public void setIsFinish(int isFinish) {
+            this.isFinish = isFinish;
+        }
+
+        public String getLongitude() {
+            return longitude;
+        }
+
+        public void setLongitude(String longitude) {
+            this.longitude = longitude;
+        }
+
+        public String getLatitude() {
+            return latitude;
+        }
+
+        public void setLatitude(String latitude) {
+            this.latitude = latitude;
+        }
+    }
+}

+ 37 - 0
app/src/main/java/com/zhilin/patrol/bean/PatrolFormEntity.java

xqd
@@ -0,0 +1,37 @@
+package com.zhilin.patrol.bean;
+
+import java.io.Serializable;
+
+/**
+ * 巡查上报实体
+ */
+public class PatrolFormEntity extends BaseEntity<PatrolFormEntity.InfoListBean> {
+
+    public static class InfoListBean implements Serializable {
+
+        /**
+         * state : 0
+         * tkCode : 201898877as00
+         */
+        /** 记录量 */
+        private String state;
+        /** 返回的巡查记录唯一标识,上传图片用 */
+        private String tkCode;
+
+        public String getState() {
+            return state;
+        }
+
+        public void setState(String state) {
+            this.state = state;
+        }
+
+        public String getTkCode() {
+            return tkCode;
+        }
+
+        public void setTkCode(String tkCode) {
+            this.tkCode = tkCode;
+        }
+    }
+}

+ 38 - 0
app/src/main/java/com/zhilin/patrol/bean/PatrolFormEntityNull.java

xqd
@@ -0,0 +1,38 @@
+package com.zhilin.patrol.bean;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 巡查上报实体
+ */
+public class PatrolFormEntityNull extends BaseEntity<List<PatrolFormEntity.InfoListBean>> {
+
+    public static class InfoListBean implements Serializable {
+
+        /**
+         * state : 0
+         * tkCode : 201898877as00
+         */
+        /** 记录量 */
+        private String state;
+        /** 返回的巡查记录唯一标识,上传图片用 */
+        private String tkCode;
+
+        public String getState() {
+            return state;
+        }
+
+        public void setState(String state) {
+            this.state = state;
+        }
+
+        public String getTkCode() {
+            return tkCode;
+        }
+
+        public void setTkCode(String tkCode) {
+            this.tkCode = tkCode;
+        }
+    }
+}

+ 145 - 0
app/src/main/java/com/zhilin/patrol/bean/PatrolRecordEntity.java

xqd
@@ -0,0 +1,145 @@
+package com.zhilin.patrol.bean;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 巡查记录实体
+ */
+public class PatrolRecordEntity extends BaseEntity<List<PatrolRecordEntity.InfoListBean>> {
+
+    public static class InfoListBean implements Serializable {
+
+
+        /**
+         * tkCode : tk001
+         * address : 武汉市武昌区楚河汉街万达广场
+         * subTime : 2018.06-04 12:30
+         * taskType : -1
+         * isQuestion : 1
+         * isAssign : 1
+         * imgs : ["http://www.huijiamao.cn/patrol/upfiles/upimg/demo.jpg","http://www.huijiamao.cn/patrol/upfiles/upimg/demo.jpg","http://www.huijiamao.cn/patrol/upfiles/upimg/demo.jpg","http://www.huijiamao.cn/patrol/upfiles/upimg/demo.jpg"]
+         * passState : 0
+         * reason : 照片模糊,请重新上传!
+         */
+        /** 上报记录唯一识别码 */
+        private String planCode;
+        /** 小区地址 */
+        private  String pbCode;
+        private String address;
+        /** 上传时间 */
+        private String subTime;
+        /** 记录类型 */
+        private int taskType;
+        /** 是否是问题 */
+        private int isQuestion;
+        /** 是否是指派的任务 */
+        private int isAssign;
+        /** 审核状态 */
+        private int passState;
+        /** 备注 */
+        private String reason;
+        /** 不通过理由 */
+        private String infoExt;
+        /**  问题描述 */
+        private String question;
+        /** 图片数组 */
+        private List<String> imgs;
+
+        public String getPbCode() {
+            return pbCode;
+        }
+
+        public void setPbCode(String pbCode) {
+            this.pbCode = pbCode;
+        }
+
+        public String getQuestion() {
+            return question;
+        }
+
+        public void setQuestion(String question) {
+            this.question = question;
+        }
+
+        public String getInfoExt() {
+            return infoExt;
+        }
+
+        public void setInfoExt(String infoExt) {
+            this.infoExt = infoExt;
+        }
+
+        public String getPlanCode() {
+            return planCode;
+        }
+
+        public void setPlanCode(String planCode) {
+            this.planCode = planCode;
+        }
+
+        public String getAddress() {
+            return address;
+        }
+
+        public void setAddress(String address) {
+            this.address = address;
+        }
+
+        public String getSubTime() {
+            return subTime;
+        }
+
+        public void setSubTime(String subTime) {
+            this.subTime = subTime;
+        }
+
+        public int getTaskType() {
+            return taskType;
+        }
+
+        public void setTaskType(int taskType) {
+            this.taskType = taskType;
+        }
+
+        public int getIsQuestion() {
+            return isQuestion;
+        }
+
+        public void setIsQuestion(int isQuestion) {
+            this.isQuestion = isQuestion;
+        }
+
+        public int getIsAssign() {
+            return isAssign;
+        }
+
+        public void setIsAssign(int isAssign) {
+            this.isAssign = isAssign;
+        }
+
+        public int getPassState() {
+            return passState;
+        }
+
+        public void setPassState(int passState) {
+            this.passState = passState;
+        }
+
+        public String getReason() {
+            return reason;
+        }
+
+        public void setReason(String reason) {
+            this.reason = reason;
+        }
+
+        public List<String> getImgs() {
+            return imgs;
+        }
+
+        public void setImgs(List<String> imgs) {
+            this.imgs = imgs;
+        }
+    }
+}

+ 37 - 0
app/src/main/java/com/zhilin/patrol/bean/PatrolRecordNumEntity.java

xqd
@@ -0,0 +1,37 @@
+package com.zhilin.patrol.bean;
+
+import java.io.Serializable;
+
+/**
+ * 我的任务实体
+ */
+public class PatrolRecordNumEntity extends BaseEntity<PatrolRecordNumEntity.InfoListBean> {
+
+    public static class InfoListBean implements Serializable {
+
+        /**
+         * passIngNum : 1
+         * unPassNum : 2
+         */
+        /** 待审核的巡查记录数量 */
+        private int passIngNum;
+        /** 未通过的巡查记录数量 */
+        private int unPassNum;
+
+        public int getPassIngNum() {
+            return passIngNum;
+        }
+
+        public void setPassIngNum(int passIngNum) {
+            this.passIngNum = passIngNum;
+        }
+
+        public int getUnPassNum() {
+            return unPassNum;
+        }
+
+        public void setUnPassNum(int unPassNum) {
+            this.unPassNum = unPassNum;
+        }
+    }
+}

+ 93 - 0
app/src/main/java/com/zhilin/patrol/bean/QuestionKindEntity.java

xqd
@@ -0,0 +1,93 @@
+package com.zhilin.patrol.bean;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 问题类型实体
+ */
+public class QuestionKindEntity extends BaseEntity<List<QuestionKindEntity.InfoListBean>> implements Serializable{
+
+    public static class InfoListBean implements Serializable {
+        /** 标题 */
+        private String title;
+
+        private List<ListBean> kindSon;
+
+        public String getTitle() {
+            return title;
+        }
+
+        public void setTitle(String title) {
+            this.title = title;
+        }
+
+        public List<ListBean> getKindSon() {
+            return kindSon;
+        }
+
+        public void setKindSon(List<ListBean> kindSon) {
+            this.kindSon = kindSon;
+        }
+    }
+
+    public static class ListBean implements Serializable {
+        /** 标题 */
+        private String title;
+
+        private List<Bean> sonCell;
+
+        public String getTitle() {
+            return title;
+        }
+
+        public void setTitle(String title) {
+            this.title = title;
+        }
+
+        public List<Bean> getSonCell() {
+            return sonCell;
+        }
+
+        public void setSonCell(List<Bean> sonCell) {
+            this.sonCell = sonCell;
+        }
+    }
+
+    public static class Bean implements Serializable {
+        /**
+         * qCode : q001
+         * qName : 垃圾未分类
+         */
+        /** 问题编号 */
+        private String qCode;
+        /** 问题名称 */
+        private String qName;
+        /** 是否选中 */
+        private boolean isSelected;
+
+        public String getqCode() {
+            return qCode;
+        }
+
+        public void setqCode(String qCode) {
+            this.qCode = qCode;
+        }
+
+        public String getqName() {
+            return qName;
+        }
+
+        public void setqName(String qName) {
+            this.qName = qName;
+        }
+
+        public boolean isSelected() {
+            return isSelected;
+        }
+
+        public void setSelected(boolean selected) {
+            isSelected = selected;
+        }
+    }
+}

+ 49 - 0
app/src/main/java/com/zhilin/patrol/bean/ReconsiderActivityEntity.java

xqd
@@ -0,0 +1,49 @@
+package com.zhilin.patrol.bean;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class ReconsiderActivityEntity extends BaseEntity<List<ReconsiderActivityEntity.InfoListBean>>{
+
+    public static class InfoListBean implements Serializable {
+    private String pbCode;
+    private String cName;
+    private String status;
+    private String question;
+    private String rectify;
+    public String getRectify(){return rectify;}
+    public void setRectify(String rectify){this.rectify=rectify;}
+
+    public String getPbCode() {
+        return pbCode;
+    }
+
+        public String getStatus() {
+            return status;
+        }
+
+        public void setStatus(String status) {
+            this.status = status;
+        }
+
+        public void setPbCode(String pbCode) {
+        this.pbCode = pbCode;
+    }
+
+    public String getCName() {
+        return cName;
+    }
+
+    public void setCName(String cName) {
+        this.cName = cName;
+    }
+    public String getQuestion() {
+        return question;
+    }
+
+    public void setQuestion(String question) {
+        this.question = question;
+    }
+}
+
+}

+ 18 - 0
app/src/main/java/com/zhilin/patrol/bean/RectifyFormEntity.java

xqd
@@ -0,0 +1,18 @@
+package com.zhilin.patrol.bean;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class RectifyFormEntity extends BaseEntity<List<RectifyFormEntity.InfoListBean>>{
+    public static class InfoListBean implements Serializable {
+        private String url;
+
+        public String getUrl() {
+            return url;
+        }
+
+        public void setUrl(String url) {
+            this.url = url;
+        }
+    }
+}

+ 68 - 0
app/src/main/java/com/zhilin/patrol/bean/RectifyTaskEntity.java

xqd
@@ -0,0 +1,68 @@
+package com.zhilin.patrol.bean;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+public class RectifyTaskEntity extends BaseEntity<List<RectifyTaskEntity.InfoListBean>> {
+
+    public static class InfoListBean implements Serializable {
+        private String pbCode;
+        private String cName;
+        private String rectify_status;//"rectify_status": -1,0,1,2  "recheck_status": -1,0,1,
+        private String recheck_status;//recheck_status": -1,0,1, 0不能整改
+        private String question;
+        private String rectify;
+        private ArrayList urls;
+
+        public ArrayList getUrls() {
+            return urls;
+        }
+
+        public void setUrls(ArrayList urls) {
+            this.urls = urls;
+        }
+        public String getRectify(){return rectify;}
+        public void setRectify(String rectify){this.rectify=rectify;}
+
+        public String getPbCode() {
+            return pbCode;
+        }
+
+        public String getRecheck_status() {
+            return recheck_status;
+        }
+
+        public String getRectify_status() {
+            return rectify_status;
+        }
+
+        public void setRecheck_status(String recheck_status) {
+            this.recheck_status = recheck_status;
+        }
+
+        public void setRectify_status(String rectify_status) {
+            this.rectify_status = rectify_status;
+        }
+
+        public void setPbCode(String pbCode) {
+            this.pbCode = pbCode;
+        }
+
+        public String getCName() {
+            return cName;
+        }
+
+        public void setCName(String cName) {
+            this.cName = cName;
+        }
+        public String getQuestion() {
+            return question;
+        }
+
+        public void setQuestion(String question) {
+            this.question = question;
+        }
+    }
+
+}

+ 69 - 0
app/src/main/java/com/zhilin/patrol/bean/RectifyTaskImgEntity.java

xqd
@@ -0,0 +1,69 @@
+package com.zhilin.patrol.bean;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+public class RectifyTaskImgEntity extends BaseEntity<List<RectifyTaskImgEntity.InfoListBean>> {
+
+    public static class InfoListBean implements Serializable {
+        private String pbCode;
+        private String cName;
+        private String rectify_status;//"rectify_status": -1,0,1,2  "recheck_status": -1,0,1,
+        private String recheck_status;//recheck_status": -1,0,1, 0不能整改
+        private String question;
+        private String rectify;
+        private ArrayList urls;
+
+        public ArrayList getUrls() {
+            return urls;
+        }
+
+        public void setUrls(ArrayList urls) {
+            this.urls = urls;
+        }
+
+        public String getRectify(){return rectify;}
+        public void setRectify(String rectify){this.rectify=rectify;}
+
+        public String getPbCode() {
+            return pbCode;
+        }
+
+        public String getRecheck_status() {
+            return recheck_status;
+        }
+
+        public String getRectify_status() {
+            return rectify_status;
+        }
+
+        public void setRecheck_status(String recheck_status) {
+            this.recheck_status = recheck_status;
+        }
+
+        public void setRectify_status(String rectify_status) {
+            this.rectify_status = rectify_status;
+        }
+
+        public void setPbCode(String pbCode) {
+            this.pbCode = pbCode;
+        }
+
+        public String getCName() {
+            return cName;
+        }
+
+        public void setCName(String cName) {
+            this.cName = cName;
+        }
+        public String getQuestion() {
+            return question;
+        }
+
+        public void setQuestion(String question) {
+            this.question = question;
+        }
+    }
+
+}

+ 50 - 0
app/src/main/java/com/zhilin/patrol/bean/RectifyUploadEntity.java

xqd
@@ -0,0 +1,50 @@
+package com.zhilin.patrol.bean;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class RectifyUploadEntity extends BaseEntity<RectifyUploadEntity.InfoListBean>{
+
+/*    private String returnCode;
+    *//**
+     * 返回信息
+     *//*
+    private String returnMsg;
+
+    private  String infoList;
+
+    public String getReturnMsg() {
+        return returnMsg;
+    }
+
+    public String getReturnCode() {
+        return returnCode;
+    }
+
+    public String getInfoList() {
+        return infoList;
+    }
+
+    public void setReturnMsg(String returnMsg) {
+        this.returnMsg = returnMsg;
+    }
+
+    public void setReturnCode(String returnCode) {
+        this.returnCode = returnCode;
+    }
+
+    public void setInfoList(String infoList) {
+        this.infoList = infoList;
+    }*/
+ public static class InfoListBean implements Serializable {
+        private String state;
+
+        public String getState() {
+            return state;
+        }
+
+        public void setState(String state) {
+            this.state = state;
+        }
+    }
+}

+ 94 - 0
app/src/main/java/com/zhilin/patrol/bean/TaskTypeEntity.java

xqd
@@ -0,0 +1,94 @@
+package com.zhilin.patrol.bean;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 任务实体
+ */
+public class TaskTypeEntity extends BaseEntity<List<TaskTypeEntity.InfoListBean>> {
+
+    public static class InfoListBean implements Serializable {
+      private String cCode;
+      private String address;
+      private String taskNum;
+      private int finishNum;
+      private String isFinish;
+      private int postNum;
+      private String longitude;
+      private String latitude;
+      private List<String> questionArr;
+        private String pCode;
+        public String getPCode(){
+            return pCode;
+        }
+        public void setPCode(String pCode){
+            this.pCode=pCode;
+        }
+        public String getcCode() {
+            return cCode;
+        }
+
+        public void setcCode(String cCode) {
+            this.cCode = cCode;
+        }
+
+        public String getAddress() {
+            return address;
+        }
+
+        public void setAddress(String address) {
+            this.address = address;
+        }
+
+        public String getTaskNum() {
+            return taskNum;
+        }
+        public int getPostNum(){return postNum;}
+        public void setPostNum(int patrolNum){this.postNum=patrolNum;}
+        public void setTaskNum(String taskNum) {
+            this.taskNum = taskNum;
+        }
+
+        public int getFinishNum() {
+            return finishNum;
+        }
+
+        public void setFinishNum(int finishNum) {
+            this.finishNum = finishNum;
+        }
+
+        public String getIsFinish() {
+            return isFinish;
+        }
+
+        public void setIsFinish(String isFinish) {
+            this.isFinish = isFinish;
+        }
+
+        public String getLongitude() {
+            return longitude;
+        }
+
+        public void setLongitude(String longitude) {
+            this.longitude = longitude;
+        }
+
+        public String getLatitude() {
+            return latitude;
+        }
+
+        public void setLatitude(String latitude) {
+            this.latitude = latitude;
+        }
+
+        public List<String> getQuestionArr() {
+            return questionArr;
+        }
+
+        public void setQuestionArr(List<String> questionArr) {
+            this.questionArr = questionArr;
+        }
+    }
+
+}

+ 47 - 0
app/src/main/java/com/zhilin/patrol/http/HttpUrl.java

xqd
@@ -0,0 +1,47 @@
+package com.zhilin.patrol.http;
+
+/**
+ * 请求地址
+ */
+public class HttpUrl {
+    /** 域名地址 */
+//    private static final String DOMAIN_URL = "http://www.huijiamao.cn/patrol/index.php/ApiMobi/";
+//    private static final String DOMAIN_URL = "http://www.360zqb.com/patrol/index.php/ApiMobi/";
+//    private static final String DOMAIN_URL = "http://39.106.14.189:8081/";
+      private static final String DOMAIN_URL = "http://39.106.14.189:8081/index.php/ApiMobi/";
+//    private static final String DOMAIN_URL = "http://139.196.95.82/patrol/index.php/ApiMobi/";
+    /** 登录请求 */
+    public static final String LOGIN_URL = DOMAIN_URL + "login";
+    /** 首页请求 */
+    public static final String MAIN_URL = DOMAIN_URL + "getTask";
+    /** 我的任务请求 */
+    public static final String MY_TASK_URL = DOMAIN_URL + "myTask";
+    /** 获取巡查记录请求 */
+    public static final String TASK_LIST_URL = DOMAIN_URL + "taskList";
+    /** 获取巡查记录统计请求 */
+    public static final String TASK_STATISTICS_URL = DOMAIN_URL + "taskStatistics";
+    /** 问题类型请求 */
+    public static final String QUESTION_KIND_URL = DOMAIN_URL + "questionKind";
+    /** 上传巡查表单请求 */
+    public static final String PUBLISH_URL = DOMAIN_URL + "publish";
+    /** 上传巡查照片单请求 */
+    public static final String PUBLISH_IMG_URL = DOMAIN_URL + "publishImg";
+    /** 附近小区请求 */
+    public static final String GET_NEAR_ADDRESS_URL = DOMAIN_URL + "getNearAddress";
+    /** 获取任务请求 */
+    public static final String GET_REUPLOAD_LIST_URL = DOMAIN_URL + "getPlanList";
+    /** 结束任务请求 */
+    public static final String FINISH_TASK = DOMAIN_URL + "finishMyTask";
+
+    /** 整改任务请求 */
+    public static final String RECTIFY_TASK = DOMAIN_URL + "rectifyList";
+    /** 整改不通过任务请求 */
+    public static final String RECHECK_TASK = DOMAIN_URL + "recheckList";
+    /** 整改反馈上传 */
+    public static final String RECTIFY_POST = DOMAIN_URL + "postRectify";
+    /** 复议申请上传 */
+    public static final String RECHECK_POST = DOMAIN_URL + "postRecheck";
+    /** 整改图片 */
+    public static final String RECTIFYIMG_POST = DOMAIN_URL + "rectifyImg";
+
+}

+ 106 - 0
app/src/main/java/com/zhilin/patrol/tool/CheckPermissionUtils.java

xqd
@@ -0,0 +1,106 @@
+package com.zhilin.patrol.tool;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.PermissionInfo;
+import android.support.v4.content.ContextCompat;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Created by hezhe on 2016/6/16.
+ */
+public class CheckPermissionUtils {
+    private static final String TAG = CheckPermissionUtils.class.getSimpleName();
+
+    /**
+     * check this permission is need to request
+     *
+     * @param context         context
+     * @param permissionArray permissionArray
+     * @return
+     */
+    public static String[] getNeededPermission(Context context, String[] permissionArray) {
+        if (context == null || permissionArray == null || permissionArray.length == 0) {
+            return new String[]{};
+        }
+
+        List<String> permissionList = new ArrayList<>();
+        for (int i = 0; i < permissionArray.length; i++) {
+            if (CheckPermissionUtils.isNeedAddPermission(context, permissionArray[i])) {
+                permissionList.add(permissionArray[i]);
+            }
+        }
+        return permissionList.toArray(new String[permissionList.size()]);
+    }
+
+    /**
+     * check permission is need ?
+     *
+     * @return true: need permission  false: don't need permission
+     */
+    public static boolean isNeedAddPermission(Context context, String permission) {
+        return ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED;
+    }
+
+    /**
+     * check permission and show setting dialog for user
+     *
+     * @param getPermissionListener getPermissionListener
+     * @param context               context
+     * @param permissions           permissions
+     * @param grantResults          grantResults
+     */
+    public static void checkPermissionResult(OnHasGetPermissionListener getPermissionListener, Context context
+            , String[] permissions, int[] grantResults) {
+        if (context == null || permissions == null || grantResults == null || getPermissionListener == null) {
+            android.util.Log.d(TAG, "context=" + context + "\n"
+                    + "permissions=" + Arrays.toString(permissions) + "\n"
+                    + "grantResults=" + Arrays.toString(grantResults));
+            return;
+        }
+
+        Log.d(TAG, "permissions=" + Arrays.toString(permissions) + ",grantResults=" + Arrays.toString(grantResults));
+        // save the request permission
+        List<PermissionInfo> list = new ArrayList<>();//Your  permission list
+
+        if (grantResults.length <= 0) {
+            return;
+        }
+
+        // check permission request result
+        for (int i = 0; i < permissions.length; i++) {
+            if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
+                PermissionInfo info = null;
+                try {
+                    info = context.getPackageManager().getPermissionInfo(permissions[i], 0);
+                } catch (PackageManager.NameNotFoundException e) {
+                    e.printStackTrace();
+                }
+                if (info != null) {
+                    list.add(info);
+                }
+            }
+        }
+
+        // is we has all permission
+        if (list.size() == 0) {
+            Log.d(TAG, "checkPermissionResult onSuccess");
+            getPermissionListener.onSuccess();
+        } else {
+            getPermissionListener.onFail();
+            // show the dialog for user to setting
+            Log.d(TAG, "checkPermissionResult onFail");
+        }
+    }
+
+    public interface OnHasGetPermissionListener {
+        void onSuccess();
+
+        void onFail();
+    }
+
+}

+ 395 - 0
app/src/main/java/com/zhilin/patrol/tool/Compresser.java

xqd
@@ -0,0 +1,395 @@
+package com.zhilin.patrol.tool;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Matrix;
+import android.media.ExifInterface;
+import android.support.annotation.NonNull;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.text.MessageFormat;
+
+import static android.support.v4.util.Preconditions.checkNotNull;
+
+/**
+ * 图片压缩
+ * Created by hanlli on 2017/8/16.
+ */
+public class Compresser {
+
+    private static final String TAG = "Compress";
+
+    public static final int FIRST_GEAR = 1;
+
+    public static final int THIRD_GEAR = 3;
+
+    public static final int CUSTOM_GEAR = 4;
+
+    private static Compresser mInstance;
+
+
+    public static Compresser getInstance() {
+        if (mInstance == null) {
+            mInstance = new Compresser();
+        }
+        return mInstance;
+    }
+
+    private ByteArrayOutputStream mByteArrayOutputStream;
+
+    private int maxSize = 1024;//1M
+    private int maxWidth = 1080;
+    private int maxHeight = 1920;
+    private Bitmap.CompressFormat compressFormat = Bitmap.CompressFormat.JPEG;
+
+
+    public File compressImage(int gear, @NonNull File file, String dirPath) throws IOException {
+        switch (gear) {
+            case THIRD_GEAR:
+                return thirdCompress(file, dirPath);
+            case CUSTOM_GEAR:
+                return customCompress(file, dirPath);
+            case FIRST_GEAR:
+                return firstCompress(file, dirPath);
+            default:
+                return file;
+        }
+    }
+
+    private File thirdCompress(@NonNull File file, String dirPath) throws IOException {
+        String thumb = getFilePath(dirPath, file.getName());
+
+        double size;
+        String filePath = file.getAbsolutePath();
+
+        int angle = getImageSpinAngle(filePath);
+        int width = getImageSize(filePath)[0];
+        int height = getImageSize(filePath)[1];
+        boolean flip = width > height;
+        int thumbW = width % 2 == 1 ? width + 1 : width;
+        int thumbH = height % 2 == 1 ? height + 1 : height;
+
+        width = thumbW > thumbH ? thumbH : thumbW;
+        height = thumbW > thumbH ? thumbW : thumbH;
+
+        double scale = ((double) width / height);
+
+        if (scale <= 1 && scale > 0.5625) {
+            if (height < 1664) {
+                if (file.length() / 1024 < 150) {
+                    return file;
+                }
+
+                size = (width * height) / Math.pow(1664, 2) * 150;
+                size = size < 60 ? 60 : size;
+            } else if (height >= 1664 && height < 4990) {
+                thumbW = width / 2;
+                thumbH = height / 2;
+                size = (thumbW * thumbH) / Math.pow(2495, 2) * 300;
+                size = size < 60 ? 60 : size;
+            } else if (height >= 4990 && height < 10240) {
+                thumbW = width / 4;
+                thumbH = height / 4;
+                size = (thumbW * thumbH) / Math.pow(2560, 2) * 300;
+                size = size < 100 ? 100 : size;
+            } else {
+                int multiple = height / 1280 == 0 ? 1 : height / 1280;
+                thumbW = width / multiple;
+                thumbH = height / multiple;
+                size = (thumbW * thumbH) / Math.pow(2560, 2) * 300;
+                size = size < 100 ? 100 : size;
+            }
+        } else if (scale <= 0.5625 && scale > 0.5) {
+            if (height < 1280 && file.length() / 1024 < 200) {
+                return file;
+            }
+
+            int multiple = height / 1280 == 0 ? 1 : height / 1280;
+            thumbW = width / multiple;
+            thumbH = height / multiple;
+            size = (thumbW * thumbH) / (1440.0 * 2560.0) * 400;
+            size = size < 100 ? 100 : size;
+        } else {
+            int multiple = (int) Math.ceil(height / (1280.0 / scale));
+            thumbW = width / multiple;
+            thumbH = height / multiple;
+            size = ((thumbW * thumbH) / (1280.0 * (1280 / scale))) * 500;
+            size = size < 100 ? 100 : size;
+        }
+
+        return compress(file, scale, filePath, thumb, flip ? thumbH : thumbW, flip ? thumbW : thumbH, angle,
+                (long) size);
+    }
+
+    private File firstCompress(@NonNull File file, String dirPath) throws IOException {
+        int minSize = 60;
+        int longSide = 720;
+        int shortSide = 1280;
+
+        String thumbFilePath = getFilePath(dirPath, file.getName());
+        String filePath = file.getAbsolutePath();
+
+        long size = 0;
+        long maxSize = file.length() / 5;
+
+        int angle = getImageSpinAngle(filePath);
+        int[] imgSize = getImageSize(filePath);
+        int width = 0, height = 0;
+        double scale;
+        if (imgSize[0] <= imgSize[1]) {
+            scale = (double) imgSize[0] / (double) imgSize[1];
+            if (scale <= 1.0 && scale > 0.5625) {
+                width = imgSize[0] > shortSide ? shortSide : imgSize[0];
+                height = width * imgSize[1] / imgSize[0];
+                size = minSize;
+            } else if (scale <= 0.5625) {
+                height = imgSize[1] > longSide ? longSide : imgSize[1];
+                width = height * imgSize[0] / imgSize[1];
+                size = maxSize;
+            }
+        } else {
+            scale = (double) imgSize[1] / (double) imgSize[0];
+            if (scale <= 1.0 && scale > 0.5625) {
+                height = imgSize[1] > shortSide ? shortSide : imgSize[1];
+                width = height * imgSize[0] / imgSize[1];
+                size = minSize;
+            } else if (scale <= 0.5625) {
+                width = imgSize[0] > longSide ? longSide : imgSize[0];
+                height = width * imgSize[1] / imgSize[0];
+                size = maxSize;
+            }
+        }
+
+        return compress(file, scale, filePath, thumbFilePath, width, height, angle, size);
+    }
+
+
+    /**
+     * 压缩图片
+     */
+    public File customCompress(@NonNull File file, String dirPath) throws IOException {
+        String thumbFilePath = getFilePath(dirPath, file.getName());
+        String filePath = file.getAbsolutePath();
+
+        int angle = getImageSpinAngle(filePath);
+        long fileSize = maxSize > 0 && maxSize < file.length() / 1024 ? maxSize
+                : file.length() / 1024;
+
+        int[] size = getImageSize(filePath);
+        int width = size[0];
+        int height = size[1];
+
+        if (maxSize > 0 && maxSize < file.length() / 1024f) {
+            // find a suitable size
+            float scale = (float) Math.sqrt(file.length() / 1024f / maxSize);
+            width = (int) (width / scale);
+            height = (int) (height / scale);
+        }
+
+        // check the width&height
+        if (maxWidth > 0) {
+            width = Math.min(width, maxWidth);
+        }
+        if (maxHeight > 0) {
+            height = Math.min(height, maxHeight);
+        }
+        float scale = Math.min((float) width / size[0], (float) height / size[1]);
+        width = (int) (size[0] * scale);
+        height = (int) (size[1] * scale);
+
+        //        // 不压缩
+        //        if (maxSize > file.length() / 1024f && scale == 1) {
+        //            return file;
+        //        }
+
+        return compress(file, scale, filePath, thumbFilePath, width, height, angle, fileSize);
+    }
+
+    /**
+     * 创建中间缓存文件
+     * @param fileName
+     * @return file
+     */
+    private String getFilePath(String dirPath, String fileName) {
+        File dir = new File(dirPath);
+        if (!dir.exists()) {
+            dir.mkdirs();
+        }
+        String hostName = fileName;
+        String extName = "";
+        int pos = fileName.lastIndexOf(".");
+        if (pos != -1) {
+            hostName = fileName.substring(0, pos);
+            extName = fileName.substring(pos + 1);
+        }
+
+        File tempFile = new File(dirPath, fileName);
+        int i = 1;
+        while (tempFile.exists()) {
+            if (extName == null || extName.length() == 0) {
+                fileName = MessageFormat.format("{0}({1})", hostName, i++);
+            } else {
+                fileName = MessageFormat.format("{0}({1}).{2}", hostName, i++, extName);
+            }
+            tempFile = new File(dirPath, fileName);
+        }
+
+        return tempFile.getAbsolutePath();
+    }
+
+    /**
+     * obtain the image rotation angle
+     * @param path path of target image
+     */
+    private int getImageSpinAngle(String path) {
+        int degree = 0;
+        ExifInterface exifInterface = null;
+        try {
+            exifInterface = new ExifInterface(path);
+        } catch (IOException e) {
+            // 图片不支持获取角度
+            return 0;
+        }
+        int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,
+                ExifInterface.ORIENTATION_NORMAL);
+        switch (orientation) {
+            case ExifInterface.ORIENTATION_ROTATE_90:
+                degree = 90;
+                break;
+            case ExifInterface.ORIENTATION_ROTATE_180:
+                degree = 180;
+                break;
+            case ExifInterface.ORIENTATION_ROTATE_270:
+                degree = 270;
+                break;
+        }
+        return degree;
+    }
+
+    /**
+     * obtain the image's width and height
+     * @param imagePath the path of image
+     */
+    private static int[] getImageSize(String imagePath) {
+        int[] res = new int[2];
+
+        BitmapFactory.Options options = new BitmapFactory.Options();
+        options.inJustDecodeBounds = true;
+        options.inSampleSize = 1;
+        BitmapFactory.decodeFile(imagePath, options);
+
+        res[0] = options.outWidth;
+        res[1] = options.outHeight;
+
+        return res;
+    }
+
+    /**
+     * 指定参数压缩图片
+     * create the thumbnail with the true rotate angle
+     * @param largeImagePath the big image path
+     * @param thumbFilePath the thumbnail path
+     * @param width width of thumbnail
+     * @param height height of thumbnail
+     * @param angle rotation angle of thumbnail
+     * @param size the file size of image
+     */
+    private File compress(File file, double scale, String largeImagePath, String thumbFilePath, int width, int height,
+                          int angle, long size) throws IOException {
+        Bitmap thbBitmap;
+        // 不压缩
+        if (maxSize > file.length() / 1024f && scale == 1) {
+            thbBitmap = BitmapFactory.decodeFile(largeImagePath);
+        } else {
+            thbBitmap = compress(largeImagePath, width, height);
+        }
+        thbBitmap = rotatingImage(angle, thbBitmap);
+        return saveImage(thumbFilePath, thbBitmap, size);
+    }
+
+    /**
+     * 旋转图片
+     * rotate the image with specified angle
+     * @param angle the angle will be rotating 旋转的角度
+     * @param bitmap target image               目标图片
+     */
+    private static Bitmap rotatingImage(int angle, Bitmap bitmap) {
+        //rotate image
+        Matrix matrix = new Matrix();
+        matrix.postRotate(angle);
+
+        //create a new image
+        return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix,
+                true);
+    }
+
+    /**
+     * obtain the thumbnail that specify the size
+     * @param imagePath the target image path
+     * @param width the width of thumbnail
+     * @param height the height of thumbnail
+     * @return {@link Bitmap}
+     */
+    private Bitmap compress(String imagePath, int width, int height) {
+        BitmapFactory.Options options = new BitmapFactory.Options();
+        options.inJustDecodeBounds = true;
+        BitmapFactory.decodeFile(imagePath, options);
+
+        int outH = options.outHeight;
+        int outW = options.outWidth;
+        int inSampleSize = 1;
+
+        while (outH / inSampleSize > height || outW / inSampleSize > width) {
+            inSampleSize *= 2;
+        }
+
+        options.inSampleSize = inSampleSize;
+        options.inJustDecodeBounds = false;
+
+        return BitmapFactory.decodeFile(imagePath, options);
+    }
+
+    /**
+     * 保存图片到指定路径
+     * Save image with specified size
+     * @param filePath the image file save path 储存路径
+     * @param bitmap the image what be save   目标图片
+     * @param size the file size of image   期望大小
+     */
+    private File saveImage(String filePath, Bitmap bitmap, long size) throws IOException {
+        checkNotNull(bitmap, TAG + "bitmap cannot be null");
+
+        File result = new File(filePath.substring(0, filePath.lastIndexOf("/")));
+
+        if (!result.exists() && !result.mkdirs()) {
+            return null;
+        }
+
+        if (mByteArrayOutputStream == null) {
+            mByteArrayOutputStream = new ByteArrayOutputStream(
+                    bitmap.getWidth() * bitmap.getHeight());
+        } else {
+            mByteArrayOutputStream.reset();
+        }
+
+        int options = 100;
+        bitmap.compress(compressFormat, options, mByteArrayOutputStream);
+
+        while (mByteArrayOutputStream.size() / 1024 > size && options > 60) {
+            mByteArrayOutputStream.reset();
+            options -= 6;
+            bitmap.compress(compressFormat, options, mByteArrayOutputStream);
+        }
+        bitmap.recycle();
+
+        FileOutputStream fos = new FileOutputStream(filePath);
+        mByteArrayOutputStream.writeTo(fos);
+        fos.close();
+
+        return new File(filePath);
+    }
+
+}

+ 46 - 0
app/src/main/java/com/zhilin/patrol/tool/DensityUtil.java

xqd
@@ -0,0 +1,46 @@
+package com.zhilin.patrol.tool;
+
+import android.content.Context;
+import android.util.DisplayMetrics;
+
+public class DensityUtil {
+    private static float scale;
+
+    /**
+     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
+     */
+    public static int dip2px(Context context, float dpValue) {
+        if (scale == 0)
+            scale = context.getResources().getDisplayMetrics().density;
+        return (int) (dpValue * scale + 0.5f);
+    }
+
+    /**
+     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
+     */
+    public static int dip2px(float dpValue, float density) {
+        return (int) (dpValue * density + 0.5f);
+    }
+
+    /**
+     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
+     */
+    public static int px2dip(Context context, float pxValue) {
+        if (scale == 0)
+            scale = context.getResources().getDisplayMetrics().density;
+        return (int) (pxValue / scale + 0.5f);
+    }
+
+    /**
+     * 获取屏幕的分辨率
+     *
+     * @param context
+     * @return
+     */
+    public static DisplayMetrics getDisplayMetrics(Context context) {
+        //		DisplayMetrics dm = new DisplayMetrics();
+        return context.getResources().getDisplayMetrics();
+        //		((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(dm);
+        //		return dm;
+    }
+}

+ 52 - 0
app/src/main/java/com/zhilin/patrol/tool/DialogUtil.java

xqd
@@ -0,0 +1,52 @@
+package com.zhilin.patrol.tool;
+
+import android.app.Activity;
+import android.text.TextUtils;
+import android.view.View;
+
+import com.zhilin.patrol.R;
+import com.zhilin.patrol.ui.activity.LoginActivity;
+import com.zhilin.patrol.views.AlertDialog;
+
+/**
+ * 弹框帮助类
+ */
+public class DialogUtil {
+
+    /**
+     * 网络失败提示
+     *
+     * @param activity
+     */
+    public static void showNetFailDialog(Activity activity) {
+        new AlertDialog(activity).builder()
+                .setTitle(activity.getString(R.string.tv_tishi))
+                .setMsg(activity.getString(R.string.tv_error))
+                .setNegativeButton(activity.getString(R.string.ok), new View.OnClickListener() {
+                    @Override
+                    public void onClick(View v) {
+
+                    }
+                }).show();
+    }
+
+    /**
+     * 显示错误信息
+     *
+     * @param activity
+     * @param errText
+     */
+    public static void showErrDialog(Activity activity, String errText) {
+        if (TextUtils.isEmpty(errText)) return;
+        new AlertDialog(activity).builder()
+                .setTitle(activity.getString(R.string.tv_tishi))
+                .setMsg(errText)
+                .setNegativeButton(activity.getString(R.string.ok), new View.OnClickListener() {
+                    @Override
+                    public void onClick(View v) {
+
+                    }
+                }).show();
+    }
+
+}

+ 401 - 0
app/src/main/java/com/zhilin/patrol/tool/EncryptUtil.java

xqd
@@ -0,0 +1,401 @@
+package com.zhilin.patrol.tool;
+
+import android.util.Log;
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.Base64;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.security.Key;
+import java.security.MessageDigest;
+import java.security.SecureRandom;
+import java.security.spec.AlgorithmParameterSpec;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.UUID;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.GZIPOutputStream;
+
+import javax.crypto.Cipher;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.DESKeySpec;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+/**
+ * 加密解密工具类
+ *
+ */
+public class EncryptUtil {
+
+    private static final int BUFFER_SIZE = 1024;
+
+    /**
+     * 将明文,按照MD5方式转成暗文
+     *
+     * @param password :表示明文
+     * @return : 表示对应的暗文
+     */
+    public static String encodeByMd5(String password) throws Exception {
+        if (password == null || password.trim().length() == 0) {
+            return null;
+        }
+        // 创建MessageDigest类
+        MessageDigest md5 = MessageDigest.getInstance("MD5");
+        // 将明文转暗文
+        byte[] byteArray = md5.digest(password.getBytes());
+        // 暗文
+        String passwordMD5 = byteArrayToHexString(byteArray);
+        Log.i("MD5",passwordMD5);
+        return passwordMD5.toLowerCase();
+    }
+
+    /**
+     * 将byte[]中的每一个byte类型的值,转成16进制数
+     */
+    private static String byteArrayToHexString(byte[] byteArray) {
+        StringBuffer sb = new StringBuffer();
+        for (byte b : byteArray) {
+            sb.append(byteToHexString(b));
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 将byte,转成16进制数
+     */
+    private static String byteToHexString(byte b) {
+        // 将byte值覆给int型值
+        int n = b;
+        // 如果n是负数的话
+        if (n < 0) {
+            n = n + 256;
+        }
+        // n除以16的商,作为高位
+        int height = n / 16;// 14
+        int low = n % 16;// 1
+        // 查表得到对应的16进制数
+        return hex[height] + hex[low];
+    }
+
+    private static String[] hex = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"};
+
+    /**
+     * GZIP 加密
+     *
+     * @param str
+     * @return
+     */
+    public static byte[] encryptGZIP(String str) {
+        if (str == null || str.length() == 0) {
+            return null;
+        }
+
+        try {
+            // gzip压缩
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            GZIPOutputStream gzip = new GZIPOutputStream(baos);
+            gzip.write(str.getBytes("UTF-8"));
+
+            gzip.close();
+
+            byte[] encode = baos.toByteArray();
+
+            baos.flush();
+            baos.close();
+
+            // base64 加密
+            return encode;
+            // return new String(encode, "UTF-8");
+
+        } catch (IOException e) {
+        }
+
+        return null;
+    }
+
+    public static String getUuid() {
+        return UUID.randomUUID().toString();
+    }
+
+    /**
+     * GZIP 解密
+     *
+     * @param str
+     * @return
+     */
+    public static String decryptGZIP(String str) {
+        if (str == null || str.length() == 0) {
+            return null;
+        }
+
+        try {
+
+            byte[] decode = str.getBytes("UTF-8");
+
+            // gzip 解压缩
+            ByteArrayInputStream bais = new ByteArrayInputStream(decode);
+            GZIPInputStream gzip = new GZIPInputStream(bais);
+
+            byte[] buf = new byte[BUFFER_SIZE];
+            int len = 0;
+
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+            while ((len = gzip.read(buf, 0, BUFFER_SIZE)) != -1) {
+                baos.write(buf, 0, len);
+            }
+            gzip.close();
+            baos.flush();
+
+            decode = baos.toByteArray();
+
+            baos.close();
+
+            return new String(decode, "UTF-8");
+
+        } catch (IOException e) {
+        }
+
+        return null;
+    }
+
+    /**
+     * 十六进制字符串 转换为 byte[]
+     *
+     * @param hexString the hex string
+     * @return byte[]
+     */
+    public static byte[] hexStringToBytes(String hexString) {
+        if (hexString == null || hexString.equals("")) {
+            return null;
+        }
+        int length = hexString.length() / 2;
+        char[] hexChars = hexString.toCharArray();
+        byte[] d = new byte[length];
+        for (int i = 0; i < length; i++) {
+            int pos = i * 2;
+            d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
+        }
+        return d;
+    }
+
+    /**
+     * Convert char to byte
+     *
+     * @param c char
+     * @return byte
+     */
+    private static byte charToByte(char c) {
+        return (byte) "0123456789abcdef".indexOf(c);
+    }
+
+    /**
+     * byte[] 转换为 十六进制字符串
+     *
+     * @param src
+     * @return
+     */
+    public static String bytesToHexString(byte[] src) {
+        StringBuilder stringBuilder = new StringBuilder("");
+
+        if (src == null || src.length <= 0) {
+            return null;
+        }
+        for (int i = 0; i < src.length; i++) {
+            int v = src[i] & 0xFF;
+            String hv = Integer.toHexString(v);
+            if (hv.length() < 2) {
+                stringBuilder.append(0);
+            }
+            stringBuilder.append(hv);
+        }
+        return stringBuilder.toString();
+    }
+
+    /**
+     * 将二进制转换成16进制
+     *
+     * @param buf
+     * @return
+     */
+    public static String parseByte2HexStr(byte buf[]) {
+        StringBuffer sb = new StringBuffer();
+        for (int i = 0; i < buf.length; i++) {
+            String hex = Integer.toHexString(buf[i] & 0xFF);
+            if (hex.length() == 1) {
+                hex = '0' + hex;
+            }
+            sb.append(hex.toUpperCase());
+        }
+        return sb.toString();
+    }
+
+    /**
+     * AES128加密
+     *
+     * @param sSrc
+     * @param sKey
+     * @return
+     * @throws Exception
+     */
+    public static String encryptByAES(String sSrc, String sKey) throws Exception {
+        // 判断Key是否正确
+        if (sKey == null) {
+            System.out.print("Key为空null");
+            return null;
+        }
+        byte[] raw = sKey.getBytes("utf-8");
+        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
+        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");// "算法/模式/补码方式"
+        IvParameterSpec iv = new IvParameterSpec(new byte[16]);
+        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
+        byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
+        return Base64.encodeToString(encrypted, Base64.NO_WRAP);// 此处使用BASE64做转码功能,同时能起到2次加密的作用
+    }
+
+
+    /**
+     * AES128解密
+     *
+     * @param sSrc
+     * @param sKey
+     * @return
+     * @throws Exception
+     */
+    public static String decryptByAES(String sSrc, String sKey) throws Exception {
+        try {
+            // 判断Key是否正确
+            if (sKey == null) {
+                System.out.print("Key为空null");
+                return null;
+            }
+            byte[] raw = sKey.getBytes("utf-8");
+            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
+            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+            IvParameterSpec iv = new IvParameterSpec(new byte[16]);
+            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
+            byte[] encrypted1 = Base64.decode(sSrc, Base64.NO_WRAP);// 先用base64解密
+            try {
+                byte[] original = cipher.doFinal(encrypted1);
+                String originalString = new String(original, "utf-8");
+                return originalString;
+            } catch (Exception e) {
+                return null;
+            }
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    /**
+     * 为字符串添加时间戳
+     *
+     * @param token 加密token
+     * @return
+     */
+    public static String enTokenTimes(Context context, String token) {
+        if (TextUtils.isEmpty(token)) {
+            return "";
+        }
+        String timesToken = token;
+        String times = System.currentTimeMillis() + "";
+
+        if (!TextUtils.isEmpty(times)) {
+            timesToken = timesToken + ":" + times;
+        }
+        return timesToken;
+    }
+
+    /**
+     * 获取含时间撮中的Token
+     *
+     * @param token token值
+     * @return
+     */
+    public static String deTokenTimes(String token) {
+        if (TextUtils.isEmpty(token)) {
+            return "";
+        }
+        String[] tokens = token.split(":");
+        return tokens[0];
+    }
+
+    /**
+     * DES算法,加密
+     *
+     * @param data 待加密字符串
+     * @param key  加密私钥,长度不能够小于8位
+     * @return 加密后的字节数组,一般结合Base64编码使用
+     * 异常
+     */
+    public static String encode(String key, String data) throws Exception {
+        return encode(key, data.getBytes());
+    }
+
+    /**
+     * DES算法,加密
+     *
+     * @param data 待加密字符串
+     * @param key  加密私钥,长度不能够小于8位
+     * @return 加密后的字节数组,一般结合Base64编码使用
+     * 异常
+     */
+    public static String encode(String key, byte[] data) throws Exception {
+        try {
+            DESKeySpec dks = new DESKeySpec(key.getBytes());
+
+            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
+            // key的长度不能够小于8位字节
+            Key secretKey = keyFactory.generateSecret(dks);
+            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
+            IvParameterSpec iv = new IvParameterSpec("7a2156h3".getBytes());
+            AlgorithmParameterSpec paramSpec = iv;
+            cipher.init(Cipher.ENCRYPT_MODE, secretKey, paramSpec);
+
+            byte[] bytes = cipher.doFinal(data);
+
+            return Base64.encodeToString(bytes, Base64.NO_WRAP);
+        } catch (Exception e) {
+            throw new Exception(e);
+        }
+    }
+
+    /**
+     * DES算法,解密
+     *
+     * @param data 待解密字符串
+     * @param key  解密私钥,长度不能够小于8位
+     * @return 解密后的字节数组
+     * @throws Exception 异常
+     */
+    public static byte[] decode(String key, byte[] data) throws Exception {
+        try {
+            SecureRandom sr = new SecureRandom();
+            DESKeySpec dks = new DESKeySpec(key.getBytes());
+            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
+            // key的长度不能够小于8位字节
+            Key secretKey = keyFactory.generateSecret(dks);
+            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
+            IvParameterSpec iv = new IvParameterSpec("7a2156h3".getBytes());
+            AlgorithmParameterSpec paramSpec = iv;
+            cipher.init(Cipher.DECRYPT_MODE, secretKey, paramSpec);
+            return cipher.doFinal(data);
+        } catch (Exception e) {
+            throw new Exception(e);
+        }
+    }
+    /**
+     * 获取系统时间
+     *
+     * @return
+     */
+    public static String getSystemTiem() {
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd HHmmssSS");
+        Date curDate = new Date(System.currentTimeMillis());//获取当前时间
+        return formatter.format(curDate)+"00";
+    }
+
+}

+ 128 - 0
app/src/main/java/com/zhilin/patrol/tool/IpUtils.java

xqd
@@ -0,0 +1,128 @@
+package com.zhilin.patrol.tool;
+
+import android.content.Context;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.util.Log;
+
+import java.net.Inet4Address;
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.util.Enumeration;
+
+/**
+ * IP地址工具类
+ */
+public class IpUtils {
+
+    public static final String TAG = "IpUtils";
+
+    /**
+     * gps获取ip
+     *
+     * @return
+     */
+    public static String getLocalIpAddress() {
+        try {
+            for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
+                NetworkInterface intf = en.nextElement();
+                for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
+                    InetAddress inetAddress = enumIpAddr.nextElement();
+                    if (!inetAddress.isLoopbackAddress()) {
+                        return inetAddress.getHostAddress().toString();
+                    }
+                }
+            }
+        } catch (Exception ex) {
+            Log.e(TAG,"获取gps ip失败");
+        }
+        return null;
+    }
+
+    /**
+     * wifi获取ip
+     *
+     * @param context
+     * @return
+     */
+    public static String getIp(Context context) {
+        try {
+            //获取wifi服务
+            WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+            //判断wifi是否开启
+            if (!wifiManager.isWifiEnabled()) {
+                return null;
+//                wifiManager.setWifiEnabled(true);
+            }
+            WifiInfo wifiInfo = wifiManager.getConnectionInfo();
+            int ipAddress = wifiInfo.getIpAddress();
+            String ip = intToIp(ipAddress);
+            return ip;
+        } catch (Exception e) {
+            Log.e(TAG,"获取wifi ip失败");
+        }
+        return null;
+    }
+
+    /**
+     * 格式化ip地址(192.168.11.1)
+     *
+     * @param i
+     * @return
+     */
+    private static String intToIp(int i) {
+
+        return (i & 0xFF) + "." +
+                ((i >> 8) & 0xFF) + "." +
+                ((i >> 16) & 0xFF) + "." +
+                (i >> 24 & 0xFF);
+    }
+
+    /**
+     * 3G/4g网络IP
+     */
+    public static String getIpAddress() {
+        try {
+            for (Enumeration<NetworkInterface> en = NetworkInterface
+                    .getNetworkInterfaces(); en.hasMoreElements(); ) {
+                NetworkInterface intf = en.nextElement();
+                for (Enumeration<InetAddress> enumIpAddr = intf
+                        .getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
+                    InetAddress inetAddress = enumIpAddr.nextElement();
+                    if (!inetAddress.isLoopbackAddress()
+                            && inetAddress instanceof Inet4Address) {
+                        // if (!inetAddress.isLoopbackAddress() && inetAddress
+                        // instanceof Inet6Address) {
+                        return inetAddress.getHostAddress().toString();
+                    }
+                }
+            }
+        } catch (Exception e) {
+            Log.e(TAG,"获取移动网络 ip失败");
+        }
+        return null;
+    }
+
+    /**
+     * 获取本机的ip地址(3中方法都包括)
+     *
+     * @param context
+     * @return
+     */
+    public static String getIpAddress(Context context) {
+        String ip = null;
+        try {
+            ip = getIp(context);
+            if (ip == null) {
+                ip = getIpAddress();
+                if (ip == null) {
+                    ip = getLocalIpAddress();
+                }
+            }
+        } catch (Exception e) {
+            Log.e(TAG,"获取ip失败");
+        }
+        return ip;
+    }
+
+}

+ 88 - 0
app/src/main/java/com/zhilin/patrol/tool/JsonUtils.java

xqd
@@ -0,0 +1,88 @@
+package com.zhilin.patrol.tool;
+
+import android.os.Debug;
+import android.util.Log;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonSyntaxException;
+import com.google.gson.reflect.TypeToken;
+
+/**
+ * 
+ * @ClassName: JsonUtils
+ */
+public class JsonUtils {
+
+	/**
+	 * json通过Gson框架生成对象
+	 * 
+	 * @param jsonData
+	 * @param c
+	 * @return
+	 */
+	public static <T> Object parseJson2Obj(String jsonData, Class<T> c) {
+		if (null == jsonData) {
+			return null;
+		}
+		Object obj = null;
+		try {
+			Gson gson = new Gson();
+			obj = gson.fromJson(jsonData, c);
+		} catch (JsonSyntaxException e) {
+			e.printStackTrace();
+		}
+		return obj;
+	}
+
+	/**
+	 * json通过Gson框架生成对象
+	 * 
+	 * @param jsonData
+	 * @return
+	 */
+	public static <T> Object parseJson2Obj(String jsonData, TypeToken<T> type) {
+		if (null == jsonData) {
+			return null;
+		}
+		Gson gson = new Gson();
+		Object obj = gson.fromJson(jsonData, type.getType());
+		return obj;
+	}
+
+	/**
+	 * 将java对象转换成json对象
+	 * 
+	 * @param obj
+	 * @return
+	 */
+	public static String parseObj2Json(Object obj) {
+
+		if (null == obj) {
+			return null;
+		}
+		Gson gson = new GsonBuilder().serializeNulls().create();
+		// Gson gson = new Gson();
+		String objstr = gson.toJson(obj);
+		if (Debug.isDebuggerConnected()) {
+			Log.i("parseObj2Json", objstr);
+		}
+		return objstr;
+	}
+	public static Object parseObjJson(String s,Class c) {
+
+		if (null == s) {
+			return null;
+		}
+		Gson gson = new Gson();
+		Object obj = gson.fromJson(s,c);
+//		Gson gson = new GsonBuilder().serializeNulls().create();
+		// Gson gson = new Gson();
+//		String str = gson.toJson(s);
+		if (Debug.isDebuggerConnected()) {
+			Log.i("parseObj2Json", obj.toString());
+		}
+		return obj;
+	}
+
+}

+ 263 - 0
app/src/main/java/com/zhilin/patrol/tool/LocationUtils.java

xqd
@@ -0,0 +1,263 @@
+package com.zhilin.patrol.tool;
+
+import com.amap.api.location.AMapLocation;
+import com.amap.api.location.AMapLocationClient;
+import com.amap.api.location.AMapLocationClientOption;
+import com.amap.api.location.AMapLocationListener;
+import com.zhilin.patrol.app.PatrolApp;
+import com.zhilin.patrol.bean.MapLocationInfo;
+import android.util.Log;
+
+
+/**
+ * 定位帮助类
+ */
+public class LocationUtils {
+
+    private AMapLocationClient client = null;
+    private AMapLocationClientOption mOption, DIYoption;
+    private Object objLock = new Object();
+
+    public AMapLocationListener myListener = new MyLocationListener();
+    private LocationListener mLocationListener;
+
+    private static LocationUtils mInstance;
+
+    public static LocationUtils getInstance() {
+        if (mInstance == null) {
+            mInstance = new LocationUtils();
+        }
+        return mInstance;
+    }
+
+
+    public void onCreate(LocationListener locationListener) {
+        mLocationListener = locationListener;
+        registerListener(myListener);   //注册监听函数
+        setLocationOption(getDefaultLocationClientOption());
+    }
+
+    /***
+     *
+     */
+    public LocationUtils() {
+        synchronized (objLock) {
+            if (client == null) {
+                client = new AMapLocationClient(PatrolApp.getApplication().getApplicationContext());
+                client.setLocationOption(getDefaultLocationClientOption());
+            }
+        }
+    }
+
+    /***
+     * @param listener
+     * @return
+     */
+
+    public boolean registerListener(AMapLocationListener listener) {
+        boolean isSuccess = false;
+        if (listener != null) {
+            client.setLocationListener(listener);
+            isSuccess = true;
+        }
+        return isSuccess;
+    }
+
+    public void unregisterListener(AMapLocationListener listener) {
+        if (listener != null) {
+            client.unRegisterLocationListener(listener);
+        }
+    }
+
+    /***
+     * @param option
+     * @return isSuccessSetOption
+     */
+    public boolean setLocationOption(AMapLocationClientOption option) {
+        boolean isSuccess = false;
+        Log.i("locationFail",option.toString());
+        if (option != null) {
+            if (client.isStarted())
+                client.stopLocation();
+            DIYoption = option;
+            client.setLocationOption(option);
+            isSuccess = true;
+        }
+        return isSuccess;
+    }
+
+    public AMapLocationClientOption getOption() {
+        return DIYoption;
+    }
+
+    /***
+     * @return DefaultLocationClientOption
+     */
+    public AMapLocationClientOption getDefaultLocationClientOption() {
+
+        if (mOption == null) {
+            mOption = new AMapLocationClientOption();
+//            mOption.setLocationMode(LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
+//            mOption.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll;
+//            mOption.setScanSpan(1000);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
+//            mOption.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
+//            mOption.setOpenGps(true);// 可选,默认false,设置是否使用gps
+//            mOption.setIsNeedLocationDescribe(false);//可选,设置是否需要地址描述
+//            mOption.setNeedDeviceDirect(false);//可选,设置是否需要设备方向结果
+//            mOption.setLocationNotify(false);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
+//            mOption.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
+//            mOption.setIsNeedLocationDescribe(false);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
+//            mOption.setIsNeedLocationPoiList(false);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
+//            mOption.SetIgnoreCacheException(true);//可选,默认false,设置是否收集CRASH信息,默认收集
+
+            int span = 1000;
+            mOption.setInterval(span);// 可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
+            mOption.setNeedAddress(true);// 可选,设置是否需要地址信息,默认不需要
+            mOption.setLocationCacheEnable(false);
+            //mOption.setOpenGps(true);// 可选,默认false,设置是否使用gps
+            //mOption.setLocationNotify(true);// 可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
+            //mOption.setIsNeedLocationDescribe(true);// 可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
+            //mOption.setIsNeedLocationPoiList(true);// 可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
+            //mOption.setIgnoreKillProcess(false);// 可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死
+            //mOption.SetIgnoreCacheException(false);// 可选,默认false,设置是否收集CRASH信息,默认收集
+            //mOption.setEnableSimulateGps(false);// 可选,默认false,设置是否需要过滤gps仿真结果,默认需要
+
+//            mOption.setIsNeedAltitude(false);//可选,默认false,设置定位时是否需要海拔信息,默认不需要,除基础定位版本都可用
+        }
+        Log.i("locationFail",mOption.toString());
+        return mOption;
+    }
+
+    public void start() {
+        synchronized (objLock) {
+            if (client != null) {
+                client.startLocation();
+            }
+        }
+    }
+
+    public void stop() {
+        synchronized (objLock) {
+            if (client != null) {
+                client.stopLocation();
+            }
+        }
+    }
+
+    /**
+     * 设置定位相关参数
+     */
+//    private void setLocationOption() {
+//        if (mOption != null) return;
+//        mOption = new LocationClientOption();
+//        mOption.setLocationMode(LocationMode.Hight_Accuracy);//设置定位模式
+//        mOption.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02
+//        mOption.setScanSpan(5000);//设置发起定位请求的间隔时间为5000ms
+//        mOption.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
+////        option.setIsNeedLocationDescribe(true);//可选,设置是否需要地址描述
+////        option.setNeedDeviceDirect(false);//可选,设置是否需要设备方向结果
+//        mOption.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
+////        option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要
+//        mOption.setIgnoreKillProcess(true);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
+//        mOption.setOpenGps(true);
+//        mOption.setIsNeedLocationPoiList(false);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
+//        mOption.SetIgnoreCacheException(true);//可选,默认false,设置是否收集CRASH信息,默认收集
+//        mLocationClient.setLocOption(mOption);
+//
+//    }
+
+
+    /**
+     * 发起定位
+     */
+    public void startLocationInfo() {
+        start();
+    }
+
+    /**
+     * 停止定位
+     */
+    public void stopLocationClient() {
+        unregisterListener(myListener); //注销掉监听
+        stop(); //停止定位服务
+    }
+
+
+    /**
+     * 定位监听
+     * 百度地图
+     * 61 : GPS定位结果,GPS定位成功。
+     * 62 : 无法获取有效定位依据,定位失败,请检查运营商网络或者WiFi网络是否正常开启,尝试重新请求定位。
+     * 63 : 网络异常,没有成功向服务器发起请求,请确认当前测试手机网络是否通畅,尝试重新请求定位。
+     * 65 : 定位缓存的结果。
+     * 66 : 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果。
+     * 67 : 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果。
+     * 68 : 网络连接失败时,查找本地离线定位时对应的返回结果。
+     * 161: 网络定位结果,网络定位成功。
+     * 162: 请求串密文解析失败,一般是由于客户端SO文件加载失败造成,请严格参照开发指南或demo开发,放入对应SO文件。
+     * 167: 服务端定位失败,请您检查是否禁用获取位置信息权限,尝试重新请求定位。
+     * 502: AK参数错误,请按照说明文档重新申请AK。
+     * 505:AK不存在或者非法,请按照说明文档重新申请AK。
+     * 601: AK服务被开发者自己禁用,请按照说明文档重新申请AK。
+     * 602: key mcode不匹配,您的AK配置过程中安全码设置有问题,请确保:SHA1正确,“;”分号是英文状态;且包名是您当前运行应用的包名,请按照说明文档重新申请AK。
+     * 501~700:AK验证失败,请按照说明文档重新申请AK。
+     * 高德地图
+     * 6: LOCATION_TYPE_CELL 定位结果类型:基站定位结果 属于网络定位
+     * 3: LOCATION_TYPE_FAST 已过时。 已合并到AMapLocation.LOCATION_TYPE_SAME_REQ
+     * 4: LOCATION_TYPE_FIX_CACHE 定位结果类型:缓存定位结果 返回一段时间前设备在相同的环境中缓存下来的网络定位结果,节省无必要的设备定位消耗
+     * 1: LOCATION_TYPE_GPS 定位结果类型:GPS定位结果 通过设备GPS定位模块返回的定位结果
+     * 8: LOCATION_TYPE_OFFLINE 定位结果类型: 离线定位结果
+     * 2: LOCATION_TYPE_SAME_REQ 定位结果类型:前次定位结果 网络定位请求低于1秒、或两次定位之间设备位置变化非常小时返回,设备位移通过传感器感知
+     * 5: LOCATION_TYPE_WIFI 定位结果类型:Wifi定位结果 属于网络定位,定位精度相对基站定位会更好
+     *
+     * @author Administrator
+     */
+    public class MyLocationListener implements AMapLocationListener {
+        @Override
+        public void onLocationChanged(AMapLocation location) {
+            MapLocationInfo mapLocationInfo = null;
+            String message = "定位失败,请检查网络后重试!";
+            Log.i("location000",location.toString());
+            if (null != location) {
+                message = location.getLocationType() + ":" + message;
+                String address = location.getCity() + location.getDistrict() + location.getStreet() + location.getStreetNum()+location.getAoiName();
+                if (location.getLocationType() == AMapLocation.LOCATION_TYPE_GPS) {// GPS定位结果
+                    //gps定位成功
+                    mapLocationInfo = new MapLocationInfo(address, location.getProvince(),
+                            location.getCity(), location.getDistrict(), location.getStreet(), location.getLatitude(), location.getLongitude(), location.getAoiName(), location.getPoiName());
+                } else if (location.getLocationType() == AMapLocation.LOCATION_TYPE_CELL || location.getLocationType() == AMapLocation.LOCATION_TYPE_WIFI) {// 网络定位结果
+                    //网络定位成功
+                    mapLocationInfo = new MapLocationInfo(address, location.getProvince(),
+                            location.getCity(), location.getDistrict(), location.getStreet(), location.getLatitude(), location.getLongitude(), location.getAoiName(), location.getPoiName());
+                } else if (location.getLocationType() == AMapLocation.LOCATION_TYPE_OFFLINE) {// 离线定位结果
+                    //离线定位成功,离线定位结果也是有效的
+                    mapLocationInfo = new MapLocationInfo(address, location.getProvince(),
+                            location.getCity(), location.getDistrict(), location.getStreet(), location.getLatitude(), location.getLongitude(), location.getAoiName(), location.getPoiName());
+                }
+                stop();
+//                else if (location.getLocType() == BDLocation.TypeServerError) {
+                //服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因
+//                } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
+                //网络不同导致定位失败,请检查查网络是否流畅
+//                } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
+                // 无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试下重启手机
+//                }
+            }
+            if (mLocationListener == null) return;
+            if (mapLocationInfo != null) {
+                mLocationListener.locationSuccess(mapLocationInfo, message);
+            } else {
+                mLocationListener.locationFail(message);
+            }
+        }
+    }
+
+    //定位监听
+    public interface LocationListener {
+        //定位成功
+        void locationSuccess(MapLocationInfo mapLocationInfo, String locationType);
+
+        //定位失败
+        void locationFail(String message);
+    }
+}

+ 206 - 0
app/src/main/java/com/zhilin/patrol/tool/SPUtil.java

xqd
@@ -0,0 +1,206 @@
+package com.zhilin.patrol.tool;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
+import android.support.annotation.NonNull;
+import android.text.TextUtils;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+public class SPUtil {
+
+
+
+
+
+
+    private static boolean isSpace(final String s) {
+        if (s == null) return true;
+        for (int i = 0, len = s.length(); i < len; ++i) {
+            if (!Character.isWhitespace(s.charAt(i))) {
+                return false;
+            }
+        }
+        return true;
+    }
+    public static final String SP_COMMON_CONFIG = "patrol_config";
+
+    /**
+     * 保存数据到sharepreferences
+     * @param context 上下文
+     * @param key 保存键名
+     * @param value 保存值
+     */
+    public static void savaToShared(Context context, String spName, String key, Object value) {
+        SharedPreferences sharedPreferencesWrite = context.getSharedPreferences(spName, Context.MODE_PRIVATE);
+        Editor editor = sharedPreferencesWrite.edit();
+        if (value instanceof String) {
+            editor.putString(key, (String) value);
+        } else if (value instanceof Boolean) {
+            editor.putBoolean(key, (Boolean) value);
+        } else if (value instanceof Integer) {
+            editor.putInt(key, (Integer) value);
+        } else if (value instanceof Long) {
+            editor.putLong(key, (Long) value);
+        } else if (value instanceof Float) {
+            editor.putFloat(key, (Float) value);
+        } else if (value instanceof Object) {
+            try {
+                // 先将序列化结果写到byte缓存中,其实就分配一个内存空间
+                ByteArrayOutputStream bos = new ByteArrayOutputStream();
+                ObjectOutputStream os = new ObjectOutputStream(bos);
+                // 将对象序列化写入byte缓存
+                os.writeObject(value);
+                // 将序列化的数据转为16进制保存
+                String bytesToHexString = bytesToHexString(bos.toByteArray());
+                // 保存该16进制数组
+                editor.putString(key, bytesToHexString);
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        editor.commit();
+    }
+
+    /**
+     * 清除sp的key
+     * @param context 上下文
+     * @param key 保存键名
+     * @param key
+     */
+    public static void removeKey(Context context, String spName, String key) {
+        SharedPreferences sharedPreferencesWrite = context.getSharedPreferences(spName, Context.MODE_PRIVATE);
+        Editor editor = sharedPreferencesWrite.edit();
+        editor.remove(key);
+        editor.commit();
+    }
+
+    /**
+     * 得到保存的string的值
+     * @param context
+     * @param spName 配置文件名
+     * @param key
+     * @return
+     */
+    public static String getShareStr(Context context, String spName, String key) {
+        SharedPreferences sharedPreferencesRead = context.getSharedPreferences(spName, Context.MODE_PRIVATE);
+        return sharedPreferencesRead.getString(key, "");
+    }
+
+    public static int getShareInt(Context context, String spName, String key) {
+        SharedPreferences sharedPreferencesRead = context.getSharedPreferences(spName, Context.MODE_PRIVATE);
+        return sharedPreferencesRead.getInt(key, -1);
+    }
+
+    public static Boolean getShareBoolean(Context context, String spName, String key) {
+        SharedPreferences sharedPreferencesRead = context.getSharedPreferences(spName, Context.MODE_PRIVATE);
+        return sharedPreferencesRead.getBoolean(key, false);
+    }
+
+    public static Boolean getShareBoolean(Context context, String spName, String key, boolean defaultValue) {
+        SharedPreferences sharedPreferencesRead = context.getSharedPreferences(spName, Context.MODE_PRIVATE);
+        return sharedPreferencesRead.getBoolean(key, defaultValue);
+    }
+
+    /**
+     * 得到参数保存SharedPreferences----long
+     */
+    public static Long getShareLong(Context context, String spName, String key) {
+        Long value = 0l;
+        SharedPreferences sharedPreferencesRead = context.getSharedPreferences(spName, Context.MODE_PRIVATE);
+        value = sharedPreferencesRead.getLong(key, 0);
+        return value;
+    }
+
+    /**
+     * 获取保存的Object对象
+     */
+    public static Object getShareObject(Context context, String spName, String key) {
+        try {
+            SharedPreferences sharedata = context.getSharedPreferences(spName, Context.MODE_PRIVATE);
+            if (sharedata.contains(key)) {
+                String string = sharedata.getString(key, "");
+                if (TextUtils.isEmpty(string)) {
+                    return null;
+                } else {
+                    // 将16进制的数据转为数组,准备反序列化
+                    byte[] stringToBytes = StringToBytes(string);
+                    ByteArrayInputStream bis = new ByteArrayInputStream(stringToBytes);
+                    ObjectInputStream is = new ObjectInputStream(bis);
+                    // 返回反序列化得到的对象
+                    Object readObject = is.readObject();
+                    return readObject;
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        // 所有异常返回null
+        return null;
+
+    }
+
+
+    /**
+     * desc:将数组转为16进制
+     */
+
+    public static String bytesToHexString(byte[] bArray) {
+        if (bArray == null) {
+            return null;
+        }
+        if (bArray.length == 0) {
+            return "";
+        }
+        StringBuffer sb = new StringBuffer(bArray.length);
+        String sTemp;
+        for (int i = 0; i < bArray.length; i++) {
+            sTemp = Integer.toHexString(0xFF & bArray[i]);
+            if (sTemp.length() < 2)
+                sb.append(0);
+            sb.append(sTemp.toUpperCase());
+        }
+        return sb.toString();
+    }
+
+    /**
+     * desc:将16进制的数据转为数组
+     */
+    public static byte[] StringToBytes(String data) {
+        String hexString = data.toUpperCase().trim();
+        if (hexString.length() % 2 != 0) {
+            return null;
+        }
+        byte[] retData = new byte[hexString.length() / 2];
+        for (int i = 0; i < hexString.length(); i++) {
+            int int_ch; // 两位16进制数转化后的10进制数
+            char hex_char1 = hexString.charAt(i); // //两位16进制数中的第一位(高位*16)
+            int int_ch1;
+            if (hex_char1 >= '0' && hex_char1 <= '9')
+                int_ch1 = (hex_char1 - 48) * 16; // // 0 的Ascll - 48
+            else if (hex_char1 >= 'A' && hex_char1 <= 'F')
+                int_ch1 = (hex_char1 - 55) * 16; // // A 的Ascll - 65
+            else
+                return null;
+            i++;
+            char hex_char2 = hexString.charAt(i); // /两位16进制数中的第二位(低位)
+            int int_ch2;
+            if (hex_char2 >= '0' && hex_char2 <= '9')
+                int_ch2 = (hex_char2 - 48); // // 0 的Ascll - 48
+            else if (hex_char2 >= 'A' && hex_char2 <= 'F')
+                int_ch2 = hex_char2 - 55; // // A 的Ascll - 65
+            else
+                return null;
+            int_ch = int_ch1 + int_ch2;
+            retData[i / 2] = (byte) int_ch;// 将转化后的数放入Byte里
+        }
+        return retData;
+    }
+}

+ 78 - 0
app/src/main/java/com/zhilin/patrol/tool/Utils.java

xqd
@@ -0,0 +1,78 @@
+package com.zhilin.patrol.tool;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.os.Environment;
+import android.support.annotation.NonNull;
+import android.text.TextUtils;
+import android.widget.Toast;
+
+import java.io.File;
+
+/**
+ * 工具类
+ */
+public class Utils {
+
+    /**
+     * Toast
+     * @param context
+     * @param text
+     */
+    public static void showToast(Context context, String text) {
+        if (TextUtils.isEmpty(text)) return;
+        Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
+    }
+
+    /**
+     * 判断文件是否存在
+     * @param path
+     * @return
+     */
+    public static boolean fileIsExists(String path) {
+        if (TextUtils.isEmpty(path))
+            return false;
+        try {
+            File f = new File(path);
+            if (!f.exists()) {
+                return false;
+            }
+        } catch (Exception e) {
+
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * 创建文件夹
+     * @param path
+     * @return
+     */
+    public static boolean createDir(String path) {
+        File dir = new File(path);
+        if (dir.exists())
+            return true;
+        if (Environment.getExternalStorageState().equals(
+                Environment.MEDIA_MOUNTED)) {
+            return dir.mkdirs();
+        }
+        return false;
+    }
+
+    /**
+     * 删除图片
+     * @param path 文件路径
+     */
+    public static void delSingleFile(String path) {
+        if (TextUtils.isEmpty(path))
+            return;
+        File file = new File(path);
+        if (file.exists()) {
+            file.delete();
+        }
+    }
+
+
+
+}

+ 140 - 0
app/src/main/java/com/zhilin/patrol/ui/activity/AddressSelectActivity.java

xqd
@@ -0,0 +1,140 @@
+package com.zhilin.patrol.ui.activity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.SearchView;
+import android.text.TextUtils;
+import android.util.TypedValue;
+import android.view.View;
+import android.widget.TextView;
+
+import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration;
+import com.zhilin.patrol.R;
+import com.zhilin.patrol.bean.AddressAreaEntity;
+import com.zhilin.patrol.tool.DensityUtil;
+import com.zhy.adapter.recyclerview.CommonAdapter;
+import com.zhy.adapter.recyclerview.base.ViewHolder;
+
+import java.util.ArrayList;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+
+/**
+ * 定位选择
+ */
+public class AddressSelectActivity extends BaseActivity {
+
+    @BindView(R.id.recycler)
+    RecyclerView mRecyclerView;
+    @BindView(R.id.searview)
+    SearchView mSearchView;
+    private ArrayList<AddressAreaEntity.InfoListBean> mAddressAreaList;
+    private ArrayList<AddressAreaEntity.InfoListBean> mCopyAddressAreaList;
+    private CommonAdapter mAdapter;
+    private AddressAreaEntity.InfoListBean mListBean;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_question_type);
+        ButterKnife.bind(this);
+        mSearchView.setVisibility(View.VISIBLE);
+        TextView txt_search = mSearchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
+        //设置字体大小为14sp
+        txt_search.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);//14sp
+        mAddressAreaList = (ArrayList<AddressAreaEntity.InfoListBean>) getIntent().getSerializableExtra("AddressAreaList");
+        if (mAddressAreaList == null) {
+            mAddressAreaList = new ArrayList<>();
+        }
+        mCopyAddressAreaList = new ArrayList<>(mAddressAreaList);
+        setTitle("附近巡查小区");
+        init();
+    }
+
+    private void init() {
+        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
+        mRecyclerView.setHasFixedSize(true);
+        mRecyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(this)
+                .color(getResources().getColor(R.color.line_gray))
+                .size(DensityUtil.dip2px(this, 1))
+                .build());
+
+        mAdapter = new CommonAdapter<AddressAreaEntity.InfoListBean>(this, R.layout.item_address_select, mAddressAreaList) {
+            @Override
+            protected void convert(ViewHolder holder, final AddressAreaEntity.InfoListBean infoListBean, int position) {
+                    holder.setText(R.id.tv_address, infoListBean.getAddress());
+                    holder.setText(R.id.tv_distance, "距此" + infoListBean.getDistance() + "m");
+                    holder.setVisible(R.id.iv_select, infoListBean.isSelected());
+                    if (infoListBean.isSelected()) {
+                        holder.setTextColorRes(R.id.tv_address, R.color.text_orange);
+                    } else {
+                        holder.setTextColorRes(R.id.tv_address, R.color.text_black);
+                    }
+                    holder.itemView.setOnClickListener(new View.OnClickListener() {
+                        @Override
+                        public void onClick(View v) {
+                            for (AddressAreaEntity.InfoListBean bean : mAddressAreaList) {
+                                bean.setSelected(false);
+                            }
+                            infoListBean.setSelected(true);
+                            mListBean = infoListBean;
+
+//                        mAdapter.notifyDataSetChanged();
+                            finish();
+                        }
+                    });
+                }
+
+        };
+        mRecyclerView.setAdapter(mAdapter);
+
+        //根据输入框输入值的改变来过滤搜索
+        mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
+            @Override
+            public boolean onQueryTextSubmit(String query) {
+                return false;
+            }
+
+            @Override
+            public boolean onQueryTextChange(String newText) {
+                filterData(newText);
+                return false;
+            }
+        });
+    }
+
+    /**
+     * 根据输入框中的值来过滤数据并更新RecyclerView
+     *
+     * @param filterStr
+     */
+    private void filterData(String filterStr) {
+        if (mCopyAddressAreaList == null) return;
+        mAddressAreaList.clear();
+        if (TextUtils.isEmpty(filterStr)) {
+            mAddressAreaList.addAll(mCopyAddressAreaList);
+        } else {
+            for (AddressAreaEntity.InfoListBean infoListBean : mCopyAddressAreaList) {
+                if (infoListBean.getAddress().contains(filterStr)) {
+                    mAddressAreaList.add(infoListBean);
+                }
+            }
+        }
+        mAdapter.notifyDataSetChanged();
+    }
+
+    @Override
+    public void finish() {
+        if (mListBean != null) {
+            Intent intent = new Intent(); //返回上一个页面 可以不用写跳转
+            intent.putExtra("ListBean", mListBean);
+            intent.putExtra("AddressAreaList", mCopyAddressAreaList);
+            setResult(1, intent);
+        }
+        super.finish();
+    }
+
+}

+ 214 - 0
app/src/main/java/com/zhilin/patrol/ui/activity/BaseActivity.java

xqd
@@ -0,0 +1,214 @@
+package com.zhilin.patrol.ui.activity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v7.app.AppCompatActivity;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.zhilin.patrol.R;
+import com.zhilin.patrol.bean.LoginEntity;
+
+import java.util.ArrayList;
+
+/**
+ * 所有activity的基类
+ * Created by hanli on 2018/5/30.
+ */
+public class BaseActivity extends AppCompatActivity {
+
+    /** 是否包含标题 */
+    private boolean isContainNavi = true;
+    /** 主页面 */
+    private FrameLayout mContentView;
+    /** 加载页面 */
+    private RelativeLayout mLoadingView;
+    /** 失败页面 */
+    private RelativeLayout mFailView;
+    /** 无数据页面 */
+    private RelativeLayout mEmptyView;
+    /** 标题 */
+    private TextView mTitleTv;
+    /** 右边按钮 */
+    private TextView mRightTv;
+    /** 左边返回 */
+    private ImageView mBackIv;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        requestWindowFeature(Window.FEATURE_NO_TITLE);// 去标题
+    }
+
+    @Override
+    public void setContentView(int layoutResID) {
+        super.setContentView(R.layout.activity_base);
+        if (isContainNavi) {
+            findViewById(R.id.rl_header).setVisibility(View.VISIBLE);
+        }
+        mContentView = findViewById(R.id.fl_content);
+        mLoadingView = findViewById(R.id.rl_loading);
+        mFailView = findViewById(R.id.rl_fail);
+        mEmptyView = findViewById(R.id.rl_empty);
+        mTitleTv = findViewById(R.id.tv_title);
+        mRightTv = findViewById(R.id.tv_right);
+        mBackIv = findViewById(R.id.iv_back);
+        View.inflate(this, layoutResID, mContentView);
+        mFailView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                showLoadingView();
+                request();
+            }
+        });
+        mBackIv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                finish();
+            }
+        });
+    }
+
+    /** 设置右边点击 */
+    public void setRightClick(View.OnClickListener clickListener) {
+        mRightTv.setOnClickListener(clickListener);
+    }
+
+    /**
+     * 是否显示导航栏
+     *
+     * @param isContainNavi
+     */
+    public void isContainNavi(boolean isContainNavi) {
+        this.isContainNavi = isContainNavi;
+    }
+
+    /**
+     * 显示加载页面
+     */
+    public void showLoadingView() {
+        mContentView.setVisibility(View.GONE);
+        mLoadingView.setVisibility(View.VISIBLE);
+        mFailView.setVisibility(View.GONE);
+        mEmptyView.setVisibility(View.GONE);
+    }
+
+    /**
+     * 显示内容
+     */
+    public void showContentView() {
+        mContentView.setVisibility(View.VISIBLE);
+        if (mLoadingView != null) {
+            ((ViewGroup) mLoadingView.getParent()).removeView(mLoadingView);
+            mLoadingView = null;
+        }
+        if (mFailView != null) {
+            ((ViewGroup) mFailView.getParent()).removeView(mFailView);
+            mFailView = null;
+        }
+    }
+
+    /**
+     * 显示无数据界面
+     */
+    public void showEmptyView() {
+        mContentView.setVisibility(View.GONE);
+        mEmptyView.setVisibility(View.VISIBLE);
+    }
+
+    /**
+     * 显示请求失败界面
+     */
+    public void showFailView() {
+        mContentView.setVisibility(View.GONE);
+        mLoadingView.setVisibility(View.GONE);
+        mEmptyView.setVisibility(View.GONE);
+        mFailView.setVisibility(View.VISIBLE);
+//        if (!TextUtils.isEmpty(errMsg)) {
+//            mFailView.setText(errMsg);
+//        }
+//        if (resId != null) {
+//            mErrorIv.setImageResource(resId);
+//        }
+    }
+
+    public void setTitle(String headTitle) {
+        mTitleTv.setText(headTitle);
+    }
+
+    public void setRightTv(String text) {
+        if (TextUtils.isEmpty(text)) return;
+        mRightTv.setVisibility(View.VISIBLE);
+        mRightTv.setText(text);
+    }
+
+    /**
+     * 请求方法
+     */
+    public void request() {
+
+    }
+
+    /**
+     * 跳转页面
+     *
+     * @param cls 目的页面
+     */
+    public void toActivity(Class cls) {
+        Intent intent = new Intent(this, cls);
+        startActivity(intent);
+    }
+
+    /**
+     * 跳转页面
+     *
+     * @param cls 目的页面
+     */
+    public void toActivity(Class cls, LoginEntity.InfoListBean.UserInfoBean userInfo,String mpCode,String maddress,int type){
+        Intent intent = new Intent(this, cls);
+        intent.putExtra("userInfo", userInfo);
+        intent.putExtra("pCode",mpCode);
+//        intent.putExtra("isAssign", 2);
+        intent.putExtra("pbCode","null");
+        intent.putExtra("address",maddress);
+        startActivity(intent);
+    }
+    public void toActivityReUpload(Class cls, LoginEntity.InfoListBean.UserInfoBean userInfo,String planCode,String pbCode,String maddress){
+        Intent intent = new Intent(this, cls);
+        intent.putExtra("userInfo", userInfo);
+        intent.putExtra("pCode",planCode);
+        intent.putExtra("pbCode",pbCode);
+        intent.putExtra("address",maddress);
+        startActivity(intent);
+    }
+    public void toActivityRecify(Class cls, LoginEntity.InfoListBean.UserInfoBean userInfo, String mpCode, String maddress, String text, int mType, ArrayList imgList){
+        Intent intent = new Intent(this, cls);
+        intent.putExtra("userInfo", userInfo);
+        intent.putExtra("pCode",mpCode);
+        intent.putExtra("address",maddress);
+        intent.putExtra("text",text);
+        intent.putExtra("mType",mType);
+        intent.putExtra("imgList",imgList);
+        startActivity(intent);
+    }
+
+    /**
+     * 跳转页面
+     *
+     * @param cls 目的页面
+     */
+    public void toActivityNum(Class cls, LoginEntity.InfoListBean.UserInfoBean userInfo,int num) {
+        Intent intent = new Intent(this, cls);
+        intent.putExtra("userInfo", userInfo);
+        intent.putExtra("num",num);
+        startActivity(intent);
+    }
+
+}

+ 276 - 0
app/src/main/java/com/zhilin/patrol/ui/activity/LoginActivity.java

xqd
@@ -0,0 +1,276 @@
+package com.zhilin.patrol.ui.activity;
+
+import android.Manifest;
+import android.annotation.TargetApi;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+
+import com.zhilin.patrol.R;
+import com.zhilin.patrol.bean.HomeEntity;
+import com.zhilin.patrol.bean.LoginEntity;
+import com.zhilin.patrol.bean.LoginEntityNull;
+import com.zhilin.patrol.http.HttpUrl;
+import com.zhilin.patrol.tool.CheckPermissionUtils;
+import com.zhilin.patrol.tool.DialogUtil;
+import com.zhilin.patrol.tool.EncryptUtil;
+import com.zhilin.patrol.tool.IpUtils;
+import com.zhilin.patrol.tool.JsonUtils;
+import com.zhilin.patrol.tool.SPUtil;
+import com.zhilin.patrol.tool.Utils;
+import com.zhilin.patrol.views.CustomProgressDialog;
+import com.zhy.http.okhttp.OkHttpUtils;
+import com.zhy.http.okhttp.builder.PostFormBuilder;
+import com.zhy.http.okhttp.callback.Callback;
+import com.zhy.http.okhttp.request.RequestCall;
+
+import java.io.IOException;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+import okhttp3.Call;
+import okhttp3.Response;
+
+/**
+ * 登录界面
+ */
+public class LoginActivity extends BaseActivity {
+
+    String TAG="LoginActivity";
+    @BindView(R.id.et_account)
+    EditText mAccountEt;//账号
+    @BindView(R.id.et_pwd)
+    EditText mPwdEt;//密码
+
+    @BindView(R.id.btn_login)
+    Button mLoginBtn;
+    private CustomProgressDialog mProgressDialog;
+    private LoginEntity.InfoListBean.UserInfoBean mUserInfo;
+    private HomeEntity.InfoListBean homeInfo;
+
+    String[] mPermissions = {
+            Manifest.permission.ACCESS_COARSE_LOCATION,
+            Manifest.permission.ACCESS_FINE_LOCATION,
+            Manifest.permission.WRITE_EXTERNAL_STORAGE,
+            Manifest.permission.READ_EXTERNAL_STORAGE,
+            Manifest.permission.READ_PHONE_STATE};
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+//        request();
+        isContainNavi(false);
+        setContentView(R.layout.activity_login);
+        LoginEntity.InfoListBean infoList = (LoginEntity.InfoListBean) SPUtil.getShareObject(LoginActivity.this, SPUtil.SP_COMMON_CONFIG, "infoList");
+        if (infoList!=null){//登录过直接去主页
+            toMain(infoList);
+            return;
+        }
+        ButterKnife.bind(this);
+        mProgressDialog = new CustomProgressDialog(this);
+        checkPermissions();
+    }
+
+    @TargetApi(Build.VERSION_CODES.M)
+    private void checkPermissions() {
+        mPermissions = CheckPermissionUtils.getNeededPermission(this, mPermissions);
+        if (mPermissions.length > 0) {
+            requestPermissions(mPermissions, 999);
+        }
+        if (mPermissions.length == 0) {
+            //申请过一次这里的permissions.length就为0 了  直接启动程序
+        }
+
+    }
+
+    @OnClick(R.id.btn_login)
+    public void onClick(View view) {
+        if (view.getId() == R.id.btn_login) {//登录
+            String accountText = mAccountEt.getText().toString().trim();
+            String pwdText = mPwdEt.getText().toString().trim();
+            if (isEmpt(accountText, "请输入账号")) return;
+            if (isEmpt(pwdText, "请输入密码")) return;
+            String ipAddress = IpUtils.getIpAddress(this);
+            Log.i(TAG,"ipAddress地址");
+            Log.i(TAG,ipAddress);
+            try {
+                String pwdByMd5 = EncryptUtil.encodeByMd5(pwdText);
+                Log.i("PASSWORD",pwdByMd5);
+                postLogin(accountText, ipAddress, pwdByMd5);
+                request();
+            } catch (Exception e) {
+                Utils.showToast(this, "md5加密失败");
+            }
+        }
+    }
+
+    /**
+     * 提交登录
+     *
+     * @param accountText
+     * @param ipAddress
+     * @param pwdByMd5
+     * @throws IOException
+     */
+    private void postLogin(String accountText, String ipAddress, String pwdByMd5) throws IOException {
+        mProgressDialog.showDialog("正在登录...");
+        OkHttpUtils.post()
+                .url(HttpUrl.LOGIN_URL)
+                .addParams("loginName", accountText)
+                .addParams("loginPwd", pwdByMd5)
+                .addParams("userIP", ipAddress)
+                .build().execute(new Callback<LoginEntity>() {
+            @Override
+            public LoginEntity parseNetworkResponse(Response response, int id) throws Exception {
+                String jsonStr = response.body().string();
+                Log.i(TAG,jsonStr+"jsonStr");
+
+//                Log.i(TAG,JsonUtils.parseJson2Obj(jsonStr, LoginEntity.class).toString());
+//                jsonStr.contains("userCode");
+                LoginEntity loginEntity = new LoginEntity();
+
+                if(jsonStr.contains("userCode")){//是否存在userCode
+                    Log.i(TAG,"infolist不为空");
+                    LoginEntity notnullEntity = (LoginEntity) JsonUtils.parseJson2Obj(jsonStr, LoginEntity.class);//序列化
+                    loginEntity.setReturnCode((notnullEntity.getReturnCode()));
+                    loginEntity.setReturnMsg(notnullEntity.getReturnMsg());
+                    loginEntity.setInfoList(notnullEntity.getInfoList());
+
+                }else{
+                    Log.i(TAG,"infolist为空");
+                    LoginEntityNull nullEntity=(LoginEntityNull) JsonUtils.parseJson2Obj(jsonStr,LoginEntityNull.class);//
+                    loginEntity.setReturnCode(nullEntity.getReturnCode());
+                    loginEntity.setReturnMsg(nullEntity.getReturnMsg());
+                }
+                return loginEntity;
+            }
+
+//            @Override
+//            public LoginEntityNull parseNetworkResponse(Response response, int id) throws Exception {
+//                String jsonStr = response.body().string();
+//                Log.i(TAG,jsonStr);
+//                if(jsonStr.contains("userCode")){
+//                    return (LoginEntityNull) JsonUtils.parseJson2Obj(jsonStr, LoginEntityNull.class);
+//                }else{
+//                    return (LoginEntityNull) JsonUtils.parseJson2Obj(jsonStr, LoginEntityNull.class);//
+//                }
+//            }
+
+            @Override
+            public void onError(Call call, Exception e, int id) {
+                mProgressDialog.dismiss();
+                DialogUtil.showNetFailDialog(LoginActivity.this);
+            }
+
+            @Override
+            public void onResponse(LoginEntity entity, int id) {
+                mProgressDialog.dismiss();
+                if (entity == null) {
+                    Log.i(TAG,"entity=null");
+                    DialogUtil.showErrDialog(LoginActivity.this, "返回信息为空");
+                    return;
+                }
+                //!"1000".endsWith(entity.getReturnCode())
+                if (!"1000".endsWith(entity.getReturnCode())) {
+                    DialogUtil.showErrDialog(LoginActivity.this, entity.getReturnMsg());
+                    Log.i(TAG,"entity.getreturncode"+entity.getReturnCode());
+                    return;
+                }
+                LoginEntity.InfoListBean infoList = entity.getInfoList();
+                Log.i(TAG,entity.getReturnCode());
+                Log.i(TAG,"entity.getreturncode=1000");
+//                LoginEntity.InfoListBean infoBean = null;
+//                List<LoginEntity.InfoListBean> infoList = entity.getInfoList();
+//                if(infoList.size() != 0){
+//                    infoBean = infoList.get(0);
+//                }
+                SPUtil.savaToShared(LoginActivity.this, SPUtil.SP_COMMON_CONFIG, "infoList", infoList);
+//                toMain(infoBean);
+                toMain(infoList);
+            }
+        });
+
+    }
+
+    /**
+     * 去主页
+     * @param infoList
+     */
+    private void toMain(LoginEntity.InfoListBean infoList) {
+        mUserInfo=infoList.getUserInfo();
+
+        if(mUserInfo.getUserRole()==1||mUserInfo.getUserRole()==2){
+            Intent intent = new Intent(LoginActivity.this, MainActivity.class);
+            intent.putExtra("infoList", infoList);
+            startActivity(intent);
+            finish();
+        }
+
+        if(mUserInfo.getUserRole()==3) {
+            request();
+            Intent intent = new Intent(LoginActivity.this, RectifyMainActivity.class);
+//            intent.putExtra("userInfo", mUserInfo);
+            intent.putExtra("infoList", infoList);
+            startActivity(intent);
+            finish();
+        }
+    }
+
+    /**
+     * 判断是否为空
+     *
+     * @param text
+     * @param errText
+     * @return
+     */
+    private boolean isEmpt(String text, String errText) {
+        if (TextUtils.isEmpty(text)) {
+            Utils.showToast(this, errText);
+            return true;
+        }
+        return false;
+    }
+   /* @Override
+    public void request() {
+        String ipAddress = IpUtils.getIpAddress(this);
+        PostFormBuilder formBuilder = OkHttpUtils.post();
+        formBuilder.url(HttpUrl.MAIN_URL);
+        formBuilder.addParams("userCode", mUserInfo.getUserCode());
+        formBuilder.addParams("userRole", mUserInfo.getUserRole() + "");
+        formBuilder.addParams("userIP", ipAddress);
+        RequestCall call = formBuilder.build();
+        call.execute(new Callback<TaskTypeEntity>() {
+            @Override
+            public TaskTypeEntity parseNetworkResponse(Response response, int id) throws Exception {
+                String jsonStr = response.body().string();
+                return (TaskTypeEntity) JsonUtils.parseJson2Obj(jsonStr, TaskTypeEntity.class);
+            }
+
+            @Override
+            public void onError(Call call, Exception e, int id) {
+                DialogUtil.showNetFailDialog(LoginActivity.this);
+            }
+
+            @Override
+            public void onResponse(TaskTypeEntity entity, int id) {
+                if (entity == null) {
+                    DialogUtil.showErrDialog(LoginActivity.this, "返回信息为空");
+                    return;
+                }
+                homeInfo = entity.getInfoList();
+                if (!"1000".endsWith(entity.getReturnCode())) {
+                    DialogUtil.showErrDialog(LoginActivity.this, entity.getReturnMsg());
+                    return;
+                }
+
+            }
+        });
+    }*/
+
+}

+ 294 - 0
app/src/main/java/com/zhilin/patrol/ui/activity/MainActivity.java

xqd
@@ -0,0 +1,294 @@
+package com.zhilin.patrol.ui.activity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Environment;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.cjj.MaterialRefreshLayout;
+import com.cjj.MaterialRefreshListener;
+import com.zhilin.patrol.R;
+import com.zhilin.patrol.bean.HomeEntity;
+import com.zhilin.patrol.bean.LoginEntity;
+import com.zhilin.patrol.http.HttpUrl;
+import com.zhilin.patrol.tool.DialogUtil;
+import com.zhilin.patrol.tool.IpUtils;
+import com.zhilin.patrol.tool.JsonUtils;
+import com.zhilin.patrol.tool.SPUtil;
+import com.zhilin.patrol.views.AlertDialog;
+import com.zhy.http.okhttp.OkHttpUtils;
+import com.zhy.http.okhttp.builder.PostFormBuilder;
+import com.zhy.http.okhttp.callback.Callback;
+import com.zhy.http.okhttp.request.RequestCall;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+import okhttp3.Call;
+import okhttp3.Response;
+
+/**
+ * 主页面
+ */
+public class MainActivity extends BaseActivity {
+
+    @BindView(R.id.tv_user)
+    TextView mUserTv;//用户
+    @BindView(R.id.tv_sex)
+    TextView mSexTv;//性别
+    @BindView(R.id.tv_logout)
+    TextView mLogoutTv;//注销
+
+    @BindView(R.id.tv_un_complete)
+    TextView mUnCompleteTv;//未完成
+    @BindView(R.id.tv_examine)
+    TextView mExamineTv;//审核中
+    @BindView(R.id.tv_complete)
+    TextView mCompleteTv;//完成
+    @BindView(R.id.tv_un_pass)
+    TextView mUnpassTv;//不通过
+    @BindView(R.id.tv_address)
+    TextView mAddressTv;//地址
+    @BindView(R.id.tv_map)
+    TextView mMapTv;//地图
+    @BindView(R.id.tv_msg_time)
+    TextView mEndTimeTv;//最后时间消息
+    @BindView(R.id.rl_layout_task)
+    RelativeLayout mTaskLayout;//指派任务
+
+    @BindView(R.id.swipe_refresh_layout)
+    MaterialRefreshLayout mRefreshLayout;//下拉刷新
+
+    @BindView(R.id.tv_tip)
+    TextView mTipTv;//消息提示
+    @BindView(R.id.tv_sample_num)
+    TextView mSampleNumTv;//抽样消息提示
+    @BindView(R.id.tv_rectify_num)
+    TextView mRectifyNumTv;//整改不通过消息提示
+    @BindView(R.id.tv_overdue_num)
+    TextView mOverdueNumTv;//逾期消息提示
+    @BindView(R.id.tv_myTask_num)
+    TextView mMyTaskNum;
+
+    /** 用户信息 */
+    LoginEntity.InfoListBean mInfoListBean;
+    private LoginEntity.InfoListBean.UserInfoBean mUserInfo;
+    /** 是否是第一次加载 */
+    private boolean mIsFirst;
+    private HomeEntity.InfoListBean infoList;
+    private HomeEntity.InfoListBean.ExtTaskBean extTasklist;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+
+        super.onCreate(savedInstanceState);
+        isContainNavi(false);
+        setContentView(R.layout.activity_main);
+        ButterKnife.bind(this);
+        mInfoListBean = (LoginEntity.InfoListBean) getIntent().getSerializableExtra("infoList");
+        mUserInfo = mInfoListBean.getUserInfo();
+        init();
+        showLoadingView();
+        mIsFirst = true;
+        request();
+    }
+
+
+    @Override
+    public void request() {
+        String ipAddress = IpUtils.getIpAddress(this);
+        PostFormBuilder formBuilder = OkHttpUtils.post();
+        formBuilder.url(HttpUrl.MAIN_URL);
+        formBuilder.addParams("userCode", mUserInfo.getUserCode());
+        formBuilder.addParams("userRole", mUserInfo.getUserRole() + "");
+        formBuilder.addParams("userIP", ipAddress);
+        RequestCall call = formBuilder.build();
+        call.execute(new Callback<HomeEntity>() {
+            @Override
+            public HomeEntity parseNetworkResponse(Response response, int id) throws Exception {
+                String jsonStr = response.body().string();
+                return (HomeEntity) JsonUtils.parseJson2Obj(jsonStr, HomeEntity.class);
+            }
+
+            @Override
+            public void onError(Call call, Exception e, int id) {
+                if (mIsFirst) {
+                    showFailView();
+                } else {
+                    mRefreshLayout.finishRefresh();
+                }
+                DialogUtil.showNetFailDialog(MainActivity.this);
+            }
+
+            @Override
+            public void onResponse(HomeEntity entity, int id) {
+                if (mIsFirst) {
+                    showContentView();
+                } else {
+                    mRefreshLayout.finishRefresh();
+                }
+                mIsFirst = false;
+                if (entity == null) {
+                    DialogUtil.showErrDialog(MainActivity.this, "返回信息为空");
+                    return;
+                }
+                infoList = entity.getInfoList();
+                if (!"1000".endsWith(entity.getReturnCode())) {
+                    DialogUtil.showErrDialog(MainActivity.this, entity.getReturnMsg());
+                    return;
+                }
+                mUnCompleteTv.setText(infoList.getUnfinishNum() + "");
+                mCompleteTv.setText(infoList.getFinishNum() + "");
+                mExamineTv.setText(infoList.getReviewNum() + "");
+                mUnpassTv.setText(infoList.getUnpassNum()+"");
+                final HomeEntity.InfoListBean.ExtTaskBean extTask = infoList.getExtTask();
+                if (extTask != null) {
+                    mTaskLayout.setVisibility(View.VISIBLE);
+                    mAddressTv.setText(extTask.getAddress()+"(需巡" + extTask.getCheckNum() + "次|" + "已巡" +extTask.getPostNum() + "次)");
+                    mEndTimeTv.setText(extTask.getEndTime() + " 前需要完成巡查上报");
+                    mMapTv.setOnClickListener(new View.OnClickListener() {
+                        @Override
+                        public void onClick(View view) {
+                            MapActivity.toMap(MainActivity.this, Double.parseDouble(extTask.getLatitude()), Double.parseDouble(extTask.getLongitude()), extTask.getAddress());
+                        }
+                    });
+                    extTasklist=infoList.getExtTask();
+                    Log.i("code指派=",extTasklist.getPCdoe());
+                } else {
+                    mTaskLayout.setVisibility(View.GONE);
+                }
+                if (infoList.getHasEndingPlan() == 1) {
+                    mTipTv.setVisibility(View.VISIBLE);
+                    mTipTv.setText(infoList.getNoticeMsg());
+                } else {
+                    mTipTv.setVisibility(View.GONE);
+                }
+                setTipNum(mSampleNumTv, infoList.getSmartPlanCode());
+                setTipNum(mRectifyNumTv, infoList.getUnReChangePlanCode());
+                setTipNum(mOverdueNumTv, infoList.getExpirePlanCode());
+                setTipNum(mMyTaskNum,infoList.getDefaultPlanCode());
+            }
+        });
+    }
+
+    private void setTipNum(TextView tv, String num) {
+        if (!TextUtils.isEmpty(num)) {
+//            String textTNum = num + "";
+//            if (num > 99) {
+//                textTNum = "99+";
+//            }
+//            tv.setText(textTNum);
+            tv.setVisibility(View.VISIBLE);
+        } else {
+            tv.setVisibility(View.GONE);
+        }
+    }
+
+    private void init() {
+        if (mUserInfo != null) {
+            mUserTv.setText(mUserInfo.getUserName());
+            mSexTv.setText(mUserInfo.getUserSex());
+        }
+        mRefreshLayout.setLoadMore(false);
+        mRefreshLayout.setMaterialRefreshListener(new MaterialRefreshListener() {
+            @Override
+            public void onRefresh(final MaterialRefreshLayout materialRefreshLayout) {
+                //refreshing...
+                request();
+            }
+
+            @Override
+            public void onRefreshLoadMore(MaterialRefreshLayout materialRefreshLayout) {
+                //load more refreshing...
+            }
+        });
+    }
+
+    @OnClick({ R.id.rl_record, R.id.rl_my_task, R.id.tv_logout,R.id.rl_rectify_task,//,R.id.rl_upload
+            R.id.ll_un_complete, R.id.ll_examine, R.id.ll_complete, R.id.rl_task_upload,R.id.ll_un_pass,
+            R.id.rl_sample_task, R.id.rl_overdue_task, R.id.tv_tip})
+    public void onClick(View v) {
+        switch (v.getId()) {
+            case R.id.rl_task_upload://巡查上报
+                Intent intent = new Intent(this, PatrolUploadActivity.class);
+                intent.putExtra("userInfo", mUserInfo);
+                intent.putExtra("isAssign", 1);
+                intent.putExtra("pCode",extTasklist.getPCdoe());
+                intent.putExtra("pbCode","null");
+                intent.putExtra("address",extTasklist.getAddress());
+                startActivity(intent);
+                break;
+            case R.id.ll_un_complete://未完成
+                MyTaskTypeActivity.toMyTask(this, mUserInfo, 0);
+                break;
+            case R.id.ll_examine://审核中
+                toActivityNum(PatrolRecordActivity.class, mUserInfo,1);
+                break;
+            case R.id.ll_complete://已完成
+                toActivityNum(PatrolRecordActivity.class, mUserInfo,3);
+                break;
+            case R.id.ll_un_pass://不通过
+                toActivityNum(PatrolRecordActivity.class, mUserInfo,2);
+                break;
+            case R.id.rl_record://巡查记录
+                toActivityNum(PatrolRecordActivity.class, mUserInfo,123);
+                break;
+//            case R.id.rl_upload://巡查上报
+//                toActivity(PatrolUploadActivity.class, mUserInfo,"fir","fir");
+//                break;
+            case R.id.rl_my_task://普通任务
+                MyTaskTypeActivity.toMyTask(this, mUserInfo, 1);
+                break;
+            case R.id.rl_sample_task://抽样任务
+                toTaskTypeActivity(infoList.getSmartPlanCode(), 4);
+                break;
+            case R.id.rl_overdue_task://逾期任务
+                toTaskTypeActivity(infoList.getExpirePlanCode(), 5);
+                break;
+            case R.id.tv_tip://首页提示
+                toTaskTypeActivity(infoList.getEndingPlanCode(), 6);
+                break;
+            case R.id.rl_rectify_task://整改不通过任务
+                toTaskTypeActivity(infoList.getUnReChangePlanCode(), 7);
+                break;
+            case R.id.tv_logout://注销
+                new AlertDialog(this).builder()
+                        .setTitle(getString(R.string.tv_tishi))
+                        .setMsg("确定要注销?")
+                        .setPositiveButton("注销", new View.OnClickListener() {
+                            @Override
+                            public void onClick(View v) {
+                                SPUtil.savaToShared(MainActivity.this, SPUtil.SP_COMMON_CONFIG, "infoList", "");
+                                finish();
+                                Intent intent=new Intent(MainActivity.this,LoginActivity.class);
+                                startActivity(intent);
+                            }
+                        }).setNegativeButton("取消", new View.OnClickListener() {
+                    @Override
+                    public void onClick(View view) {
+
+                    }
+                }).show();
+                break;
+            default:
+                break;
+        }
+    }
+
+    private void toTaskTypeActivity(String paramPlanCode, int taskType) {
+        String planCode = "";
+        if (infoList != null && !TextUtils.isEmpty(paramPlanCode)) {
+            planCode = paramPlanCode;
+        }
+        TaskTypeActivity.toTypeTask(this, mUserInfo, planCode, taskType);
+    }
+
+}

+ 263 - 0
app/src/main/java/com/zhilin/patrol/ui/activity/MapActivity.java

xqd
@@ -0,0 +1,263 @@
+package com.zhilin.patrol.ui.activity;
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+
+import com.amap.api.location.AMapLocation;
+import com.amap.api.location.AMapLocationClient;
+import com.amap.api.location.AMapLocationClientOption;
+import com.amap.api.location.AMapLocationListener;
+import com.amap.api.maps.AMap;
+import com.amap.api.maps.CameraUpdateFactory;
+import com.amap.api.maps.LocationSource;
+import com.amap.api.maps.MapView;
+import com.amap.api.maps.model.BitmapDescriptor;
+import com.amap.api.maps.model.BitmapDescriptorFactory;
+import com.amap.api.maps.model.LatLng;
+import com.amap.api.maps.model.MarkerOptions;
+import com.amap.api.maps.model.MyLocationStyle;
+import com.amap.api.maps.model.Poi;
+import com.amap.api.navi.AmapNaviPage;
+import com.amap.api.navi.AmapNaviParams;
+import com.amap.api.navi.AmapNaviType;
+import com.amap.api.navi.INaviInfoCallback;
+import com.amap.api.navi.model.AMapNaviLocation;
+import com.zhilin.patrol.R;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+
+/**
+ * 地图页面
+ */
+public class MapActivity extends BaseActivity implements LocationSource, AMapLocationListener {
+
+    /** 地图view */
+    @BindView(R.id.map_view)
+    MapView mMapView;
+    private AMap mAMap;
+
+    private OnLocationChangedListener mListener;
+    private AMapLocationClient mlocationClient;
+    private AMapLocationClientOption mLocationOption;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_map);
+        ButterKnife.bind(this);
+        setTitle("查看位置");
+        double latitude = getIntent().getDoubleExtra("latitude", 0l);
+        double longitude = getIntent().getDoubleExtra("longitude", 0l);
+        final String address = getIntent().getStringExtra("address");
+        final LatLng lat = new LatLng(latitude, longitude);
+        setRightTv("导航");
+        setRightClick(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Poi start = new Poi("我的位置", null, "");
+                /**终点传入的是北京站坐标,但是POI的ID "B000A83M61"对应的是北京西站,所以实际算路以北京西站作为终点**/
+                Poi end = new Poi(address, lat, "");
+                AmapNaviPage.getInstance().showRouteActivity(MapActivity.this, new AmapNaviParams(start, null, end, AmapNaviType.DRIVER), new INaviInfoCallback() {
+                    @Override
+                    public void onInitNaviFailure() {
+
+                    }
+
+                    @Override
+                    public void onGetNavigationText(String s) {
+
+                    }
+
+                    @Override
+                    public void onLocationChange(AMapNaviLocation aMapNaviLocation) {
+
+                    }
+
+                    @Override
+                    public void onArriveDestination(boolean b) {
+
+                    }
+
+                    @Override
+                    public void onStartNavi(int i) {
+
+                    }
+
+                    @Override
+                    public void onCalculateRouteSuccess(int[] ints) {
+
+                    }
+
+                    @Override
+                    public void onCalculateRouteFailure(int i) {
+
+                    }
+
+                    @Override
+                    public void onStopSpeaking() {
+
+                    }
+
+                    @Override
+                    public void onReCalculateRoute(int i) {
+
+                    }
+
+                    @Override
+                    public void onExitPage(int i) {
+
+                    }
+
+                    @Override
+                    public void onStrategyChanged(int i) {
+
+                    }
+
+                    @Override
+                    public View getCustomNaviBottomView() {
+                        return null;
+                    }
+
+                    @Override
+                    public View getCustomNaviView() {
+                        return null;
+                    }
+
+                    @Override
+                    public void onArrivedWayPoint(int i) {
+
+                    }
+                });
+            }
+        });
+        mMapView.onCreate(savedInstanceState);
+        if (mAMap == null) {
+            mAMap = mMapView.getMap();
+        }
+        //隐藏缩放控件
+        mAMap.getUiSettings().setZoomControlsEnabled(false);
+        // 普通地图
+        mAMap.setMapType(AMap.MAP_TYPE_NORMAL);
+        // 开启启交通图 false 为关闭
+        mAMap.setTrafficEnabled(false);
+        mAMap.setLocationSource(this);
+//        mAMap.setMyLocationEnabled(true);
+
+        BitmapDescriptor markerBitmap = BitmapDescriptorFactory
+                .fromResource(R.drawable.ic_map_location);
+
+        setUpMap();
+        // 构建MarkerOption,用于在地图上添加Marker
+        MarkerOptions option = new MarkerOptions().position(lat)
+                .icon(markerBitmap).zIndex(9).draggable(true);
+        mAMap.moveCamera(CameraUpdateFactory.newLatLngZoom(lat, 15));
+        // 在地图上添加Marker,并显示
+        mAMap.addMarker(option);
+    }
+
+    /**
+     * 设置一些amap的属性
+     */
+    private void setUpMap() {
+        // 自定义系统定位小蓝点
+        MyLocationStyle myLocationStyle = new MyLocationStyle();
+        myLocationStyle.myLocationIcon(BitmapDescriptorFactory
+                .fromResource(R.drawable.location_marker));// 设置小蓝点的图标
+        myLocationStyle.strokeColor(Color.BLACK);// 设置圆形的边框颜色
+        myLocationStyle.radiusFillColor(Color.argb(100, 0, 0, 180));// 设置圆形的填充颜色
+//         myLocationStyle.anchor(int,int)//设置小蓝点的锚点
+        myLocationStyle.strokeWidth(1.0f);// 设置圆形的边框粗细
+        mAMap.setMyLocationStyle(myLocationStyle);
+//        mAMap.setLocationSource(this);// 设置定位监听
+        mAMap.getUiSettings().setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示
+//        mAMap.setMyLocationEnabled(true);// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
+        // aMap.setMyLocationType()
+    }
+
+    @Override
+    public void activate(OnLocationChangedListener listener) {
+        mListener = listener;
+        if (mlocationClient == null) {
+            mlocationClient = new AMapLocationClient(this);
+            mLocationOption = new AMapLocationClientOption();
+            //设置定位监听
+            mlocationClient.setLocationListener(this);
+            //设置为高精度定位模式
+            mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
+            mLocationOption.setOnceLocation(true);
+            //设置定位参数
+            mlocationClient.setLocationOption(mLocationOption);
+            // 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
+            // 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()方法来取消定位请求
+            // 在定位结束后,在合适的生命周期调用onDestroy()方法
+            // 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
+        }
+        mlocationClient.startLocation();
+    }
+
+    @Override
+    public void deactivate() {
+        mListener = null;
+        if (mlocationClient != null) {
+            mlocationClient.stopLocation();
+            mlocationClient.onDestroy();
+        }
+        mlocationClient = null;
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        //在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图
+        mMapView.onDestroy();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        //在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图
+        mMapView.onResume();
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        //在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制
+        mMapView.onPause();
+        deactivate();
+    }
+
+    @Override
+    protected void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态
+        mMapView.onSaveInstanceState(outState);
+    }
+
+    public static void toMap(Context context, double latitude, double longitude, String address) {
+        Intent intent = new Intent(context, MapActivity.class);
+        intent.putExtra("latitude", latitude);
+        intent.putExtra("longitude", longitude);
+        intent.putExtra("address", address);
+        context.startActivity(intent);
+    }
+
+    @Override
+    public void onLocationChanged(AMapLocation aMapLocation) {
+        if (mListener != null && aMapLocation != null) {
+            if (aMapLocation != null
+                    && aMapLocation.getErrorCode() == 0) {
+                mListener.onLocationChanged(aMapLocation);// 显示系统小蓝点
+                mAMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude()), 19));
+            } else {
+                String errText = "定位失败," + aMapLocation.getErrorCode() + ": " + aMapLocation.getErrorInfo();
+                Log.e("AmapErr", errText);
+            }
+        }
+    }
+}

+ 220 - 0
app/src/main/java/com/zhilin/patrol/ui/activity/MyTaskActivity.java

xqd
@@ -0,0 +1,220 @@
+package com.zhilin.patrol.ui.activity;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+import android.widget.Button;
+
+import com.cjj.MaterialRefreshLayout;
+import com.cjj.MaterialRefreshListener;
+import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration;
+import com.zhilin.patrol.R;
+import com.zhilin.patrol.bean.FinishTaskEntity;
+import com.zhilin.patrol.bean.HomeEntity;
+import com.zhilin.patrol.bean.LoginEntity;
+import com.zhilin.patrol.bean.MyTaskEntity;
+import com.zhilin.patrol.bean.TaskTypeEntity;
+import com.zhilin.patrol.http.HttpUrl;
+import com.zhilin.patrol.tool.DensityUtil;
+import com.zhilin.patrol.tool.DialogUtil;
+import com.zhilin.patrol.tool.IpUtils;
+import com.zhilin.patrol.tool.JsonUtils;
+import com.zhilin.patrol.tool.SPUtil;
+import com.zhy.adapter.recyclerview.CommonAdapter;
+import com.zhy.adapter.recyclerview.base.ViewHolder;
+import com.zhy.http.okhttp.OkHttpUtils;
+import com.zhy.http.okhttp.callback.Callback;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import android.util.Log;
+import okhttp3.Call;
+import okhttp3.Response;
+
+/**
+ *普通任务
+ */
+public class MyTaskActivity extends BaseActivity {
+
+
+
+    @BindView(R.id.recycler)
+    RecyclerView mRecyclerView;
+    @BindView(R.id.swipe_refresh_layout)
+    MaterialRefreshLayout mRefreshLayout;
+
+    private LoginEntity.InfoListBean.UserInfoBean mUserInfo;
+    private int mIsAll;
+
+    private List<MyTaskEntity.Bean> mList = new ArrayList<>();
+    private CommonAdapter<MyTaskEntity.Bean> mAdapter;
+    public int position=0;
+    private int mPage = 1;
+    private boolean mIsFirst;
+
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_my_task);
+        ButterKnife.bind(this);
+        setTitle("普通任务");
+        List<MyTaskEntity.Bean> list = (List<MyTaskEntity.Bean>) getIntent().getSerializableExtra("MyTaskBean");
+        mUserInfo = (LoginEntity.InfoListBean.UserInfoBean) getIntent().getSerializableExtra("userInfo");
+        mIsAll = getIntent().getIntExtra("isAll", 0);
+
+        if (list != null) {
+            mList.addAll(list);
+            Log.i("mlist","********");
+        }
+        request();
+        init();
+    }
+    @Override
+    public void request() {
+        String ipAddress = IpUtils.getIpAddress(this);
+        Log.i("11111","mUserInfo.getUserCode()="+mUserInfo.getUserCode());
+        Log.i("11111","mUserInfo.getUserRole()="+mUserInfo.getUserRole());
+        Log.i("11111","mPage="+mPage);
+        Log.i("11111","mIsAll="+mIsAll);
+        Log.i("11111","ipAddress="+ipAddress);
+        OkHttpUtils.post()
+                .url(HttpUrl.MY_TASK_URL)
+                .addParams("userCode", mUserInfo.getUserCode())
+                .addParams("userRole", mUserInfo.getUserRole() + "")
+                .addParams("page", mPage + "")
+                .addParams("isAll", mIsAll + "")
+                .addParams("userIP", ipAddress)
+                .build().execute(new Callback<MyTaskEntity>() {
+            @Override
+            public MyTaskEntity parseNetworkResponse(Response response, int id) throws Exception {
+                String jsonStr = response.body().string();
+                return (MyTaskEntity) JsonUtils.parseJson2Obj(jsonStr, MyTaskEntity.class);
+            }
+
+            @Override
+            public void onError(Call call, Exception e, int id) {
+                if (mIsFirst) {
+                    showFailView();
+                } else {
+                    mRefreshLayout.finishRefresh();
+                    mRefreshLayout.finishRefreshLoadMore();
+                }
+                DialogUtil.showNetFailDialog(MyTaskActivity.this);
+            }
+
+            @Override
+            public void onResponse(MyTaskEntity entity, int id) {
+                if (mIsFirst) {
+                    showContentView();
+                } else {
+                    mRefreshLayout.finishRefresh();
+                    mRefreshLayout.finishRefreshLoadMore();
+                }
+                mIsFirst = false;
+                if (entity == null) {
+                    DialogUtil.showErrDialog(MyTaskActivity.this, "返回信息为空");
+                    return;
+                }
+                List<MyTaskEntity.Bean> list = entity.getInfoList().get(0).getSonArr();
+                if (!"1000".endsWith(entity.getReturnCode())) {
+                    DialogUtil.showErrDialog(MyTaskActivity.this, entity.getReturnMsg());
+                    return;
+                }
+                if (list == null) {
+                    mRefreshLayout.setLoadMore(false);
+                    return;
+                }
+                if (list.size() < 10) {
+                    mRefreshLayout.setLoadMore(false);
+                }
+                if (mPage == 1) {
+                    mList.clear();
+                }
+                mList.addAll(list);
+                mAdapter.notifyDataSetChanged();
+                mPage++;
+                if (mList.isEmpty()){
+                    showEmptyView();
+                }
+            }
+        });
+    }
+
+    private void init() {
+
+        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
+        mRecyclerView.setHasFixedSize(true);
+        mRecyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(this)
+                .color(getResources().getColor(R.color.line_gray))
+                .size(DensityUtil.dip2px(this, 1))
+                .build());
+        mAdapter = new CommonAdapter<MyTaskEntity.Bean>(this, R.layout.item_my_task2, mList) {
+            @Override
+            protected void convert(final ViewHolder holder, final MyTaskEntity.Bean bean, int position) {
+//                if (bean.getIsFinish()==0) {
+
+//                holder.setText(R.id.tv_add, bean.getAddress() + "(巡查" + bean.getFinishNum() + "/" + bean.getTaskNum() + "次)");
+//                holder.itemView.setTag(position);
+                Log.i("111", "qitaxun///***");
+                holder.setText(R.id.tv_add2, bean.getAddress() + "(需巡" + bean.getTaskNum() + "次|"+"已巡"+bean.getPostNum()+"次)");
+                holder.setOnClickListener(R.id.btn_to_rl_upload2, new View.OnClickListener() {
+                    @Override
+                    public void onClick(View view) {
+                        Log.i("clickMytaskActivity", "跳转上传页面");
+                        Intent intent = new Intent(MyTaskActivity.this, PatrolUploadActivity.class);
+                        intent.putExtra("userInfo", mUserInfo);
+                        intent.putExtra("isAssign", mIsAll);
+                        intent.putExtra("pbCode", "null");
+                        intent.putExtra("address",bean.getAddress());
+                        intent.putExtra("pCode",bean.getPCode());
+                        startActivity(intent);
+                    }
+                });
+
+                holder.setOnClickListener(R.id.tv_check2, new View.OnClickListener() {
+                    @Override
+                    public void onClick(View view) {
+                        MapActivity.toMap(MyTaskActivity.this, Double.parseDouble(bean.getLatitude()), Double.parseDouble(bean.getLongitude()), bean.getAddress());
+                    }
+                });
+            }
+        };
+        mRecyclerView.setAdapter(mAdapter);
+        mRefreshLayout.setLoadMore(false);
+        mRefreshLayout.setMaterialRefreshListener(new MaterialRefreshListener() {
+            @Override
+            public void onRefresh(final MaterialRefreshLayout materialRefreshLayout) {
+                //refreshing...
+                mPage = 1;
+                mRefreshLayout.finishRefresh();
+                request();
+            }
+
+            @Override
+            public void onRefreshLoadMore(MaterialRefreshLayout materialRefreshLayout) {
+                //load more refreshing...
+                request();
+            }
+        });
+        if (mList.isEmpty()){
+            showEmptyView();
+        }
+    }
+
+    public static void toMyTask(Context context, ArrayList<MyTaskEntity.Bean> list,LoginEntity.InfoListBean.UserInfoBean userInfo, int isAll) {
+        Intent intent = new Intent(context, MyTaskActivity.class);
+        intent.putExtra("MyTaskBean", list);
+        intent.putExtra("userInfo", userInfo);
+        intent.putExtra("isAssign", isAll);
+        context.startActivity(intent);
+    }
+
+}

+ 201 - 0
app/src/main/java/com/zhilin/patrol/ui/activity/MyTaskTypeActivity.java

xqd
@@ -0,0 +1,201 @@
+package com.zhilin.patrol.ui.activity;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+import android.util.Log;
+
+import com.cjj.MaterialRefreshLayout;
+import com.cjj.MaterialRefreshListener;
+import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration;
+import com.zhilin.patrol.R;
+import com.zhilin.patrol.bean.LoginEntity;
+import com.zhilin.patrol.bean.MyTaskEntity;
+import com.zhilin.patrol.http.HttpUrl;
+import com.zhilin.patrol.tool.DensityUtil;
+import com.zhilin.patrol.tool.DialogUtil;
+import com.zhilin.patrol.tool.IpUtils;
+import com.zhilin.patrol.tool.JsonUtils;
+import com.zhy.adapter.recyclerview.CommonAdapter;
+import com.zhy.adapter.recyclerview.base.ViewHolder;
+import com.zhy.http.okhttp.OkHttpUtils;
+import com.zhy.http.okhttp.callback.Callback;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import okhttp3.Call;
+import okhttp3.Response;
+
+/**
+ * 普通任务
+ */
+public class MyTaskTypeActivity extends BaseActivity {
+
+    @BindView(R.id.recycler)
+    RecyclerView mRecyclerView;
+    @BindView(R.id.swipe_refresh_layout)
+    MaterialRefreshLayout mRefreshLayout;
+
+    private boolean mIsFirst;
+
+    private LoginEntity.InfoListBean.UserInfoBean mUserInfo;
+    private List<MyTaskEntity.InfoListBean> mList;
+    private CommonAdapter<MyTaskEntity.InfoListBean> mAdapter;
+
+    private int mPage = 1;
+    /**
+     * 0-未完成任务
+     * 1-普通任务
+     */
+    private int mIsAll;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_my_task);
+        ButterKnife.bind(this);
+        setTitle("普通任务");
+
+        mUserInfo = (LoginEntity.InfoListBean.UserInfoBean) getIntent().getSerializableExtra("userInfo");
+
+        mIsAll = getIntent().getIntExtra("isAll", 0);
+        init();
+
+        showLoadingView();
+        mIsFirst = true;
+        request();
+    }
+
+    @Override
+    public void request() {
+        String ipAddress = IpUtils.getIpAddress(this);
+        Log.i("11111","mUserInfo.getUserCode()="+mUserInfo.getUserCode());
+        Log.i("11111","mUserInfo.getUserRole()="+mUserInfo.getUserRole());
+        Log.i("11111","mPage="+mPage);
+        Log.i("11111","mIsAll="+mIsAll);
+        Log.i("11111","ipAddress="+ipAddress);
+        OkHttpUtils.post()
+                .url(HttpUrl.MY_TASK_URL)
+                .addParams("userCode", mUserInfo.getUserCode())
+                .addParams("userRole", mUserInfo.getUserRole() + "")
+                .addParams("page", mPage + "")
+                .addParams("isAll", mIsAll + "")
+                .addParams("userIP", ipAddress)
+                .build().execute(new Callback<MyTaskEntity>() {
+            @Override
+            public MyTaskEntity parseNetworkResponse(Response response, int id) throws Exception {
+                String jsonStr = response.body().string();
+                return (MyTaskEntity) JsonUtils.parseJson2Obj(jsonStr, MyTaskEntity.class);
+            }
+
+            @Override
+            public void onError(Call call, Exception e, int id) {
+                if (mIsFirst) {
+                    showFailView();
+                } else {
+                    mRefreshLayout.finishRefresh();
+                    mRefreshLayout.finishRefreshLoadMore();
+                }
+                DialogUtil.showNetFailDialog(MyTaskTypeActivity.this);
+            }
+
+            @Override
+            public void onResponse(MyTaskEntity entity, int id) {
+                if (mIsFirst) {
+                    showContentView();
+                } else {
+                    mRefreshLayout.finishRefresh();
+                    mRefreshLayout.finishRefreshLoadMore();
+                }
+                mIsFirst = false;
+                if (entity == null) {
+                    DialogUtil.showErrDialog(MyTaskTypeActivity.this, "返回信息为空");
+                    return;
+                }
+                List<MyTaskEntity.InfoListBean> list = entity.getInfoList();
+                if (!"1000".endsWith(entity.getReturnCode())) {
+                    DialogUtil.showErrDialog(MyTaskTypeActivity.this, entity.getReturnMsg());
+                    return;
+                }
+                if (list == null) {
+                    mRefreshLayout.setLoadMore(false);
+                    return;
+                }
+                if (list.size() < 10) {
+                    mRefreshLayout.setLoadMore(false);
+                }
+                if (mPage == 1) {
+                    mList.clear();
+                }
+                mList.addAll(list);
+                mAdapter.notifyDataSetChanged();
+                mPage++;
+                if (mList.isEmpty()){
+                    showEmptyView();
+                }
+            }
+        });
+    }
+
+    private void init() {
+        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
+        mRecyclerView.setHasFixedSize(true);
+        mList = new ArrayList<>();
+        mRecyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(this)
+                .color(getResources().getColor(R.color.line_gray))
+                .size(DensityUtil.dip2px(this, 1))
+                .build());
+        mAdapter = new CommonAdapter<MyTaskEntity.InfoListBean>(this, R.layout.item_my_task, mList) {
+            @Override
+            protected void convert(ViewHolder holder, final MyTaskEntity.InfoListBean bean, int position) {
+                holder.setText(R.id.tv_add, bean.getDisName());
+                final List<MyTaskEntity.Bean> sonArr = bean.getSonArr();
+                if (sonArr != null) {
+                    holder.setVisible(R.id.tv_check, true);
+                    holder.setText(R.id.tv_check, sonArr.size() + "个巡查点");
+                } else {
+                    holder.setVisible(R.id.tv_check, false);
+                }
+                holder.itemView.setOnClickListener(new View.OnClickListener() {
+                    @Override
+                    public void onClick(View view) {//进去详细任务
+                        Log.i("click","进去详细任务");
+                        MyTaskActivity.toMyTask(MyTaskTypeActivity.this, (ArrayList<MyTaskEntity.Bean>) sonArr,mUserInfo,mIsAll);
+                    }
+                });
+            }
+        };
+        mRecyclerView.setAdapter(mAdapter);
+
+        mRefreshLayout.setMaterialRefreshListener(new MaterialRefreshListener() {
+            @Override
+            public void onRefresh(final MaterialRefreshLayout materialRefreshLayout) {
+                //refreshing...
+                mPage = 1;
+                mRefreshLayout.setLoadMore(true);
+                request();
+            }
+
+            @Override
+            public void onRefreshLoadMore(MaterialRefreshLayout materialRefreshLayout) {
+                //load more refreshing...
+                request();
+            }
+        });
+    }
+
+    public static void toMyTask(Context context, LoginEntity.InfoListBean.UserInfoBean userInfo, int isAll) {
+        Intent intent = new Intent(context, MyTaskTypeActivity.class);
+        intent.putExtra("userInfo", userInfo);
+        intent.putExtra("isAll", isAll);
+
+        context.startActivity(intent);
+    }
+
+}

+ 257 - 0
app/src/main/java/com/zhilin/patrol/ui/activity/PatrolRecordActivity.java

xqd
@@ -0,0 +1,257 @@
+package com.zhilin.patrol.ui.activity;
+
+import android.os.Bundle;
+import android.support.design.widget.TabLayout;
+import android.support.v4.app.Fragment;
+import android.support.v4.view.ViewPager;
+import android.view.ViewGroup;
+
+import com.zhilin.patrol.R;
+import com.zhilin.patrol.adapter.FragmentAdapter;
+import com.zhilin.patrol.bean.LoginEntity;
+import com.zhilin.patrol.bean.MyTaskEntity;
+import com.zhilin.patrol.bean.PatrolRecordNumEntity;
+import com.zhilin.patrol.http.HttpUrl;
+import com.zhilin.patrol.tool.DialogUtil;
+import com.zhilin.patrol.tool.IpUtils;
+import com.zhilin.patrol.tool.JsonUtils;
+import com.zhilin.patrol.ui.fragment.PatrolRecordFragment;
+import com.zhy.http.okhttp.OkHttpUtils;
+import com.zhy.http.okhttp.callback.Callback;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import okhttp3.Call;
+import okhttp3.Response;
+import q.rorbin.badgeview.QBadgeView;
+
+/**
+ * 巡查记录
+ */
+public class PatrolRecordActivity extends BaseActivity {
+
+    @BindView(R.id.tab_layout)
+    TabLayout mTabLayout;
+    @BindView(R.id.view_pager)
+    ViewPager mViewPager;
+    private ArrayList<String> mListTitle;
+    private ArrayList<Fragment> mListFragment;
+    private FragmentAdapter mAdapter;
+    private LoginEntity.InfoListBean.UserInfoBean mUserInfo;
+    private int nNum;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_patrol_record);
+        mUserInfo = (LoginEntity.InfoListBean.UserInfoBean) getIntent().getSerializableExtra("userInfo");
+        nNum=getIntent().getIntExtra("num",0);
+        ButterKnife.bind(this);
+        setTitle("巡查记录");
+//        request();
+        init(null);
+    }
+
+    @Override
+    public void request() {
+        showLoadingView();
+        String ipAddress = IpUtils.getIpAddress(this);
+        OkHttpUtils.post()
+                .url(HttpUrl.TASK_STATISTICS_URL)
+                .addParams("userCode", mUserInfo.getUserCode())
+                .addParams("userRole", mUserInfo.getUserRole() + "")
+                .addParams("userIP", ipAddress)
+                .build().execute(new Callback<PatrolRecordNumEntity>() {
+            @Override
+            public PatrolRecordNumEntity parseNetworkResponse(Response response, int id) throws Exception {
+                String jsonStr = response.body().string();
+                return (PatrolRecordNumEntity) JsonUtils.parseJson2Obj(jsonStr, PatrolRecordNumEntity.class);
+            }
+
+            @Override
+            public void onError(Call call, Exception e, int id) {
+                showFailView();
+                DialogUtil.showNetFailDialog(PatrolRecordActivity.this);
+            }
+
+            @Override
+            public void onResponse(PatrolRecordNumEntity entity, int id) {
+                showContentView();
+                if (entity == null) {
+                    DialogUtil.showErrDialog(PatrolRecordActivity.this, "返回信息为空");
+                    return;
+                }
+                PatrolRecordNumEntity.InfoListBean list = entity.getInfoList();
+                if (!"1000".endsWith(entity.getReturnCode())) {
+                    DialogUtil.showErrDialog(PatrolRecordActivity.this, entity.getReturnMsg());
+                    return;
+                }
+                init(entity.getInfoList());
+            }
+        });
+    }
+
+    private void init(PatrolRecordNumEntity.InfoListBean infoList) {
+        if(nNum==123){
+            mListTitle = new ArrayList<>();
+            mListTitle.add("待审核");
+            mListTitle.add("不通过");
+            mListTitle.add("已通过");
+
+            mTabLayout.setTabMode(TabLayout.MODE_FIXED);
+
+            mTabLayout.addTab(mTabLayout.newTab().setText(mListTitle.get(0)));
+            mTabLayout.addTab(mTabLayout.newTab().setText(mListTitle.get(1)));
+            mTabLayout.addTab(mTabLayout.newTab().setText(mListTitle.get(2)));
+
+            mListFragment = new ArrayList<>();
+
+            mListFragment.add(PatrolRecordFragment.newInstance(-1));
+            mListFragment.add(PatrolRecordFragment.newInstance(0));
+            mListFragment.add(PatrolRecordFragment.newInstance(1));
+            mAdapter = new FragmentAdapter(getSupportFragmentManager(), this, mListFragment, mListTitle);
+            //设置适配器
+            mViewPager.setAdapter(mAdapter);
+            mViewPager.setOffscreenPageLimit(3);
+            //tab加载viewPager
+            mTabLayout.setupWithViewPager(mViewPager);
+            if (infoList == null) return;
+            QBadgeView qBadgeView = new QBadgeView(this);
+            QBadgeView qBadgeView2 = new QBadgeView(this);
+            int passIngNum = infoList.getPassIngNum();
+            if (passIngNum != 0) {
+                qBadgeView.bindTarget(((ViewGroup) mTabLayout.getChildAt(0)).getChildAt(0)).setBadgeNumber(passIngNum);
+            }
+            int unPassNum = infoList.getUnPassNum();
+            if (unPassNum != 0) {
+                qBadgeView2.bindTarget(((ViewGroup) mTabLayout.getChildAt(0)).getChildAt(1)).setBadgeNumber(unPassNum);
+            }
+        }
+        if(nNum==1){
+            mListTitle = new ArrayList<>();
+            mListTitle.add("待审核");
+
+            mTabLayout.setTabMode(TabLayout.MODE_FIXED);
+
+            mTabLayout.addTab(mTabLayout.newTab().setText(mListTitle.get(0)));
+
+
+            mListFragment = new ArrayList<>();
+
+            mListFragment.add(PatrolRecordFragment.newInstance(-1));
+
+            mAdapter = new FragmentAdapter(getSupportFragmentManager(), this, mListFragment, mListTitle);
+            //设置适配器
+            mViewPager.setAdapter(mAdapter);
+            mViewPager.setOffscreenPageLimit(1);
+            //tab加载viewPager
+            mTabLayout.setupWithViewPager(mViewPager);
+            if (infoList == null) return;
+            QBadgeView qBadgeView = new QBadgeView(this);
+            QBadgeView qBadgeView2 = new QBadgeView(this);
+            int passIngNum = infoList.getPassIngNum();
+            if (passIngNum != 0) {
+                qBadgeView.bindTarget(((ViewGroup) mTabLayout.getChildAt(0)).getChildAt(0)).setBadgeNumber(passIngNum);
+            }
+            int unPassNum = infoList.getUnPassNum();
+            if (unPassNum != 0) {
+                qBadgeView2.bindTarget(((ViewGroup) mTabLayout.getChildAt(0)).getChildAt(1)).setBadgeNumber(unPassNum);
+            }
+        }
+        if(nNum==2){
+            mListTitle = new ArrayList<>();
+            mListTitle.add("不通过");
+            mTabLayout.setTabMode(TabLayout.MODE_FIXED);
+
+            mTabLayout.addTab(mTabLayout.newTab().setText(mListTitle.get(0)));
+
+            mListFragment = new ArrayList<>();
+
+            mListFragment.add(PatrolRecordFragment.newInstance(0));
+            mAdapter = new FragmentAdapter(getSupportFragmentManager(), this, mListFragment, mListTitle);
+            //设置适配器
+            mViewPager.setAdapter(mAdapter);
+            mViewPager.setOffscreenPageLimit(1);
+            //tab加载viewPager
+            mTabLayout.setupWithViewPager(mViewPager);
+            if (infoList == null) return;
+            QBadgeView qBadgeView = new QBadgeView(this);
+            QBadgeView qBadgeView2 = new QBadgeView(this);
+            int passIngNum = infoList.getPassIngNum();
+            if (passIngNum != 0) {
+                qBadgeView.bindTarget(((ViewGroup) mTabLayout.getChildAt(0)).getChildAt(0)).setBadgeNumber(passIngNum);
+            }
+            int unPassNum = infoList.getUnPassNum();
+            if (unPassNum != 0) {
+                qBadgeView2.bindTarget(((ViewGroup) mTabLayout.getChildAt(0)).getChildAt(1)).setBadgeNumber(unPassNum);
+            }
+        }
+        if(nNum==3){
+            mListTitle = new ArrayList<>();
+            mListTitle.add("已通过");
+
+            mTabLayout.setTabMode(TabLayout.MODE_FIXED);
+
+            mTabLayout.addTab(mTabLayout.newTab().setText(mListTitle.get(0)));
+
+            mListFragment = new ArrayList<>();
+
+            mListFragment.add(PatrolRecordFragment.newInstance(1));
+            mAdapter = new FragmentAdapter(getSupportFragmentManager(), this, mListFragment, mListTitle);
+            //设置适配器
+            mViewPager.setAdapter(mAdapter);
+            mViewPager.setOffscreenPageLimit(1);
+            //tab加载viewPager
+            mTabLayout.setupWithViewPager(mViewPager);
+            if (infoList == null) return;
+            QBadgeView qBadgeView = new QBadgeView(this);
+            QBadgeView qBadgeView2 = new QBadgeView(this);
+            int passIngNum = infoList.getPassIngNum();
+            if (passIngNum != 0) {
+                qBadgeView.bindTarget(((ViewGroup) mTabLayout.getChildAt(0)).getChildAt(0)).setBadgeNumber(passIngNum);
+            }
+            int unPassNum = infoList.getUnPassNum();
+            if (unPassNum != 0) {
+                qBadgeView2.bindTarget(((ViewGroup) mTabLayout.getChildAt(0)).getChildAt(1)).setBadgeNumber(unPassNum);
+            }
+        }
+        /*mListTitle = new ArrayList<>();
+        mListTitle.add("待审核");
+        mListTitle.add("不通过");
+        mListTitle.add("已通过");
+
+        mTabLayout.setTabMode(TabLayout.MODE_FIXED);
+
+        mTabLayout.addTab(mTabLayout.newTab().setText(mListTitle.get(0)));
+        mTabLayout.addTab(mTabLayout.newTab().setText(mListTitle.get(1)));
+        mTabLayout.addTab(mTabLayout.newTab().setText(mListTitle.get(2)));
+
+        mListFragment = new ArrayList<>();
+
+        mListFragment.add(PatrolRecordFragment.newInstance(-1));
+        mListFragment.add(PatrolRecordFragment.newInstance(0));
+        mListFragment.add(PatrolRecordFragment.newInstance(1));
+        mAdapter = new FragmentAdapter(getSupportFragmentManager(), this, mListFragment, mListTitle);
+
+        //设置适配器
+        mViewPager.setAdapter(mAdapter);
+        mViewPager.setOffscreenPageLimit(3);
+        //tab加载viewPager
+        mTabLayout.setupWithViewPager(mViewPager);
+        if (infoList == null) return;
+        QBadgeView qBadgeView = new QBadgeView(this);
+        QBadgeView qBadgeView2 = new QBadgeView(this);
+        int passIngNum = infoList.getPassIngNum();
+        if (passIngNum != 0) {
+            qBadgeView.bindTarget(((ViewGroup) mTabLayout.getChildAt(0)).getChildAt(0)).setBadgeNumber(passIngNum);
+        }
+        int unPassNum = infoList.getUnPassNum();
+        if (unPassNum != 0) {
+            qBadgeView2.bindTarget(((ViewGroup) mTabLayout.getChildAt(0)).getChildAt(1)).setBadgeNumber(unPassNum);
+        }*/
+    }
+
+}

+ 1116 - 0
app/src/main/java/com/zhilin/patrol/ui/activity/PatrolUploadActivity.java

xqd
@@ -0,0 +1,1116 @@
+package com.zhilin.patrol.ui.activity;
+
+import android.Manifest;
+import android.annotation.TargetApi;
+import android.content.ContentValues;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Environment;
+import android.provider.MediaStore;
+import android.support.v7.widget.GridLayoutManager;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.helper.ItemTouchHelper;
+import android.text.Editable;
+import android.text.Html;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.util.Log;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.RadioGroup;
+import android.widget.TextView;
+
+import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration;
+import com.zhilin.patrol.R;
+import com.zhilin.patrol.adapter.UpImageAdapter;
+import com.zhilin.patrol.adapter.helper.GridItemDecoration;
+import com.zhilin.patrol.adapter.helper.MyItemTouchCallback;
+import com.zhilin.patrol.adapter.helper.OnRecyclerItemClickListener;
+import com.zhilin.patrol.bean.AddressAreaEntity;
+import com.zhilin.patrol.bean.LoginEntity;
+import com.zhilin.patrol.bean.MapLocationInfo;
+import com.zhilin.patrol.bean.PatrolFormEntity;
+import com.zhilin.patrol.bean.QuestionKindEntity;
+import com.zhilin.patrol.http.HttpUrl;
+import com.zhilin.patrol.tool.CheckPermissionUtils;
+import com.zhilin.patrol.tool.Compresser;
+import com.zhilin.patrol.tool.DensityUtil;
+import com.zhilin.patrol.tool.DialogUtil;
+import com.zhilin.patrol.tool.IpUtils;
+import com.zhilin.patrol.tool.JsonUtils;
+import com.zhilin.patrol.tool.LocationUtils;
+import com.zhilin.patrol.tool.SPUtil;
+import com.zhilin.patrol.tool.Utils;
+import com.zhilin.patrol.views.AlertDialog;
+import com.zhilin.patrol.views.CustomProgressDialog;
+import com.zhy.adapter.recyclerview.CommonAdapter;
+import com.zhy.adapter.recyclerview.base.ViewHolder;
+import com.zhy.http.okhttp.OkHttpUtils;
+import com.zhy.http.okhttp.callback.Callback;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+import okhttp3.Call;
+import okhttp3.Response;
+
+/**
+ * 巡查上报页面
+ */
+public class PatrolUploadActivity extends BaseActivity implements View.OnClickListener {
+
+    @BindView(R.id.img_recycler)
+    RecyclerView mRecyclerView;
+    /** 选中问题分类 */
+//    @BindView(R.id.question_recycler)
+//    RecyclerView mQuestionRecyclerView;
+    @BindView(R.id.tv_question)
+    TextView mQuestionTypeTv;//问题分类
+    @BindView(R.id.ll_question)
+    LinearLayout mQuestionTypeLl;//问题分类布局
+    @BindView(R.id.line_question)
+    View mQuestionTypeLineView;//问题分类横线
+    @BindView(R.id.rg_question)
+    RadioGroup mQuestionRg;//是否有问题选择
+    @BindView(R.id.et_content)
+    EditText mRemarkEt;//备注
+    @BindView(R.id.tv_content_num)
+    TextView mContentNumTv;//备注长度
+    @BindView(R.id.tv_img_num)
+    TextView mImgNumTv;//图片数量
+    @BindView(R.id.tv_location)
+    TextView mLocationTv;//定位
+    @BindView(R.id.tv_location_goal)
+    TextView mLocationGoalTv;//任务位置
+    @BindView(R.id.ll_last_location)
+    LinearLayout mLastLocationLl;//上次定位的布局
+//    @BindView(R.id.tv_last_location)
+//    TextView mLastLocationTv;//上次定位
+    @BindView(R.id.tv_default_address)//默认地址
+    TextView mDefaultaddressTv;
+
+    private String TAG="PatrolUploadActivity";//打印日志
+
+    //用户信息
+    private LoginEntity.InfoListBean.UserInfoBean mUserInfo;
+    //选择图片适配器
+    private UpImageAdapter mAdapter;
+    //上传图片
+    public ArrayList<String> mDataList = new ArrayList<>();
+
+    private ItemTouchHelper mItemTouchHelper;
+
+    private CustomProgressDialog mProgressDialog;
+
+    private LocationUtils mLocationUtils;
+    /** 定位信息 */
+    private MapLocationInfo mMapLocationInfo;
+    /** 是否有问题 */
+    private Integer mHasProblem;
+    /** 选中的问题类型 */
+//    private QuestionKindEntity.Bean mQuestionKind;
+    /** 是否是指派任务 */
+    private int mIsAssign;
+    /** 问题分类 */
+    private ArrayList mQuestionList;
+    /** 附近小区集合 */
+    private ArrayList mAddressAreaList;
+    private boolean isQuestionJump = true;
+
+    /** 客户文件目录 */
+    private String mImageDir = Environment.getExternalStorageDirectory() + "/patrol/";
+
+    String[] mPermissions = {
+            Manifest.permission.ACCESS_COARSE_LOCATION,
+            Manifest.permission.ACCESS_FINE_LOCATION,
+            Manifest.permission.WRITE_EXTERNAL_STORAGE,
+            Manifest.permission.READ_EXTERNAL_STORAGE,
+            Manifest.permission.CAMERA,
+            Manifest.permission.READ_PHONE_STATE};
+    /** 表单返回码 */
+    private String mTkCode;
+
+    /** 选中的问题类型 */
+//    private List<QuestionKindEntity.Bean> mSelectList = new ArrayList<>();
+    private QuestionKindEntity.Bean mSelectBean;
+//    private CommonAdapter<QuestionKindEntity.Bean> mSelectAdapter;
+    /** 选中的小区 */
+    private AddressAreaEntity.InfoListBean mListBean;
+    private MapLocationInfo mLastMapLocationInfo;
+    private AddressAreaEntity.InfoListBean mLastListBean;
+    private QuestionKindEntity.Bean mLastSelectBean;
+    private int mLastHasProblem;
+    private String mpCode;
+    private String mpbCode;
+    private String maddress;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_patrol_upload);
+        ButterKnife.bind(this);
+        mUserInfo = (LoginEntity.InfoListBean.UserInfoBean) getIntent().getSerializableExtra("userInfo");
+        mIsAssign = getIntent().getIntExtra("isAssign", 0);
+        mpCode=getIntent().getStringExtra("pCode");
+        mpbCode=getIntent().getStringExtra("pbCode");
+        Log.i("mpCode==",mpCode);
+        Log.i("mpbCode==",mpbCode);
+        maddress=getIntent().getStringExtra("address");
+        mProgressDialog = new CustomProgressDialog(this);
+        setTitle("巡查上报");
+        setRightTv("提交");
+        setRightClick(this);
+
+        mLocationUtils = LocationUtils.getInstance();
+        Log.i(TAG,"去定位");
+        mLocationGoalTv.setText(maddress);
+        mLocationUtils.onCreate(new LocationUtils.LocationListener() {
+            @Override
+            public void locationSuccess(MapLocationInfo mapLocationInfo, String message) {
+                if (TextUtils.isEmpty(mapLocationInfo.getAddress())) {
+//                    mMapLocationInfo = null;
+                    mLocationTv.setText(Html.fromHtml("<font color='red'>定位失败!请使用照片证明你在该小区</font>"));
+                } else {
+                    mMapLocationInfo = mapLocationInfo;
+                    mLocationTv.setText(mapLocationInfo.getAddress());
+                }
+                mProgressDialog.dismiss();
+                Log.i(TAG,"定位ok");
+                Log.i(TAG,mMapLocationInfo.toString());
+                defalutAddress();//确定默认小区
+            }
+            @Override
+            public void locationFail(String message) {
+                mProgressDialog.dismiss();
+//                mMapLocationInfo = null;
+                mLocationTv.setText("定位: " + message);
+            }
+        });
+        mQuestionRg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(RadioGroup radioGroup, int i) {
+                int checkedRadioButtonId = radioGroup.getCheckedRadioButtonId();
+                if (checkedRadioButtonId == R.id.rb_question_yes) {//有问题
+//                    mQuestionRecyclerView.setVisibility(View.VISIBLE);
+                    mQuestionTypeLl.setVisibility(View.VISIBLE);
+                    mQuestionTypeLineView.setVisibility(View.VISIBLE);
+                    if (isQuestionJump) {
+                        isQuestionJump = true;
+                        toQuestionType();
+                    }
+                    mHasProblem = 1;
+                } else if (checkedRadioButtonId == R.id.rb_question_no) {//没问题
+                    mHasProblem = 0;
+//                    mQuestionRecyclerView.setVisibility(View.GONE);
+                    mQuestionTypeLl.setVisibility(View.GONE);
+                    mQuestionTypeLineView.setVisibility(View.GONE);
+                }
+            }
+        });
+        mRemarkEt.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
+
+            }
+
+            @Override
+            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
+
+            }
+
+            @Override
+            public void afterTextChanged(Editable editable) {
+                mContentNumTv.setText(mRemarkEt.getText().length() + "/200");
+            }
+        });
+        setRecycler();
+        setImageNum();
+//        setLastData();//上次定位
+        checkPermissions();
+
+        //---------lp返回选择的小区名字,距离
+
+//----------
+    }
+
+    private void defalutAddress(){
+            Log.i(TAG,"准备获取小区");
+            Log.i(TAG,mMapLocationInfo.toString());
+            requestAddress2();
+            Log.i(TAG,"获取到小区");
+//
+    }
+//    private void setLastData() {//上次定位
+//        String lastLocationJsonStr = SPUtil.getShareStr(PatrolUploadActivity.this, SPUtil.SP_COMMON_CONFIG, "last_location");
+//        String addressArea = SPUtil.getShareStr(PatrolUploadActivity.this, SPUtil.SP_COMMON_CONFIG, "addressArea");
+//        mLastHasProblem = SPUtil.getShareInt(PatrolUploadActivity.this, SPUtil.SP_COMMON_CONFIG, "hasProblem");
+//        String lastSelectBeanStr = SPUtil.getShareStr(PatrolUploadActivity.this, SPUtil.SP_COMMON_CONFIG, "selectBean");
+//        mLastMapLocationInfo = (MapLocationInfo) JsonUtils.parseJson2Obj(lastLocationJsonStr, MapLocationInfo.class);
+//        mLastListBean = (AddressAreaEntity.InfoListBean) JsonUtils.parseJson2Obj(addressArea, AddressAreaEntity.InfoListBean.class);
+//        mLastSelectBean = (QuestionKindEntity.Bean) JsonUtils.parseJson2Obj(lastSelectBeanStr, QuestionKindEntity.Bean.class);
+//        if (mLastMapLocationInfo != null) {
+//            mLastLocationLl.setVisibility(View.VISIBLE);
+////            mLastLocationTv.setText(mLastListBean != null ? mLastListBean.getAddress() : mLastMapLocationInfo.getAddress());
+//        }
+//
+//    }
+
+    @TargetApi(Build.VERSION_CODES.M)
+    private void checkPermissions() {
+        mPermissions = CheckPermissionUtils.getNeededPermission(this, mPermissions);
+        if (mPermissions.length > 0) {
+            requestPermissions(mPermissions, 999);
+        }
+        if (mPermissions.length == 0) {
+            //申请过一次这里的permissions.length就为0 了
+            //申请权限后创建图片文件夹
+            Utils.createDir(mImageDir);
+            locationAddress();
+        }
+    }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
+        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+        for (int i = 0; i < grantResults.length; i++) {
+            if (PackageManager.PERMISSION_GRANTED != grantResults[i]) {
+                new AlertDialog(PatrolUploadActivity.this).builder()
+                        .setTitle(PatrolUploadActivity.this.getString(R.string.tv_tishi))
+                        .setMsg("获取权限失败,是否重新尝试?")
+                        .setPositiveButton("重试", new View.OnClickListener() {
+                            @Override
+                            public void onClick(View view) {
+                                checkPermissions();
+                            }
+                        })
+                        .setNegativeButton("取消", new View.OnClickListener() {
+                            @Override
+                            public void onClick(View v) {
+
+                            }
+                        }).show();
+                return;
+            }
+        }
+        locationAddress();
+        //申请权限后创建图片文件夹
+        Utils.createDir(mImageDir);
+    }
+
+    /**
+     * 定位
+     */
+    private void locationAddress() {
+        mProgressDialog.showDialog("正在定位...");
+        mLocationUtils.startLocationInfo();
+    }
+
+    /**
+     * 设置图片数量
+     */
+    public void setImageNum() {
+        mImgNumTv.setText(Html.fromHtml("上传图片 <Small>" + mDataList.size() + "/9</Small>"));
+    }
+
+    @OnClick({R.id.tv_question, R.id.ll_location})//R.id.tv_last_location_use
+    public void onClick(View view) {
+        switch (view.getId()) {
+//            case R.id.tv_last_location_use://使用上次定位
+//                if (mLastHasProblem != -1) {
+//                    mHasProblem = mLastHasProblem;
+//                    isQuestionJump = false;
+//                    if (mHasProblem == 1) {//有问题
+//                        mQuestionRg.check(R.id.rb_question_yes);
+//                    } else {//没问题
+//                        mQuestionRg.check(R.id.rb_question_no);
+//                    }
+//                }
+//                mSelectBean = mLastSelectBean;
+//                mMapLocationInfo = mLastMapLocationInfo;
+//                mListBean = mLastListBean;
+////                mLocationTv.setText(mMapLocationInfo.getAddress());
+//                if (mSelectBean != null) {
+//                    mQuestionTypeTv.setText(mSelectBean.getqName());
+//                }
+//                mLocationTv.setText(mLastListBean != null ? mLastListBean.getAddress() : mLastMapLocationInfo.getAddress());
+//                break;
+            case R.id.tv_question://问题分类
+                toQuestionType();
+                break;
+            case R.id.ll_location://定位
+                if (mMapLocationInfo == null) {
+                    locationAddress();
+                } else {//选择小区
+                    toAddressSelect();
+                }
+                break;
+            case R.id.tv_right://提交
+                if (!TextUtils.isEmpty(mTkCode)) {
+                    mProgressDialog.showDialog("正在提交...");
+                    postPatrolImage(mTkCode);
+                    return;
+                }
+                if (mHasProblem == null) {
+                    Utils.showToast(this, "请选择该巡查点是否有问题");
+                    return;
+                }
+//                if (mHasProblem == 1 && mSelectList == null && mSelectList.isEmpty()) {
+                if (mHasProblem == 1 && mSelectBean == null) {
+                    Utils.showToast(this, "请选择问题类型");
+                    return;
+                }
+                if (mDataList.size() < 1) {
+                    Utils.showToast(this, "请拍摄图片");
+                    return;
+                }
+                String remark = mRemarkEt.getText().toString().trim();
+                if (mMapLocationInfo == null) {
+                    if (TextUtils.isEmpty(remark)) {
+                        Utils.showToast(this, "请输入备注信息");
+                        return;
+                    }
+                }
+                String questionKind = "";
+                if (mHasProblem == 1) {
+//                    StringBuilder sb = new StringBuilder();
+//                    for (QuestionKindEntity.Bean bean : mSelectList) {
+//                        sb.append(bean.getqCode()).append(",");
+//                    }
+//                    questionKind = sb.substring(0, sb.length() - 1);
+                    questionKind = mSelectBean.getqCode();
+                }
+                postPatrol(mMapLocationInfo, mHasProblem, questionKind, remark);
+                break;
+            default:
+                break;
+        }
+    }
+
+    private void toAddressSelect() {
+        if (mAddressAreaList == null) {
+            requestAddress();
+        } else {
+            Log.i(TAG,mAddressAreaList.toString()+"附近小区list");
+            toAddressSelectActivity();
+        }
+    }
+
+    /**
+     * 请求地址
+     */
+    public void requestAddress() {
+        Log.i(TAG,"requestAddress");
+        mProgressDialog.showDialog("正在获取附近小区...");
+        String ipAddress = IpUtils.getIpAddress(this);
+        Log.i(TAG,mUserInfo.getUserCode());
+        Log.i(TAG,mUserInfo.getUserRole() + "");
+        Log.i(TAG,ipAddress);
+        Log.i(TAG,mMapLocationInfo.getDistrict());
+        Log.i(TAG,mMapLocationInfo.getLongitude() + "");
+        Log.i(TAG,mMapLocationInfo.getLatitude() + "");
+
+        OkHttpUtils.post()
+                .url(HttpUrl.GET_NEAR_ADDRESS_URL)
+                .addParams("userCode", mUserInfo.getUserCode())
+                .addParams("userRole", mUserInfo.getUserRole() + "")
+                .addParams("userIP", ipAddress)
+                .addParams("disName", mMapLocationInfo.getDistrict())
+                .addParams("longitude", mMapLocationInfo.getLongitude() + "")
+                .addParams("latitude", mMapLocationInfo.getLatitude() + "")
+//                .addParams("userCode", "123")http://39.106.14.189:8081/index.php/ApiMobi/getNearAddress?userRole=1&userCode=123&disName=汉江区&longitude=114.339037&latitude=30.546917
+//                .addParams("userRole", "1")
+//                .addParams("userIP", ipAddress)
+//                .addParams("disName", "%E6%B1%9F%E6%B1%89%E5%8C%BA")
+//                .addParams("longitude", "114.339037")
+//                .addParams("latitude",  "30.546917")
+                .build().execute(new Callback<AddressAreaEntity>() {
+            @Override
+            public AddressAreaEntity parseNetworkResponse(Response response, int id) throws Exception {
+                String jsonStr = response.body().string();
+                return (AddressAreaEntity) JsonUtils.parseJson2Obj(jsonStr, AddressAreaEntity.class);
+            }
+
+            @Override
+            public void onError(Call call, Exception e, int id) {
+                mProgressDialog.dismiss();
+                DialogUtil.showNetFailDialog(PatrolUploadActivity.this);
+            }
+
+            @Override
+            public void onResponse(AddressAreaEntity entity, int id) {
+                mProgressDialog.dismiss();
+                if (entity == null) {
+                    DialogUtil.showErrDialog(PatrolUploadActivity.this, "返回信息为空");
+                    return;
+                }
+                if (!"1000".endsWith(entity.getReturnCode())) {
+                    DialogUtil.showErrDialog(PatrolUploadActivity.this, entity.getReturnMsg());
+                    return;
+                }
+                List<AddressAreaEntity.InfoListBean> infoList = entity.getInfoList();
+
+                if (infoList == null) {
+                    DialogUtil.showErrDialog(PatrolUploadActivity.this, "返回数组为空");
+                    return;
+                }
+                if (infoList != null) {
+                    mAddressAreaList = new ArrayList();
+                    for (AddressAreaEntity.InfoListBean bean : infoList) {
+                        mAddressAreaList.add(bean);
+                    }
+                }
+                Log.i(TAG,mAddressAreaList.toString()+"得到附近小区list");
+                toAddressSelectActivity();
+            }
+        });
+    }
+    public void requestAddress2() {
+        Log.i(TAG,"requestAddress2");
+        mProgressDialog.showDialog("正在获取附近小区...");
+        Log.i(TAG,"getIpAddress");
+        String ipAddress = IpUtils.getIpAddress(this);
+        Log.i(TAG,"post");
+        OkHttpUtils.post()
+                .url(HttpUrl.GET_NEAR_ADDRESS_URL)
+                .addParams("userCode", mUserInfo.getUserCode())
+                .addParams("userRole", mUserInfo.getUserRole() + "")
+                .addParams("userIP", ipAddress)
+                .addParams("disName", mMapLocationInfo.getDistrict())
+                .addParams("longitude", mMapLocationInfo.getLongitude() + "")
+                .addParams("latitude", mMapLocationInfo.getLatitude() + "")
+//                .addParams("userCode", "123")
+//                .addParams("userRole", "1")
+//                .addParams("userIP", ipAddress)
+//                .addParams("disName", "%E6%B1%9F%E6%B1%89%E5%8C%BA")
+//                .addParams("longitude", "114.339037")
+//                .addParams("latitude",  "30.546917")
+                .build().execute(new Callback<AddressAreaEntity>() {
+            @Override
+            public AddressAreaEntity parseNetworkResponse(Response response, int id) throws Exception {
+                Log.i(TAG,"jsonStr");
+                String jsonStr = response.body().string();
+                Log.i(TAG,jsonStr);
+                return (AddressAreaEntity) JsonUtils.parseJson2Obj(jsonStr, AddressAreaEntity.class);
+            }
+
+            @Override
+            public void onError(Call call, Exception e, int id) {
+                mProgressDialog.dismiss();
+                DialogUtil.showNetFailDialog(PatrolUploadActivity.this);
+            }
+
+            @Override
+            public void onResponse(AddressAreaEntity entity, int id) {
+                mProgressDialog.dismiss();
+                List<AddressAreaEntity.InfoListBean> infoList = entity.getInfoList();
+                int mindDistancenumber=0;
+                String addressdefault="附近没有小区";
+                Log.i(TAG,"循环遍历");
+                Log.i(TAG, infoList.toString());
+                Log.i(TAG, infoList.size()+" ");
+                if(infoList.size()!=0) {
+//                    List<Integer> list=new ArrayList<Integer>();
+                    int[] arr=new int[infoList.size()];
+                    for (int i = 0; i <= infoList.size()-1; i++) {
+//                        list.add(i,Integer.parseInt(infoList.get(i).getDistance()));
+                        arr[i]=Integer.parseInt(infoList.get(i).getDistance());
+                        Log.i(TAG, infoList.get(i).getDistance()+"distance");
+                    }
+                    Log.i(TAG, arr+"arr1");
+                    for(int i=0;i<=infoList.size()-1;i++){
+                        for (int j = 0; j <= infoList.size() - i-2; j++) {
+//                        Integer itemp=new Integer(infoList.get(j).getDistance());
+//                        Integer itemp2=new Integer(infoList.get(j+1).getDistance());
+//                        int mindDistance=itemp.intValue();
+//                        int mindDistance2=itemp2.intValue();
+//                            int a = Integer.parseInt(infoList.get(j).getDistance());
+//                            Log.i(TAG, infoList.get(j).getDistance()+"mindDistance");
+//                            int b = Integer.parseInt(infoList.get(j + 1).getDistance());
+//                            Log.i(TAG, infoList.get(j+1).getDistance()+"mindDistance2");
+                            if (arr[j]>arr[j+1]) {
+                                int itemp3=arr[j];
+                                arr[j]= arr[j+1];
+                                arr[j+1]=itemp3;
+                            }
+                        }
+                    }
+                    Log.i(TAG, arr+"arr");
+                    int minddistance=0;
+                    Log.i(TAG, "得到最小距离");
+                    for (int n = 0; n <= infoList.size()-1; n++) {
+//                    Integer itemp4=new Integer(infoList.get(n).getDistance());
+//                    int Distancenumber=itemp4.intValue();
+                        int Distancenumber = arr[0];
+                        if (Integer.parseInt(infoList.get(n).getDistance())==Distancenumber) {
+                            mindDistancenumber=Distancenumber;
+                            addressdefault = infoList.get(n).getAddress();
+                            infoList.get(n).setSelected(true);
+                           mListBean=infoList.get(n);
+                            Log.i(TAG, infoList.get(n).isSelected() +"==isSelected");
+                            Log.i(TAG, addressdefault+"addressdefault");
+                        }
+                    }
+                }
+
+                if(mindDistancenumber==0) {
+                    Log.i(TAG,"附近没有小区");
+                    mDefaultaddressTv.setText(addressdefault);
+                }else{
+                    Log.i(TAG,"默认小区地址");
+                    mDefaultaddressTv.setText(addressdefault+"   "+mindDistancenumber+"m");
+                    Log.i(TAG,addressdefault+"  "+mindDistancenumber);
+                    mLocationTv.setText(addressdefault);
+                }
+            }
+        });
+        Log.i(TAG, "退出requestAddress2");
+        mProgressDialog.dismiss();
+    }
+
+
+    /**
+     * 提交巡查信息
+     *
+     * @param mapLocationInfo
+     * @param hasProblem
+     * @param questionKind
+     * @param remark
+     */
+    private void postPatrol(final MapLocationInfo mapLocationInfo, Integer hasProblem, String questionKind, String remark) {
+
+        String ipAddress = IpUtils.getIpAddress(this);
+        boolean isNull = (mapLocationInfo == null);
+
+        if (mListBean != null) {
+            Log.i("上传",mListBean.getAddress());
+            Log.i("上传",mListBean.isSelected()+"");
+        }
+        Log.i("地位地址==",isNull ? "定位失败" : mapLocationInfo.getAddress()+"-"+mListBean == null ? "" : mListBean.getAddress());
+        String address=mListBean == null ? "" : mListBean.getAddress();
+        Log.i("mpbCode==",mpCode);
+        Log.i("mpbCode==",mpbCode);
+        Log.i("userCode==",mUserInfo.getUserCode());
+        Log.i("userRole==",mUserInfo.getUserRole() + "");
+        Log.i("isAssign==",mIsAssign + "");
+        Log.i("isProblem==",hasProblem + "");
+        Log.i("qCode==",questionKind);
+        Log.i("infoExt==",remark);
+        Log.i("userIP==",ipAddress);
+        Log.i("latitude==",mapLocationInfo.getLatitude() + "");
+        Log.i("longitude==",mapLocationInfo.getLongitude()+"");
+        Log.i("address==",mapLocationInfo.getAddress()+"-"+address);
+        Log.i("disName==",mapLocationInfo.getDistrict());
+        Log.i("street==",mapLocationInfo.getStreet());
+        Log.i("aoi==",mapLocationInfo.getAoi());
+        Log.i("addrCode==",mapLocationInfo.getPoi());
+        if(maddress.equals(address)){//||maddress.equals("fir")
+            /*if(mpCode.equals("fir")){
+                mProgressDialog.showDialog("正在提交...");
+                OkHttpUtils.post()
+                        .url(HttpUrl.PUBLISH_URL)
+                        .addParams("userCode", mUserInfo.getUserCode())
+                        .addParams("userRole", mUserInfo.getUserRole() + "")
+                        .addParams("isAssign", mIsAssign + "")
+                        .addParams("isProblem", hasProblem + "")
+                        .addParams("qCode", questionKind)
+                        .addParams("infoExt", remark)
+                        .addParams("userIP", ipAddress)
+                        .addParams("address", isNull ? "定位失败" : mapLocationInfo.getAddress()+"-"+address)
+                        .addParams("longitude", isNull ? "0" : mapLocationInfo.getLongitude() + "")
+                        .addParams("latitude", isNull ? "0" : mapLocationInfo.getLatitude() + "")
+                        .addParams("disName", isNull ? "" : mapLocationInfo.getDistrict())
+                        .addParams("street", isNull ? "定位失败" : mapLocationInfo.getStreet())
+                        .addParams("aoi", isNull ? "定位失败" : mapLocationInfo.getAoi())
+                        .addParams("poi", isNull ? "定位失败" : mapLocationInfo.getPoi())
+//                        .addParams("pCode",mpCode)
+//                .addParams("cCode",mcCode)
+                        .addParams("addrCode", mListBean == null ? "" : mListBean.getAddrCode())
+                        .build().execute(new Callback<PatrolFormEntity>() {
+                    @Override
+                    public PatrolFormEntity parseNetworkResponse(Response response, int id) throws Exception {
+                        String jsonStr = response.body().string();
+                        return (PatrolFormEntity) JsonUtils.parseJson2Obj(jsonStr, PatrolFormEntity.class);
+                    }
+
+                    @Override
+                    public void onError(Call call, Exception e, int id) {
+                        mProgressDialog.dismiss();
+                        DialogUtil.showNetFailDialog(PatrolUploadActivity.this);
+                    }
+
+                    @Override
+                    public void onResponse(PatrolFormEntity entity, int id) {
+                        if (entity == null) {
+                            DialogUtil.showErrDialog(PatrolUploadActivity.this, "返回信息为空");
+                            return;
+                        }
+                        if (!"1000".endsWith(entity.getReturnCode())) {
+                            DialogUtil.showErrDialog(PatrolUploadActivity.this, entity.getReturnMsg());
+                            return;
+                        }
+                        saveLastData(mapLocationInfo);
+                        PatrolFormEntity.InfoListBean bean = entity.getInfoList();
+                        mTkCode = bean.getTkCode();
+                        postPatrolImage(mTkCode);
+                    }
+                });*/
+            if(mpbCode.equals("null")){
+                mProgressDialog.showDialog("正在提交...");
+                OkHttpUtils.post()
+                        .url(HttpUrl.PUBLISH_URL)
+                        .addParams("userCode", mUserInfo.getUserCode())
+                        .addParams("userRole", mUserInfo.getUserRole() + "")
+                        .addParams("isAssign", mIsAssign + "")
+                        .addParams("isProblem", hasProblem + "")
+                        .addParams("qCode", questionKind)
+                        .addParams("infoExt", remark)
+                        .addParams("userIP", ipAddress)
+                        .addParams("address", isNull ? "定位失败" : mapLocationInfo.getAddress() + "-" + address)
+                        .addParams("longitude", isNull ? "0" : mapLocationInfo.getLongitude() + "")
+                        .addParams("latitude", isNull ? "0" : mapLocationInfo.getLatitude() + "")
+                        .addParams("disName", isNull ? "" : mapLocationInfo.getDistrict())
+                        .addParams("street", isNull ? "定位失败" : mapLocationInfo.getStreet())
+                        .addParams("aoi", isNull ? "定位失败" : mapLocationInfo.getAoi())
+                        .addParams("poi", isNull ? "定位失败" : mapLocationInfo.getPoi())
+                        .addParams("pCode", mpCode)
+//                .addParams("cCode",mcCode)
+                        .addParams("addrCode", mListBean == null ? "" : mListBean.getAddrCode())
+                        .build().execute(new Callback<PatrolFormEntity>() {
+                    @Override
+                    public PatrolFormEntity parseNetworkResponse(Response response, int id) throws Exception {
+                        String jsonStr = response.body().string();
+                        return (PatrolFormEntity) JsonUtils.parseJson2Obj(jsonStr, PatrolFormEntity.class);
+                    }
+
+                    @Override
+                    public void onError(Call call, Exception e, int id) {
+                        mProgressDialog.dismiss();
+                        DialogUtil.showNetFailDialog(PatrolUploadActivity.this);
+                    }
+
+                    @Override
+                    public void onResponse(PatrolFormEntity entity, int id) {
+                        if (entity == null) {
+                            DialogUtil.showErrDialog(PatrolUploadActivity.this, "返回信息为空");
+                            return;
+                        }
+                        if (!"1000".endsWith(entity.getReturnCode())) {
+                            DialogUtil.showErrDialog(PatrolUploadActivity.this, entity.getReturnMsg());
+                            return;
+                        }
+                        saveLastData(mapLocationInfo);
+                        PatrolFormEntity.InfoListBean bean = entity.getInfoList();
+                        mTkCode = bean.getTkCode();
+                        postPatrolImage(mTkCode);
+                    }
+                });
+            }else{
+                mProgressDialog.showDialog("正在提交...");
+                Log.i("mpbCode==",mpCode);
+                Log.i("mpbCode==",mpbCode);
+                Log.i("userCode==",mUserInfo.getUserCode());
+                Log.i("userRole==",mUserInfo.getUserRole() + "");
+                Log.i("isAssign==",mIsAssign + "");
+                Log.i("isProblem==",hasProblem + "");
+                Log.i("qCode==",questionKind);
+                Log.i("infoExt==",remark);
+                Log.i("userIP==",ipAddress);
+                Log.i("latitude==",mapLocationInfo.getLatitude() + "");
+                Log.i("longitude==",mapLocationInfo.getLongitude()+"");
+                Log.i("address==",mapLocationInfo.getAddress()+"-"+address);
+                Log.i("disName==",mapLocationInfo.getDistrict());
+                Log.i("street==",mapLocationInfo.getStreet());
+                Log.i("aoi==",mapLocationInfo.getAoi());
+                Log.i("addrCode==",mapLocationInfo.getPoi());
+                OkHttpUtils.post()
+                        .url(HttpUrl.PUBLISH_URL)
+                        .addParams("userCode", mUserInfo.getUserCode())
+                        .addParams("userRole", mUserInfo.getUserRole() + "")
+                        .addParams("isAssign", mIsAssign + "")
+                        .addParams("isProblem", hasProblem + "")
+                        .addParams("qCode", questionKind)
+                        .addParams("infoExt", remark)
+                        .addParams("userIP", ipAddress)
+                        .addParams("address", isNull ? "定位失败" : mapLocationInfo.getAddress()+"-"+address)
+                        .addParams("longitude", isNull ? "0" : mapLocationInfo.getLongitude() + "")
+                        .addParams("latitude", isNull ? "0" : mapLocationInfo.getLatitude() + "")
+                        .addParams("disName", isNull ? "" : mapLocationInfo.getDistrict())
+                        .addParams("street", isNull ? "定位失败" : mapLocationInfo.getStreet())
+                        .addParams("aoi", isNull ? "定位失败" : mapLocationInfo.getAoi())
+                        .addParams("poi", isNull ? "定位失败" : mapLocationInfo.getPoi())
+                        .addParams("pCode",mpCode)
+                        .addParams("pbCode",mpbCode)
+//                .addParams("cCode",mcCode)
+                        .addParams("addrCode", mListBean == null ? "" : mListBean.getAddrCode())
+                        .build().execute(new Callback<PatrolFormEntity>() {
+                    @Override
+                    public PatrolFormEntity parseNetworkResponse(Response response, int id) throws Exception {
+                        String jsonStr = response.body().string();
+                        return (PatrolFormEntity) JsonUtils.parseJson2Obj(jsonStr, PatrolFormEntity.class);
+                    }
+
+                    @Override
+                    public void onError(Call call, Exception e, int id) {
+                        mProgressDialog.dismiss();
+                        DialogUtil.showNetFailDialog(PatrolUploadActivity.this);
+                    }
+
+                    @Override
+                    public void onResponse(PatrolFormEntity entity, int id) {
+                        if (entity == null) {
+                            DialogUtil.showErrDialog(PatrolUploadActivity.this, "返回信息为空");
+                            return;
+                        }
+                        if (!"1000".endsWith(entity.getReturnCode())) {
+                            DialogUtil.showErrDialog(PatrolUploadActivity.this, entity.getReturnMsg());
+                            return;
+                        }
+                        saveLastData(mapLocationInfo);
+                        PatrolFormEntity.InfoListBean bean = entity.getInfoList();
+                        mTkCode = bean.getTkCode();
+                        postPatrolImage(mTkCode);
+                    }
+                });
+            }
+        }else{
+            Utils.showToast(this, "选择小区与任务点小区不符");
+        }
+
+    }
+
+    private void saveLastData(MapLocationInfo mapLocationInfo) {
+        SPUtil.savaToShared(PatrolUploadActivity.this, SPUtil.SP_COMMON_CONFIG, "last_location", JsonUtils.parseObj2Json(mapLocationInfo));
+        SPUtil.savaToShared(PatrolUploadActivity.this, SPUtil.SP_COMMON_CONFIG, "addressArea", JsonUtils.parseObj2Json(mListBean));
+        SPUtil.savaToShared(PatrolUploadActivity.this, SPUtil.SP_COMMON_CONFIG, "hasProblem", mHasProblem);
+        SPUtil.savaToShared(PatrolUploadActivity.this, SPUtil.SP_COMMON_CONFIG, "selectBean", JsonUtils.parseObj2Json(mSelectBean));
+    }
+
+    /**
+     * 上传图片
+     */
+    private void postPatrolImage(final String tkCode) {
+        final String ipAddress = IpUtils.getIpAddress(PatrolUploadActivity.this);
+        new Thread() {
+            @Override
+            public void run() {
+                ArrayList<String> list = new ArrayList(mDataList);
+                for (String imgPath : list) {
+                    try {
+                        postPatrolImageSync(ipAddress, imgPath, tkCode);
+                    } catch (IOException e) {
+                        Log.e("post_image", "图片上传失败");
+                    }
+                }
+                list.clear();
+                list = null;
+                runOnUiThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        mProgressDialog.dismiss();
+                        if (mDataList.size() == 0) {
+                            Utils.showToast(PatrolUploadActivity.this, "提交成功,请等待审核");
+                            finish();
+                        } else {
+                            Utils.showToast(PatrolUploadActivity.this, "图片上传失败,请点击提交重新上传");
+                        }
+                    }
+                });
+            }
+        }.start();
+    }
+
+    /**
+     * 提交巡查图片
+     *
+     * @param tkCode
+     */
+    private void postPatrolImageSync(String ipAddress, final String imagePath, String tkCode) throws IOException {
+        Log.i(TAG,"提交巡查图片");
+        File file = new File(imagePath);
+        String fileName = file.getName();
+        Response response = OkHttpUtils.post()
+                .url(HttpUrl.PUBLISH_IMG_URL)
+                .addParams("userCode", mUserInfo.getUserCode())
+                .addParams("userRole", mUserInfo.getUserRole() + "")
+                .addParams("tkCode", tkCode)
+                .addParams("userIP", ipAddress)
+                .addFile("imgFile", fileName, file)
+                .build().execute();
+        if (response.isSuccessful()) {
+            String jsonStr = response.body().string();
+            Log.i(TAG,jsonStr+"=jsonStr");
+            PatrolFormEntity entity = (PatrolFormEntity) JsonUtils.parseJson2Obj(jsonStr, PatrolFormEntity.class);
+            Log.i(TAG,entity.getReturnCode()+"=getReturnCode");
+            if (!"1000".endsWith(entity.getReturnCode())) {
+                DialogUtil.showErrDialog(PatrolUploadActivity.this, entity.getReturnMsg());
+                throw new IOException(entity.getReturnMsg());
+            } else {
+                runOnUiThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        mDataList.remove(imagePath);
+                        Utils.delSingleFile(imagePath);
+                        mAdapter.notifyDataSetChanged();
+                    }
+                });
+            }
+        } else {
+            throw new IOException(response.message());
+        }
+    }
+
+    /**
+     * 跳转到问题类型页面
+     */
+    private void toQuestionType() {
+        if (mQuestionList == null) {
+            requestQuestionType();
+        } else {
+            toQuestionTypeActivity();
+        }
+    }
+
+    /**
+     * 跳转到问题类型页面
+     */
+    private void toQuestionTypeActivity() {
+        Intent intent = new Intent(this, QuestionTypeActivity.class);
+        intent.putExtra("userInfo", mUserInfo);
+        intent.putExtra("QuestionInfoList", mQuestionList);
+        startActivityForResult(intent, 1);
+    }
+
+    /**
+     * 跳转到选择小区页面
+     */
+    private void toAddressSelectActivity() {
+        Intent intent = new Intent(PatrolUploadActivity.this, AddressSelectActivity.class);
+        intent.putExtra("userInfo", mUserInfo);
+        intent.putExtra("AddressAreaList", mAddressAreaList);
+        startActivityForResult(intent, 2);
+    }
+
+    /**
+     * 请求问题类型
+     */
+    public void requestQuestionType() {
+        mProgressDialog.showDialog("正在获取问题类型...");
+        String ipAddress = IpUtils.getIpAddress(this);
+        OkHttpUtils.post()
+                .url(HttpUrl.QUESTION_KIND_URL)
+                .addParams("userCode", mUserInfo.getUserCode())
+                .addParams("userRole", mUserInfo.getUserRole() + "")
+                .addParams("userIP", ipAddress)
+                .build().execute(new Callback<QuestionKindEntity>() {
+            @Override
+            public QuestionKindEntity parseNetworkResponse(Response response, int id) throws Exception {
+                String jsonStr = response.body().string();
+                return (QuestionKindEntity) JsonUtils.parseJson2Obj(jsonStr, QuestionKindEntity.class);
+            }
+
+            @Override
+            public void onError(Call call, Exception e, int id) {
+                mProgressDialog.dismiss();
+                DialogUtil.showNetFailDialog(PatrolUploadActivity.this);
+            }
+
+            @Override
+            public void onResponse(QuestionKindEntity entity, int id) {
+                mProgressDialog.dismiss();
+                if (entity == null) {
+                    DialogUtil.showErrDialog(PatrolUploadActivity.this, "返回信息为空");
+                    return;
+                }
+                if (!"1000".endsWith(entity.getReturnCode())) {
+                    DialogUtil.showErrDialog(PatrolUploadActivity.this, entity.getReturnMsg());
+                    return;
+                }
+                List<QuestionKindEntity.InfoListBean> infoList = entity.getInfoList();
+                if (infoList == null) {
+                    DialogUtil.showErrDialog(PatrolUploadActivity.this, "返回数组为空");
+                    return;
+                }
+                if (infoList != null) {
+                    mQuestionList = new ArrayList();
+                    for (QuestionKindEntity.InfoListBean bean : infoList) {
+                        mQuestionList.add(bean);
+                        mQuestionList.addAll(bean.getKindSon());
+                    }
+                }
+                toQuestionTypeActivity();
+            }
+        });
+    }
+
+
+    private void setRecycler() {
+        GridLayoutManager layoutManager = new GridLayoutManager(this, 4, GridLayoutManager.VERTICAL, false);
+        mAdapter = new UpImageAdapter(this, mDataList, layoutManager.getSpanCount());
+        mRecyclerView.setHasFixedSize(true);
+        mRecyclerView.setLayoutManager(layoutManager);
+        mRecyclerView.setAdapter(mAdapter);
+        mRecyclerView.addItemDecoration(new GridItemDecoration(DensityUtil.dip2px(this, 8)));
+        MyItemTouchCallback callback = new MyItemTouchCallback(mAdapter);
+        mItemTouchHelper = new ItemTouchHelper(callback);
+        mItemTouchHelper.attachToRecyclerView(mRecyclerView);
+        mRecyclerView.addOnItemTouchListener(new OnRecyclerItemClickListener(mRecyclerView) {
+            @Override
+            public void onLongClick(RecyclerView.ViewHolder vh) {
+                if (vh.getLayoutPosition() != mDataList.size()) {
+                    mItemTouchHelper.startDrag(vh);
+                }
+            }
+        });
+
+//        mQuestionRecyclerView.setLayoutManager(new LinearLayoutManager(this));
+//        mQuestionRecyclerView.setHasFixedSize(true);
+//        mQuestionRecyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(this)
+//                .color(getResources().getColor(R.color.line_gray))
+//                .size(DensityUtil.dip2px(this, 1))
+//                .build());
+//        mSelectAdapter = new CommonAdapter<QuestionKindEntity.Bean>(this, R.layout.item_question_type_del, mSelectList) {
+//            @Override
+//            protected void convert(ViewHolder holder, final QuestionKindEntity.Bean bean, final int position) {
+//                holder.setText(R.id.tv_question, bean.getqName());
+//                holder.setOnClickListener(R.id.iv_del, new View.OnClickListener() {
+//                    @Override
+//                    public void onClick(View v) {
+//                        mSelectList.remove(bean);
+//                        for (Object o : mQuestionList) {
+//                            if (o instanceof QuestionKindEntity.ListBean) {
+//                                QuestionKindEntity.ListBean listBean = (QuestionKindEntity.ListBean) o;
+//                                List<QuestionKindEntity.Bean> sonCell = listBean.getSonCell();
+//                                for (QuestionKindEntity.Bean b : sonCell) {
+//                                    if (b.getqCode().equals(bean.getqCode())) {
+//                                        b.setSelected(false);
+//                                    }
+//                                }
+//                            }
+//                        }
+//                        notifyDataSetChanged();
+//                    }
+//                });
+//            }
+//        };
+//        mQuestionRecyclerView.setAdapter(mSelectAdapter);
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (requestCode == 1 && resultCode == 1) {//返回问题类型
+            mQuestionList = (ArrayList) data.getSerializableExtra("QuestionInfoList");
+//            mSelectList.clear();
+            for (Object o : mQuestionList) {
+                if (o instanceof QuestionKindEntity.ListBean) {
+                    QuestionKindEntity.ListBean bean = (QuestionKindEntity.ListBean) o;
+                    List<QuestionKindEntity.Bean> sonCell = bean.getSonCell();
+                    for (QuestionKindEntity.Bean b : sonCell) {
+                        if (b.isSelected()) {
+//                            mSelectList.add(b);
+                            mSelectBean = b;
+                            mQuestionTypeTv.setText(mSelectBean.getqName());
+                        }
+                    }
+                }
+            }
+//            mSelectAdapter.notifyDataSetChanged();
+        } else if (requestCode == 2 && resultCode == 1) {//返回小区选择
+            mListBean = (AddressAreaEntity.InfoListBean) data.getSerializableExtra("ListBean");
+            mAddressAreaList = (ArrayList) data.getSerializableExtra("AddressAreaList");
+            mLocationTv.setText(mListBean.getAddress());
+            mDefaultaddressTv.setText(mListBean.getAddress()+"    "+mListBean.getDistance()+"m");
+        } else if (requestCode == TAKE_PICTURE) {
+            //返回拍照的图片
+            if (resultCode == -1 && !TextUtils.isEmpty(path) && Utils.fileIsExists(path)) {
+                //压缩图片
+                mProgressDialog.showDialog("正在压缩图片");
+                new Thread() {
+                    @Override
+                    public void run() {
+                        try {
+                            File compressFile = Compresser.getInstance()
+                                    .compressImage(Compresser.THIRD_GEAR, new File(path),
+                                            mImageDir);
+                            if (compressFile != null && compressFile.exists()) {
+                                mDataList.add(compressFile.getAbsolutePath());
+                                runOnUiThread(new Runnable() {
+                                    @Override
+                                    public void run() {
+                                        mProgressDialog.dismiss();
+                                        mAdapter.notifyDataSetChanged();
+                                        setImageNum();
+                                    }
+                                });
+                            }
+                        } catch (IOException e) {
+                            e.printStackTrace();
+                        }
+                    }
+                }.start();
+            }
+
+        }
+    }
+
+    /** 拍照的文件地址 */
+    private String path = "";
+    /** 拍照请求码 */
+    private static final int TAKE_PICTURE = 0x000003;
+
+    /**
+     * 拍照
+     */
+    public void toCamera() {
+        if (UpImageAdapter.MAX_IMAGE_SIZE <= 0) {
+            Utils.showToast(this, "已达到上传图片上限!");
+            return;
+        }
+        File vFile = new File(Environment.getExternalStorageDirectory()
+                + "/myimage/", new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())
+                + ".jpg");
+
+        if (!vFile.exists()) {
+            File vDirPath = vFile.getParentFile();
+            vDirPath.mkdirs();
+        } else {
+            if (vFile.exists()) {
+                vFile.delete();
+            }
+        }
+        path = vFile.getPath();
+        /*获取当前系统的android版本号*/
+        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
+        int currentapiVersion = android.os.Build.VERSION.SDK_INT;
+        if (currentapiVersion < Build.VERSION_CODES.N) {
+            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(vFile));
+            startActivityForResult(intent, TAKE_PICTURE);
+        } else {
+            ContentValues contentValues = new ContentValues(1);
+            contentValues.put(MediaStore.Images.Media.DATA, vFile.getAbsolutePath());
+            Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
+            intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
+            startActivityForResult(intent, TAKE_PICTURE);
+        }
+    }
+
+    @Override
+    protected void onDestroy() {
+        if (mLocationUtils != null) {
+            mLocationUtils.stopLocationClient();
+        }
+        super.onDestroy();
+    }
+}

+ 185 - 0
app/src/main/java/com/zhilin/patrol/ui/activity/QuestionTypeActivity.java

xqd
@@ -0,0 +1,185 @@
+package com.zhilin.patrol.ui.activity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration;
+import com.zhilin.patrol.R;
+import com.zhilin.patrol.bean.QuestionKindEntity;
+import com.zhilin.patrol.tool.DensityUtil;
+import com.zhy.adapter.recyclerview.CommonAdapter;
+import com.zhy.adapter.recyclerview.base.ViewHolder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import me.drakeet.multitype.ItemViewProvider;
+import me.drakeet.multitype.MultiTypeAdapter;
+
+/**
+ * 问题类型
+ */
+public class QuestionTypeActivity extends BaseActivity {
+
+    @BindView(R.id.recycler)
+    RecyclerView mRecyclerView;
+    private MultiTypeAdapter mAdapter;
+    /** 点击位置 */
+    private int mPos = -1;
+
+    private ArrayList mQuestionInfoList;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_question_type);
+        ButterKnife.bind(this);
+        mQuestionInfoList = (ArrayList) getIntent().getSerializableExtra("QuestionInfoList");
+        setTitle("问题类型");
+//        setRightTv("确定");
+//        setRightClick(new View.OnClickListener() {
+//            @Override
+//            public void onClick(View v) {
+//                Intent intent = new Intent();
+//                intent.putExtra("QuestionInfoList", mQuestionInfoList);
+//                setResult(1, intent);
+//                finish();
+//            }
+//        });
+        if (mQuestionInfoList == null) return;
+        init();
+
+    }
+
+    @Override
+    public void finish() {
+        Intent intent = new Intent();
+        intent.putExtra("QuestionInfoList", mQuestionInfoList);
+        setResult(1, intent);
+        super.finish();
+    }
+
+    private void init() {
+        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
+        mRecyclerView.setHasFixedSize(true);
+        mRecyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(this)
+                .color(getResources().getColor(R.color.line_gray))
+                .size(DensityUtil.dip2px(this, 1))
+                .build());
+
+        mAdapter = new MultiTypeAdapter(mQuestionInfoList);
+        mAdapter.applyGlobalMultiTypePool();
+        mAdapter.register(QuestionKindEntity.InfoListBean.class, new ItemTitle());
+        mAdapter.register(QuestionKindEntity.ListBean.class, new ItemContent());
+        mRecyclerView.setAdapter(mAdapter);
+    }
+
+    /** 标题布局 */
+    class ItemTitle extends ItemViewProvider<QuestionKindEntity.InfoListBean, ItemTitle.ViewHolder> {
+
+        @NonNull
+        @Override
+        protected ViewHolder onCreateViewHolder(@NonNull LayoutInflater inflater, @NonNull ViewGroup parent) {
+            View itemView = inflater.inflate(R.layout.item_question_type_title, parent, false);
+            return new ViewHolder(itemView);
+        }
+
+        @Override
+        protected void onBindViewHolder(@NonNull ViewHolder holder, @NonNull QuestionKindEntity.InfoListBean bean) {
+            holder.titleTv.setText(bean.getTitle());
+        }
+
+        public class ViewHolder extends RecyclerView.ViewHolder {
+            TextView titleTv;
+
+            public ViewHolder(View itemView) {
+                super(itemView);
+                titleTv = itemView.findViewById(R.id.tv_question_title);
+            }
+        }
+    }
+
+    /** 内容布局 */
+    class ItemContent extends ItemViewProvider<QuestionKindEntity.ListBean, ItemContent.ViewHolder> {
+
+        @NonNull
+        @Override
+        protected ViewHolder onCreateViewHolder(@NonNull LayoutInflater inflater, @NonNull ViewGroup parent) {
+            View itemView = inflater.inflate(R.layout.item_question_type, parent, false);
+            return new ViewHolder(itemView);
+        }
+
+        @Override
+        protected void onBindViewHolder(@NonNull final ViewHolder holder, @NonNull final QuestionKindEntity.ListBean bean) {
+            holder.questionTv.setText(bean.getTitle());
+            List<QuestionKindEntity.Bean> sonCell = bean.getSonCell();
+            int count = 0;
+            for (QuestionKindEntity.Bean b : sonCell) {
+                if (b.isSelected()) {
+                    count++;
+                }
+            }
+            if (count != 0) {
+                holder.numTv.setVisibility(View.VISIBLE);
+                holder.numTv.setText(count + "");
+            } else {
+                holder.numTv.setVisibility(View.GONE);
+                holder.numTv.setText("");
+            }
+            holder.view.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    mPos = holder.getAdapterPosition();
+                    Intent intent = new Intent(QuestionTypeActivity.this, QuestionTypeSelectActivity.class);
+                    intent.putExtra("ListBean", bean);
+                    startActivityForResult(intent, 1);
+                }
+            });
+        }
+
+        public class ViewHolder extends RecyclerView.ViewHolder {
+            TextView questionTv;
+            TextView numTv;
+            View view;
+
+            public ViewHolder(View itemView) {
+                super(itemView);
+                view = itemView;
+                questionTv = itemView.findViewById(R.id.tv_question);
+                numTv = itemView.findViewById(R.id.tv_num);
+            }
+        }
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (requestCode == 1 && resultCode == 1 && data != null) {
+            if (mPos == -1) return;
+            if (mQuestionInfoList != null) {
+                for (Object o : mQuestionInfoList) {
+                    if (o == null || !(o instanceof QuestionKindEntity.ListBean)) continue;
+                    QuestionKindEntity.ListBean listBean = (QuestionKindEntity.ListBean) o;
+                    if (listBean.getSonCell() == null) continue;
+                    for (QuestionKindEntity.Bean b : listBean.getSonCell()) {
+                        b.setSelected(false);
+                    }
+                }
+            }
+            QuestionKindEntity.ListBean listBean = (QuestionKindEntity.ListBean) data.getSerializableExtra("ListBean");
+            mQuestionInfoList.set(mPos, listBean);
+//            mAdapter.notifyDataSetChanged();
+            finish();
+        }
+    }
+
+}

+ 108 - 0
app/src/main/java/com/zhilin/patrol/ui/activity/QuestionTypeSelectActivity.java

xqd
@@ -0,0 +1,108 @@
+package com.zhilin.patrol.ui.activity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration;
+import com.zhilin.patrol.R;
+import com.zhilin.patrol.bean.LoginEntity;
+import com.zhilin.patrol.bean.QuestionKindEntity;
+import com.zhilin.patrol.http.HttpUrl;
+import com.zhilin.patrol.tool.DensityUtil;
+import com.zhilin.patrol.tool.DialogUtil;
+import com.zhilin.patrol.tool.IpUtils;
+import com.zhilin.patrol.tool.JsonUtils;
+import com.zhy.adapter.recyclerview.CommonAdapter;
+import com.zhy.adapter.recyclerview.base.ViewHolder;
+import com.zhy.http.okhttp.OkHttpUtils;
+import com.zhy.http.okhttp.callback.Callback;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import me.drakeet.multitype.ItemViewProvider;
+import me.drakeet.multitype.MultiTypeAdapter;
+import okhttp3.Call;
+import okhttp3.Response;
+
+/**
+ * 选择问题类型
+ */
+public class QuestionTypeSelectActivity extends BaseActivity {
+
+    @BindView(R.id.recycler)
+    RecyclerView mRecyclerView;
+    private QuestionKindEntity.ListBean mBean;
+    private CommonAdapter mAdapter;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_question_type);
+        ButterKnife.bind(this);
+        mBean = (QuestionKindEntity.ListBean) getIntent().getSerializableExtra("ListBean");
+        setTitle("问题类型");
+//        setRightTv("确定");
+//        setRightClick(new View.OnClickListener() {
+//            @Override
+//            public void onClick(View v) {
+//                Intent intent = new Intent();
+//                intent.putExtra("ListBean",mBean);
+//                setResult(1,intent);
+//                finish();
+//            }
+//        });
+        init();
+    }
+
+    private void init() {
+        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
+        mRecyclerView.setHasFixedSize(true);
+        mRecyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(this)
+                .color(getResources().getColor(R.color.line_gray))
+                .size(DensityUtil.dip2px(this, 1))
+                .build());
+        final List<QuestionKindEntity.Bean> sonCell = mBean.getSonCell();
+        mAdapter = new CommonAdapter<QuestionKindEntity.Bean>(this, R.layout.item_question_type_select, sonCell) {
+            @Override
+            protected void convert(ViewHolder holder, final QuestionKindEntity.Bean bean, int position) {
+                holder.setText(R.id.tv_question, bean.getqName());
+                holder.setVisible(R.id.iv_select, bean.isSelected());
+                if (bean.isSelected()) {
+                    holder.setTextColorRes(R.id.tv_question, R.color.text_orange);
+                } else {
+                    holder.setTextColorRes(R.id.tv_question, R.color.text_black);
+                }
+                holder.itemView.setOnClickListener(new View.OnClickListener() {
+                    @Override
+                    public void onClick(View v) {
+                        for (QuestionKindEntity.Bean b : sonCell) {
+                            b.setSelected(false);
+                        }
+                        bean.setSelected(true);
+//                        mAdapter.notifyDataSetChanged();
+                        finish();
+                    }
+                });
+            }
+        };
+        mRecyclerView.setAdapter(mAdapter);
+    }
+
+    @Override
+    public void finish() {
+        Intent intent = new Intent();
+        intent.putExtra("ListBean",mBean);
+        setResult(1,intent);
+        super.finish();
+    }
+}

+ 732 - 0
app/src/main/java/com/zhilin/patrol/ui/activity/RecifyUploadActivity.java

xqd
@@ -0,0 +1,732 @@
+package com.zhilin.patrol.ui.activity;
+
+import android.Manifest;
+import android.annotation.TargetApi;
+import android.content.ContentValues;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Environment;
+import android.provider.MediaStore;
+import android.support.v7.widget.GridLayoutManager;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.helper.ItemTouchHelper;
+import android.text.Editable;
+import android.text.Html;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.util.Log;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.RadioGroup;
+import android.widget.TextView;
+
+import com.google.gson.Gson;
+import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration;
+import com.zhilin.patrol.R;
+import com.zhilin.patrol.adapter.QuestionImgAdapter;
+import com.zhilin.patrol.adapter.UpImageAdapter;
+import com.zhilin.patrol.adapter.UpImageAdapterRectify;
+import com.zhilin.patrol.adapter.helper.GridItemDecoration;
+import com.zhilin.patrol.adapter.helper.MyItemTouchCallback;
+import com.zhilin.patrol.adapter.helper.OnRecyclerItemClickListener;
+import com.zhilin.patrol.bean.AddressAreaEntity;
+import com.zhilin.patrol.bean.LoginEntity;
+import com.zhilin.patrol.bean.MapLocationInfo;
+import com.zhilin.patrol.bean.PatrolFormEntity;
+import com.zhilin.patrol.bean.QuestionKindEntity;
+import com.zhilin.patrol.bean.RectifyFormEntity;
+import com.zhilin.patrol.bean.RectifyUploadEntity;
+import com.zhilin.patrol.http.HttpUrl;
+import com.zhilin.patrol.tool.CheckPermissionUtils;
+import com.zhilin.patrol.tool.Compresser;
+import com.zhilin.patrol.tool.DensityUtil;
+import com.zhilin.patrol.tool.DialogUtil;
+import com.zhilin.patrol.tool.IpUtils;
+import com.zhilin.patrol.tool.JsonUtils;
+import com.zhilin.patrol.tool.LocationUtils;
+import com.zhilin.patrol.tool.SPUtil;
+import com.zhilin.patrol.tool.Utils;
+import com.zhilin.patrol.views.AlertDialog;
+import com.zhilin.patrol.views.CustomProgressDialog;
+import com.zhy.adapter.recyclerview.CommonAdapter;
+import com.zhy.adapter.recyclerview.base.ViewHolder;
+import com.zhy.http.okhttp.OkHttpUtils;
+import com.zhy.http.okhttp.callback.Callback;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+import okhttp3.Call;
+import okhttp3.Response;
+
+public class RecifyUploadActivity extends BaseActivity implements View.OnClickListener {
+
+    @BindView(R.id.img_recycler)
+    RecyclerView mRecyclerView;
+    @BindView(R.id.img_question)
+    RecyclerView mQuesImgView;
+    @BindView(R.id.et_content)
+    EditText mRemarkEt;//反馈
+    @BindView(R.id.tv_questionStr)
+    TextView mQuestionTv;
+    @BindView(R.id.tv_content_num)
+    TextView mContentNumTv;//备注长度
+    @BindView(R.id.tv_img_num)
+    TextView mImgNumTv;//图片数量
+    @BindView(R.id.tv_location)
+    TextView mLocationTv;
+
+    private String TAG="PatrolUploadActivity";//打印日志
+
+    //用户信息
+    private LoginEntity.InfoListBean.UserInfoBean mUserInfo;
+    private RectifyFormEntity.InfoListBean ryInfo;
+    //选择图片适配器
+    private UpImageAdapterRectify mAdapter;
+
+    private QuestionImgAdapter mqAdapter;
+
+    //上传图片
+    public ArrayList<String> mDataList = new ArrayList<>();
+
+    public ArrayList<String> imgList = new ArrayList<>();
+
+    private ItemTouchHelper mItemTouchHelper;
+
+    private CustomProgressDialog mProgressDialog;
+
+    /** 客户文件目录 */
+    private String mImageDir = Environment.getExternalStorageDirectory() + "/patrol/";
+
+    String[] mPermissions = {
+            Manifest.permission.ACCESS_COARSE_LOCATION,
+            Manifest.permission.ACCESS_FINE_LOCATION,
+            Manifest.permission.WRITE_EXTERNAL_STORAGE,
+            Manifest.permission.READ_EXTERNAL_STORAGE,
+            Manifest.permission.CAMERA,
+            Manifest.permission.READ_PHONE_STATE};
+    /** 表单返回码 */
+    private String mTkCode="1";
+    private List imageList=new ArrayList();
+    private String pbCode;
+    private String maddress;
+    private String mquestion;
+    private int mType;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_recify_upload);
+        ButterKnife.bind(this);
+        mUserInfo = (LoginEntity.InfoListBean.UserInfoBean) getIntent().getSerializableExtra("userInfo");
+        mType=getIntent().getIntExtra("mType",1);
+        pbCode=getIntent().getStringExtra("pCode");
+        maddress=getIntent().getStringExtra("address");
+        mquestion=getIntent().getStringExtra("text");
+        imgList=getIntent().getStringArrayListExtra("imgList");
+        mProgressDialog = new CustomProgressDialog(this);
+        if(mType==1){
+            setTitle("整改反馈");
+        }else {
+            setTitle("复议申请");
+        }
+
+        setRightTv("提交");
+        setRightClick(this);
+
+        Log.i("question==",mquestion);
+        mQuestionTv.setText(mquestion);
+
+        mLocationTv.setText(maddress);
+        mRemarkEt.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
+            }
+            @Override
+            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
+            }
+            @Override
+            public void afterTextChanged(Editable editable) {
+                mContentNumTv.setText(mRemarkEt.getText().length() + "/200");
+            }
+        });
+        setRecycler();
+        setImageNum();
+        checkPermissions();
+
+
+    }
+
+
+    @TargetApi(Build.VERSION_CODES.M)
+    private void checkPermissions() {
+        mPermissions = CheckPermissionUtils.getNeededPermission(this, mPermissions);
+        if (mPermissions.length > 0) {
+            requestPermissions(mPermissions, 999);
+        }
+        if (mPermissions.length == 0) {
+            //申请过一次这里的permissions.length就为0 了
+            //申请权限后创建图片文件夹
+            Utils.createDir(mImageDir);
+        }
+    }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
+        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+        for (int i = 0; i < grantResults.length; i++) {
+            if (PackageManager.PERMISSION_GRANTED != grantResults[i]) {
+                new AlertDialog(RecifyUploadActivity.this).builder()
+                        .setTitle(RecifyUploadActivity.this.getString(R.string.tv_tishi))
+                        .setMsg("获取权限失败,是否重新尝试?")
+                        .setPositiveButton("重试", new View.OnClickListener() {
+                            @Override
+                            public void onClick(View view) {
+                                checkPermissions();
+                            }
+                        })
+                        .setNegativeButton("取消", new View.OnClickListener() {
+                            @Override
+                            public void onClick(View v) {
+
+                            }
+                        }).show();
+                return;
+            }
+        }
+        //申请权限后创建图片文件夹
+        Utils.createDir(mImageDir);
+    }
+
+
+    /**
+     * 设置图片数量
+     */
+    public void setImageNum() {
+        mImgNumTv.setText(Html.fromHtml("上传图片 <Small>" + mDataList.size() + "/9</Small>"));
+    }
+
+//    @OnClick({R.id.ll_location})//R.id.tv_last_location_use
+    public void onClick(View view) {
+        switch (view.getId()) {
+//            case R.id.tv_last_location_use://使用上次定位
+//                if (mLastHasProblem != -1) {
+//                    mHasProblem = mLastHasProblem;
+//                    isQuestionJump = false;
+//                    if (mHasProblem == 1) {//有问题
+//                        mQuestionRg.check(R.id.rb_question_yes);
+//                    } else {//没问题
+//                        mQuestionRg.check(R.id.rb_question_no);
+//                    }
+//                }
+//                mSelectBean = mLastSelectBean;
+//                mMapLocationInfo = mLastMapLocationInfo;
+//                mListBean = mLastListBean;
+////                mLocationTv.setText(mMapLocationInfo.getAddress());
+//                if (mSelectBean != null) {
+//                    mQuestionTypeTv.setText(mSelectBean.getqName());
+//                }
+//                mLocationTv.setText(mLastListBean != null ? mLastListBean.getAddress() : mLastMapLocationInfo.getAddress());
+//                break;
+//            case R.id.tv_question://问题分类
+//                toQuestionType();
+//                break;
+//            case R.id.ll_location://定位
+//                if (mMapLocationInfo == null) {
+//                    locationAddress();
+//                } else {//选择小区
+//                    toAddressSelect();
+//                }
+//                break;
+            case R.id.tv_right://提交
+                if (mDataList.size() < 1&&mType==1) {
+                    Utils.showToast(this, "请拍摄图片");
+                    return;
+                }
+                String remark = mRemarkEt.getText().toString().trim();
+                if (TextUtils.isEmpty(remark)) {
+                        Utils.showToast(this, "请输入说明信息");
+                        return;
+                }
+                if (!TextUtils.isEmpty(mTkCode)) {
+                    mProgressDialog.showDialog("正在提交...");
+                    postPatrolImage();
+                    return;
+                }
+
+//                String questionKind = "";
+//                if (mHasProblem == 1) {
+////                    StringBuilder sb = new StringBuilder();
+////                    for (QuestionKindEntity.Bean bean : mSelectList) {
+////                        sb.append(bean.getqCode()).append(",");
+////                    }
+////                    questionKind = sb.substring(0, sb.length() - 1);
+//                    questionKind = mSelectBean.getqCode();
+//                }
+
+                break;
+            default:
+                break;
+        }
+    }
+
+
+    /**
+     * 提交巡查信息
+     *
+     * @param remark
+     */
+    private void postPatrol(String remark,List list){
+        Log.i("imglist==", String.valueOf(list));
+        Gson gson=new Gson();
+        String jsonList=gson.toJson(list);
+        Log.i("jsonlist=",jsonList);
+        Log.i("content=",remark+"");
+        Log.i("pbCode=",pbCode);
+//        Response response=OkHttpUtils.post()
+        if(mType==1){
+            Log.i("fuyi","整改反馈上传");
+            OkHttpUtils.post()
+                    .url(HttpUrl.RECTIFY_POST)
+                    .addParams("urls", jsonList)
+                    .addParams("content", remark+"")
+                    .addParams("pbCode",pbCode)
+//                .build().execute();
+                    .build().execute(new Callback<RectifyUploadEntity>() {
+                @Override
+                public RectifyUploadEntity parseNetworkResponse(Response response, int id) throws Exception {
+                    String jsonStr = response.body().string();
+                    Log.i("jsonStr=",jsonStr);
+                    return (RectifyUploadEntity) JsonUtils.parseJson2Obj(jsonStr, RectifyUploadEntity.class);
+                }
+                @Override
+                public void onError(Call call, Exception e, int id) {
+                    mProgressDialog.dismiss();
+                    DialogUtil.showNetFailDialog(RecifyUploadActivity.this);
+                }
+                @Override
+                public void onResponse(RectifyUploadEntity entity, int id) {
+                    if (entity == null) {
+                        DialogUtil.showErrDialog(RecifyUploadActivity.this, "返回信息为空");
+                        return;
+                    }
+                    if (!"1000".endsWith(entity.getReturnCode())) {
+                        DialogUtil.showErrDialog(RecifyUploadActivity.this, entity.getReturnMsg());
+                        return;
+                    }
+                    Utils.showToast(RecifyUploadActivity.this, "提交成功,请等待审核");
+                    finish();
+                }
+            });
+        }else {
+            Log.i("fuyi","复议申请上传");
+            OkHttpUtils.post()
+                    .url(HttpUrl.RECHECK_POST)
+                    .addParams("urls", jsonList)
+                    .addParams("content", remark+"")
+                    .addParams("pbCode",pbCode)
+//                .build().execute();
+                    .build().execute(new Callback<RectifyUploadEntity>() {
+                @Override
+                public RectifyUploadEntity parseNetworkResponse(Response response, int id) throws Exception {
+                    String jsonStr = response.body().string();
+                    Log.i("jsonStr=",jsonStr);
+                    return (RectifyUploadEntity) JsonUtils.parseJson2Obj(jsonStr, RectifyUploadEntity.class);
+                }
+                @Override
+                public void onError(Call call, Exception e, int id) {
+                    mProgressDialog.dismiss();
+                    DialogUtil.showNetFailDialog(RecifyUploadActivity.this);
+                }
+                @Override
+                public void onResponse(RectifyUploadEntity entity, int id) {
+                    if (entity == null) {
+                        DialogUtil.showErrDialog(RecifyUploadActivity.this, "返回信息为空");
+                        return;
+                    }
+                    if (!"1000".endsWith(entity.getReturnCode())) {
+                        DialogUtil.showErrDialog(RecifyUploadActivity.this, entity.getReturnMsg());
+                        return;
+                    }
+                    Utils.showToast(RecifyUploadActivity.this, "提交成功,请等待审核");
+                    finish();
+                }
+            });
+        }
+
+//        if(response.isSuccessful()) {
+//            String jsonStr = response.body().string();
+//            Log.i(TAG,jsonStr+"=jsonStr");
+//            RectifyUploadEntity entity = (RectifyUploadEntity) JsonUtils.parseJson2Obj(jsonStr, RectifyUploadEntity.class);
+//            if (entity == null) {
+//                Log.i(TAG,"entity=null");
+//                DialogUtil.showErrDialog(RecifyUploadActivity.this, "返回信息为空");
+//                return;
+//            }
+//            if (!"1000".endsWith(entity.getReturnCode())) {
+//                DialogUtil.showErrDialog(RecifyUploadActivity.this, entity.getReturnMsg());
+//                throw new IOException(entity.getReturnMsg());
+//            }
+//            finish();
+//        }
+    }
+
+    /**
+     * 上传图片
+     */
+    private void postPatrolImage() {
+        new Thread() {
+            @Override
+            public void run() {
+                ArrayList<String> list = new ArrayList(mDataList);
+                for (String imgPath : list) {
+                    try {
+                        postPatrolImageSync(imgPath);
+                    } catch (IOException e) {
+                        Log.e("post_image", "图片上传失败");
+                    }
+                }
+                list.clear();
+                list = null;
+                runOnUiThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        mProgressDialog.dismiss();
+                        if (mDataList.size() == 0) {
+//                            Utils.showToast(RecifyUploadActivity.this, "提交成功,请等待审核");
+                            String remark = mRemarkEt.getText().toString().trim();
+                            postPatrol(remark,imageList);
+//                            Utils.showToast(RecifyUploadActivity.this, "提交成功,请等待审核");
+//                            finish();
+                        } else {
+                            Utils.showToast(RecifyUploadActivity.this, "图片上传失败,请点击提交重新上传");
+                        }
+                    }
+                });
+            }
+        }.start();
+    }
+
+    /**
+     * 提交图片
+     */
+    private void postPatrolImageSync(final String imagePath) throws IOException {
+        Log.i(TAG,"提交巡查图片");
+        File file = new File(imagePath);
+        String fileName = file.getName();
+        Response response = OkHttpUtils.post()
+                .url(HttpUrl.RECTIFYIMG_POST)
+                .addFile("imgFile", fileName, file)
+                .build().execute();
+        if (response.isSuccessful()) {
+            String jsonStr = response.body().string();
+            Log.i(TAG,jsonStr+"=jsonStr");
+            RectifyFormEntity entity = (RectifyFormEntity) JsonUtils.parseJson2Obj(jsonStr, RectifyFormEntity.class);
+            List<RectifyFormEntity.InfoListBean> list = entity.getInfoList();
+            ryInfo=list.get(0);
+            imageList.add(ryInfo.getUrl());
+            if (!"1000".endsWith(entity.getReturnCode())) {
+                DialogUtil.showErrDialog(RecifyUploadActivity.this, entity.getReturnMsg());
+                throw new IOException(entity.getReturnMsg());
+            } else {
+                runOnUiThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        mDataList.remove(imagePath);
+                        Utils.delSingleFile(imagePath);
+                        mAdapter.notifyDataSetChanged();
+
+                    }
+                });
+            }
+        } else {
+            throw new IOException(response.message());
+        }
+    }
+
+    private void setRecycler() {
+        GridLayoutManager layoutManager = new GridLayoutManager(this, 4, GridLayoutManager.VERTICAL, false);
+        Log.i("mdataList", String.valueOf(mDataList));
+        mAdapter = new UpImageAdapterRectify(this, mDataList, layoutManager.getSpanCount());
+
+        mRecyclerView.setHasFixedSize(true);
+        mRecyclerView.setLayoutManager(layoutManager);
+        mRecyclerView.setAdapter(mAdapter);
+        mRecyclerView.addItemDecoration(new GridItemDecoration(DensityUtil.dip2px(this, 8)));
+
+        GridLayoutManager layoutManager2 = new GridLayoutManager(this, 4, GridLayoutManager.VERTICAL, false);
+        mqAdapter = new QuestionImgAdapter(this, imgList, layoutManager2.getSpanCount());
+        mQuesImgView.setHasFixedSize(true);
+        mQuesImgView.setLayoutManager(layoutManager2);
+        mQuesImgView.setAdapter(mqAdapter);
+        mQuesImgView.addItemDecoration(new GridItemDecoration(DensityUtil.dip2px(this, 8)));
+
+
+
+        MyItemTouchCallback callback = new MyItemTouchCallback(mAdapter);
+        mItemTouchHelper = new ItemTouchHelper(callback);
+        mItemTouchHelper.attachToRecyclerView(mRecyclerView);
+        mRecyclerView.addOnItemTouchListener(new OnRecyclerItemClickListener(mRecyclerView) {
+            @Override
+            public void onLongClick(RecyclerView.ViewHolder vh) {
+                if (vh.getLayoutPosition() != mDataList.size()) {
+                    mItemTouchHelper.startDrag(vh);
+                }
+            }
+        });
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (requestCode == TAKE_PICTURE) {
+            //返回拍照的图片
+            Log.i("path camera=",path);
+            if (resultCode == -1 && !TextUtils.isEmpty(path) && Utils.fileIsExists(path)) {
+                //压缩图片
+                mProgressDialog.showDialog("正在压缩图片");
+                new Thread() {
+                    @Override
+                    public void run() {
+                        try {
+                            File compressFile = Compresser.getInstance()
+                                    .compressImage(Compresser.THIRD_GEAR, new File(path),
+                                            mImageDir);
+                            if (compressFile != null && compressFile.exists()) {
+                                mDataList.add(compressFile.getAbsolutePath());
+                                runOnUiThread(new Runnable() {
+                                    @Override
+                                    public void run() {
+                                        mProgressDialog.dismiss();
+                                        mAdapter.notifyDataSetChanged();
+                                        setImageNum();
+                                    }
+                                });
+                            }
+                        } catch (IOException e) {
+                            e.printStackTrace();
+                        }
+                    }
+                }.start();
+            }
+
+        }else if(requestCode==LOCAL_CROP) {
+            Uri uri = data.getData();
+
+            Log.i("uri zhaopian=", String.valueOf(uri));
+            assert uri != null;
+            path=uri.getPath();
+            String[] data1=path.split("raw/");
+            if(data1[0].equals("/")){
+                Log.i("data[1]",data1[1]);
+                path=data1[1];
+            }
+
+            Log.i("path zhaopian=",path);
+            if (resultCode == -1 && !TextUtils.isEmpty(path) && Utils.fileIsExists(path)) {
+                //压缩图片
+                mProgressDialog.showDialog("正在压缩图片");
+                new Thread() {
+                    @Override
+                    public void run() {
+                        try {
+
+                            File compressFile = Compresser.getInstance()
+                                    .compressImage(Compresser.THIRD_GEAR, new File(path),
+                                            mImageDir);
+                            if (compressFile != null && compressFile.exists()) {
+                                mDataList.add(compressFile.getAbsolutePath());
+                                runOnUiThread(new Runnable() {
+                                    @Override
+                                    public void run() {
+                                        mProgressDialog.dismiss();
+                                        mAdapter.notifyDataSetChanged();
+                                        setImageNum();
+                                    }
+                                });
+                            }
+                        } catch (IOException e) {
+                            e.printStackTrace();
+                        }
+                    }
+                }.start();
+            }
+        }
+
+    }
+
+    /** 拍照的文件地址 */
+    private String path = "";
+    /** 拍照请求码 */
+    private static final int TAKE_PICTURE = 0x000003;
+    private static final int  LOCAL_CROP= 0x000004;
+
+    /**
+     * 拍照
+     */
+    public void toCamera() {
+        if (UpImageAdapter.MAX_IMAGE_SIZE <= 0) {
+            Utils.showToast(this, "已达到上传图片上限!");
+            return;
+        }
+        File vFile = new File(Environment.getExternalStorageDirectory()
+                + "/myimage/", new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())
+                + ".jpg");
+
+        if (!vFile.exists()) {
+            File vDirPath = vFile.getParentFile();
+            vDirPath.mkdirs();
+        } else {
+            if (vFile.exists()) {
+                vFile.delete();
+            }
+        }
+        path = vFile.getPath();
+        /*获取当前系统的android版本号*/
+        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
+        int currentapiVersion = android.os.Build.VERSION.SDK_INT;
+        if (currentapiVersion < Build.VERSION_CODES.N) {
+            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(vFile));
+            startActivityForResult(intent, TAKE_PICTURE);
+        } else {
+            ContentValues contentValues = new ContentValues(1);
+            contentValues.put(MediaStore.Images.Media.DATA, vFile.getAbsolutePath());
+            Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
+            intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
+            startActivityForResult(intent, TAKE_PICTURE);
+        }
+    }
+    public void toPhoto(){
+        if (UpImageAdapter.MAX_IMAGE_SIZE <= 0) {
+            Utils.showToast(this, "已达到上传图片上限!");
+            return;
+        }
+//        File vFile = new File(Environment.getExternalStorageDirectory()
+//                + "/myimage/", new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())
+//                + ".jpg");
+//        if (!vFile.exists()) {
+//            File vDirPath = vFile.getParentFile();
+//            vDirPath.mkdirs();
+//        } else {
+//            if (vFile.exists()) {
+//                vFile.delete();
+//            }
+//        }
+//        File vFile = new File(Environment.getExternalStorageDirectory(), "outputTest.jpg");
+//        try {
+//            if (vFile.exists()) {
+//                vFile.delete();
+//            }
+//            vFile.createNewFile();
+//        } catch (IOException e) {
+//            e.printStackTrace();
+//        }
+//
+//        path = vFile.getPath();
+            // 创建Intent,用于打开手机本地图库选择图片
+//            Intent intent1 = new Intent(Intent.ACTION_PICK);
+//            intent1.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(vFile));
+//                    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
+            // 启动intent打开本地图库
+//            startActivityForResult(intent1,LOCAL_CROP);
+//        int currentapiVersion = android.os.Build.VERSION.SDK_INT;
+//        if (currentapiVersion < Build.VERSION_CODES.N) {
+//            intent1.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(vFile));
+//            startActivityForResult(intent1, LOCAL_CROP);
+//        } else {
+//            ContentValues contentValues = new ContentValues(1);
+//            contentValues.put(MediaStore.Images.Media.DATA, vFile.getAbsolutePath());
+//            Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
+//            intent1.putExtra(MediaStore.EXTRA_OUTPUT, uri);
+//            startActivityForResult(intent1, LOCAL_CROP);
+//        }
+//        Intent intent = new Intent("android.intent.action.GET_CONTENT");
+//        intent.setType("image/*");
+//        //允许裁剪
+//        intent.putExtra("crop", true);
+//        //允许缩放
+//        intent.putExtra("scale", true);
+//        图片的输出位置
+        Intent intent1 = new Intent(Intent.ACTION_PICK,
+                android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
+//        intent.putExtra(MediaStore.EXTRA_OUTPUT, path);
+        startActivityForResult(intent1,LOCAL_CROP);
+
+    }
+    public void takePhotoOrSelectPicture() {
+        CharSequence[] items = {"拍照","图库"};// 裁剪items选项
+        // 弹出对话框提示用户拍照或者是通过本地图库选择图片
+        android.app.AlertDialog.Builder builder=new android.app.AlertDialog.Builder(RecifyUploadActivity.this);
+//        new AlertDialog.Builder(RecifyUploadActivity.this)
+        builder.setTitle("请选择");
+        builder.setItems(items, new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+
+                        switch (which){
+                            // 选择了拍照
+                            case 0:
+                                toCamera();
+                                break;
+                            // 调用系统图库
+                            case 1:
+
+                                toPhoto();
+                                break;
+
+                        }
+
+                    }
+                });
+        builder.create().show();
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+    }
+
+    //加载图片
+    public Bitmap getURLimage(String url) {
+        Bitmap bmp = null;
+        try {
+            URL myurl = new URL(url);
+            // 获得连接
+            HttpURLConnection conn = (HttpURLConnection) myurl.openConnection();
+            conn.setConnectTimeout(6000);//设置超时
+            conn.setDoInput(true);
+            conn.setUseCaches(false);//不缓存
+            conn.connect();
+            InputStream is = conn.getInputStream();//获得图片的数据流
+            bmp = BitmapFactory.decodeStream(is);//读取图像数据
+            //读取文本数据
+            //byte[] buffer = new byte[100];
+            //inputStream.read(buffer);
+            //text = new String(buffer);
+            is.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return bmp;
+    }
+}

+ 201 - 0
app/src/main/java/com/zhilin/patrol/ui/activity/ReconsiderActivity.java

xqd
@@ -0,0 +1,201 @@
+package com.zhilin.patrol.ui.activity;
+
+import android.os.Bundle;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+import android.view.View;
+
+import com.cjj.MaterialRefreshLayout;
+import com.cjj.MaterialRefreshListener;
+import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration;
+import com.zhilin.patrol.R;
+import com.zhilin.patrol.bean.LoginEntity;
+import com.zhilin.patrol.bean.ReconsiderActivityEntity;
+import com.zhilin.patrol.bean.RectifyTaskEntity;
+import com.zhilin.patrol.http.HttpUrl;
+import com.zhilin.patrol.tool.DensityUtil;
+import com.zhilin.patrol.tool.DialogUtil;
+import com.zhilin.patrol.tool.JsonUtils;
+import com.zhy.adapter.recyclerview.CommonAdapter;
+import com.zhy.adapter.recyclerview.base.ViewHolder;
+import com.zhy.http.okhttp.OkHttpUtils;
+import com.zhy.http.okhttp.callback.Callback;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import okhttp3.Call;
+import okhttp3.Response;
+
+public class ReconsiderActivity extends BaseActivity {
+
+    @BindView(R.id.recycler)
+    RecyclerView mRecyclerView;
+    @BindView(R.id.swipe_refresh_layout)
+    MaterialRefreshLayout mRefreshLayout;
+    private boolean mIsFirst;
+
+    private LoginEntity.InfoListBean.UserInfoBean mUserInfo;
+    private List<ReconsiderActivityEntity.InfoListBean> mList;
+    private CommonAdapter<ReconsiderActivityEntity.InfoListBean> mAdapter;
+    private int statusInt=1;
+    private int mPage = 1;
+    private int mType = 1;
+
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_my_task);
+        ButterKnife.bind(this);
+        mUserInfo = (LoginEntity.InfoListBean.UserInfoBean) getIntent().getSerializableExtra("userInfo");
+        mType=getIntent().getIntExtra("mType",1);
+        if(mType==1){
+            setTitle("整改任务");
+        }else if(mType==3){
+            setTitle("整改不通过");
+        }else if(mType==2){
+            setTitle("复议被驳回");
+        }
+
+        init();
+        showLoadingView();
+        mIsFirst = true;
+        request();
+    }
+
+    @Override
+    public void request() {
+        Log.i("code==",mUserInfo.getUserCode());
+        Log.i("mType",mType+"");
+        if(mType==2){
+            OkHttpUtils.post()
+                    .url(HttpUrl.RECHECK_TASK)
+//                .url(HttpUrl.CHECK_TASK)
+                    .addParams("uCode",mUserInfo.getUserCode())
+                    .addParams("status",4+"")
+                    .build().execute(new Callback<ReconsiderActivityEntity>() {
+                @Override
+                public ReconsiderActivityEntity parseNetworkResponse(Response response, int id) throws Exception {
+                    String jsonStr = response.body().string();
+                    return (ReconsiderActivityEntity) JsonUtils.parseJson2Obj(jsonStr, ReconsiderActivityEntity.class);
+                }
+
+                @Override
+                public void onError(Call call, Exception e, int id) {
+                    if (mIsFirst) {
+                        showFailView();
+                    } else {
+                        mRefreshLayout.finishRefresh();
+                        mRefreshLayout.finishRefreshLoadMore();
+                    }
+                    DialogUtil.showNetFailDialog(ReconsiderActivity.this);
+                }
+
+                @Override
+                public void onResponse(ReconsiderActivityEntity entity, int id) {
+
+                    if (mIsFirst) {
+                        showContentView();
+                    } else {
+                        mRefreshLayout.finishRefresh();
+                        mRefreshLayout.finishRefreshLoadMore();
+                    }
+                    mIsFirst = false;
+                    if (entity == null) {
+                        DialogUtil.showErrDialog(ReconsiderActivity.this, "没有任务");
+                        return;
+                    }
+                    List<ReconsiderActivityEntity.InfoListBean> list = entity.getInfoList();
+
+                    if (!"1000".endsWith(entity.getReturnCode())) {
+                        DialogUtil.showErrDialog(ReconsiderActivity.this, entity.getReturnMsg());
+                        return;
+                    }
+                    if (list == null) {
+                        mRefreshLayout.setLoadMore(false);
+                        return;
+                    }
+                    if (list.size() < 10) {
+                        mRefreshLayout.setLoadMore(false);
+                    }
+                    if (mPage == 1) {
+                        mList.clear();
+                    }
+                    mPage++;
+                    mList.addAll(list);
+                    mAdapter.notifyDataSetChanged();
+                    if (mList.isEmpty()) {
+                        showEmptyView();
+                    }
+                }
+            });
+        }
+
+    }
+
+    private void init() {
+        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
+        mRecyclerView.setHasFixedSize(true);
+        mList = new ArrayList<>();
+        mRecyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(this)
+                .color(getResources().getColor(R.color.line_gray))
+                .size(DensityUtil.dip2px(this, 1))
+                .build());
+        mAdapter = new CommonAdapter<ReconsiderActivityEntity.InfoListBean>(this, R.layout.item_rectify_task, mList) {//item_rectify_task   item_type_task
+            @Override
+            protected void convert(ViewHolder holder, final ReconsiderActivityEntity.InfoListBean bean, int position) {
+                holder.setText(R.id.tv_add, bean.getCName());
+                Log.i("address==",bean.getCName());
+                Log.i("status==",bean.getStatus());
+                String StatesStr="";
+                StatesStr="复议已驳回";
+                // status=0 待审核 = 1已驳回 = 2已通过 null未提交
+                holder.setVisible(R.id.btn_to_rl_upload2, false);
+                holder.setVisible(R.id.btn_to_rl_upload, false);
+          /*     if(bean.getStatus().equals("1")){
+                    StatesStr="复议已驳回";
+                    holder.setVisible(R.id.btn_to_rl_upload2, false);
+                    holder.setVisible(R.id.btn_to_rl_upload, false);
+                }*/
+                final ArrayList imgList=new ArrayList();
+                holder.setText(R.id.tv_check, StatesStr);
+                holder.setText(R.id.tv_question," • "+bean.getQuestion());
+                holder.setOnClickListener(R.id.btn_to_rl_upload, new View.OnClickListener() {
+                    @Override
+                    public void onClick(View view) {
+                        String text = " • "+bean.getQuestion();
+                        toActivityRecify(RecifyUploadActivity.class, mUserInfo,bean.getPbCode(),bean.getCName(),text,2,imgList);
+                    }
+                });
+                holder.setOnClickListener(R.id.btn_to_rl_upload2, new View.OnClickListener() {
+                    @Override
+                    public void onClick(View view) {
+                        String text = " • "+bean.getQuestion();
+                        toActivityRecify(RecifyUploadActivity.class, mUserInfo,bean.getPbCode(),bean.getCName(),text,1,imgList);
+                    }
+                });
+            }
+        };
+        mRecyclerView.setAdapter(mAdapter);
+        mRefreshLayout.setMaterialRefreshListener(new MaterialRefreshListener() {
+            @Override
+            public void onRefresh(final MaterialRefreshLayout materialRefreshLayout) {
+                mPage = 1;
+                mRefreshLayout.setLoadMore(true);
+                request();
+            }
+
+            @Override
+            public void onRefreshLoadMore(MaterialRefreshLayout materialRefreshLayout) {
+                //load more refreshing...
+                request();
+            }
+        });
+    }
+
+
+}

+ 121 - 0
app/src/main/java/com/zhilin/patrol/ui/activity/RectifyMainActivity.java

xqd
@@ -0,0 +1,121 @@
+package com.zhilin.patrol.ui.activity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Environment;
+import android.support.v7.app.AppCompatActivity;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.cjj.MaterialRefreshLayout;
+import com.cjj.MaterialRefreshListener;
+import com.zhilin.patrol.R;
+import com.zhilin.patrol.bean.HomeEntity;
+import com.zhilin.patrol.bean.LoginEntity;
+import com.zhilin.patrol.http.HttpUrl;
+import com.zhilin.patrol.tool.DialogUtil;
+import com.zhilin.patrol.tool.IpUtils;
+import com.zhilin.patrol.tool.JsonUtils;
+import com.zhilin.patrol.tool.SPUtil;
+import com.zhilin.patrol.views.AlertDialog;
+import com.zhy.http.okhttp.OkHttpUtils;
+import com.zhy.http.okhttp.builder.PostFormBuilder;
+import com.zhy.http.okhttp.callback.Callback;
+import com.zhy.http.okhttp.request.RequestCall;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+import okhttp3.Call;
+import okhttp3.Response;
+
+/**
+ * 主页面
+ */
+public class RectifyMainActivity extends AppCompatActivity {
+
+    @BindView(R.id.tv_user)
+    TextView mUserTv;//用户
+    @BindView(R.id.tv_sex)
+    TextView mSexTv;//性别
+    @BindView(R.id.tv_logout)
+    TextView mLogoutTv;//注销
+
+
+
+    /** 用户信息 */
+    LoginEntity.InfoListBean mInfoListBean;
+    private LoginEntity.InfoListBean.UserInfoBean mUserInfo;
+
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_main_rectify);
+        ButterKnife.bind(this);
+        mInfoListBean = (LoginEntity.InfoListBean) getIntent().getSerializableExtra("infoList");
+        mUserInfo = mInfoListBean.getUserInfo();
+        init();
+    }
+
+    private void init() {
+        if (mUserInfo != null) {
+            mUserTv.setText(mUserInfo.getUserName());
+            mSexTv.setText(mUserInfo.getUserSex());
+        }
+
+    }
+
+    @OnClick({ R.id.tv_logout,R.id.rl_rectify_task,R.id.rl_unpass_task,R.id.rl_reject_task})
+    public void onClick(View v) {
+        switch (v.getId()) {
+            case R.id.rl_unpass_task://整改不通过
+                Intent intent = new Intent(RectifyMainActivity.this, RectifyTaskActivity.class);
+                intent.putExtra("userInfo", mUserInfo);
+                intent.putExtra("mType",3);
+                startActivity(intent);
+                break;
+            case R.id.rl_rectify_task://整改任务
+                Intent intent2 = new Intent(RectifyMainActivity.this, RectifyTaskActivity.class);
+                intent2.putExtra("userInfo", mUserInfo);
+                intent2.putExtra("mType",1);
+                startActivity(intent2);
+                break;
+            case R.id.rl_reject_task://复议被驳回
+                Intent intent3 = new Intent(RectifyMainActivity.this, ReconsiderActivity.class);
+                intent3.putExtra("userInfo", mUserInfo);
+                intent3.putExtra("mType",2);
+                startActivity(intent3);
+                break;
+            case R.id.tv_logout://注销
+                new AlertDialog(this).builder()
+                        .setTitle(getString(R.string.tv_tishi))
+                        .setMsg("确定要注销?")
+                        .setPositiveButton("注销", new View.OnClickListener() {
+                            @Override
+                            public void onClick(View v) {
+                                SPUtil.savaToShared(RectifyMainActivity.this, SPUtil.SP_COMMON_CONFIG, "infoList", "");
+                                finish();
+                                Intent intent=new Intent(RectifyMainActivity.this,LoginActivity.class);
+                                startActivity(intent);
+                            }
+                        }).setNegativeButton("取消", new View.OnClickListener() {
+                    @Override
+                    public void onClick(View view) {
+
+                    }
+                }).show();
+                break;
+            default:
+                break;
+        }
+    }
+
+}

+ 319 - 0
app/src/main/java/com/zhilin/patrol/ui/activity/RectifyTaskActivity.java

xqd
@@ -0,0 +1,319 @@
+package com.zhilin.patrol.ui.activity;
+
+import android.os.Bundle;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+import android.view.View;
+
+import com.cjj.MaterialRefreshLayout;
+import com.cjj.MaterialRefreshListener;
+import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration;
+import com.zhilin.patrol.R;
+import com.zhilin.patrol.bean.LoginEntity;
+import com.zhilin.patrol.bean.ReconsiderActivityEntity;
+import com.zhilin.patrol.bean.RectifyTaskEntity;
+import com.zhilin.patrol.http.HttpUrl;
+import com.zhilin.patrol.tool.DensityUtil;
+import com.zhilin.patrol.tool.DialogUtil;
+import com.zhilin.patrol.tool.JsonUtils;
+import com.zhy.adapter.recyclerview.CommonAdapter;
+import com.zhy.adapter.recyclerview.base.ViewHolder;
+import com.zhy.http.okhttp.OkHttpUtils;
+import com.zhy.http.okhttp.callback.Callback;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import okhttp3.Call;
+import okhttp3.Response;
+
+
+public class RectifyTaskActivity extends BaseActivity {
+
+    @BindView(R.id.recycler)
+    RecyclerView mRecyclerView;
+    @BindView(R.id.swipe_refresh_layout)
+    MaterialRefreshLayout mRefreshLayout;
+    private boolean mIsFirst;
+
+    private LoginEntity.InfoListBean.UserInfoBean mUserInfo;
+    private List<RectifyTaskEntity.InfoListBean> mList;
+//    private List<RectifyTaskImgEntity.InfoListBean> mgList;
+    private CommonAdapter<RectifyTaskEntity.InfoListBean> mAdapter;
+//    private CommonAdapter<RectifyTaskImgEntity.InfoListBean> mgAdapter;
+    private int statusInt=1;
+    private int mPage = 1;
+    private int mType = 1;
+
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_my_task);
+        ButterKnife.bind(this);
+        mUserInfo = (LoginEntity.InfoListBean.UserInfoBean) getIntent().getSerializableExtra("userInfo");
+        mType=getIntent().getIntExtra("mType",1);
+        if(mType==1){
+            setTitle("整改任务");
+        }else if(mType==3){
+            setTitle("整改不通过");
+        }else if(mType==2){
+            setTitle("复议被驳回");
+        }
+
+        init();
+        showLoadingView();
+        mIsFirst = true;
+        request();
+    }
+
+    @Override
+    public void request() {
+        Log.i("code==",mUserInfo.getUserCode());
+        Log.i("mType",mType+"");
+        if(mType==1){
+            OkHttpUtils.post()
+                    .url(HttpUrl.RECTIFY_TASK)
+//                .url(HttpUrl.CHECK_TASK)
+                    .addParams("uCode",mUserInfo.getUserCode())
+                    .addParams("status",statusInt+"")
+                    .build().execute(new Callback<RectifyTaskEntity>() {
+                @Override
+                public RectifyTaskEntity parseNetworkResponse(Response response, int id) throws Exception {
+                    String jsonStr = response.body().string();
+                    return (RectifyTaskEntity) JsonUtils.parseJson2Obj(jsonStr, RectifyTaskEntity.class);
+                }
+
+                @Override
+                public void onError(Call call, Exception e, int id) {
+                    if (mIsFirst) {
+                        showFailView();
+                    } else {
+                        mRefreshLayout.finishRefresh();
+                        mRefreshLayout.finishRefreshLoadMore();
+                    }
+                    DialogUtil.showNetFailDialog(RectifyTaskActivity.this);
+                }
+
+                @Override
+                public void onResponse(RectifyTaskEntity entity, int id) {
+
+                    if (mIsFirst) {
+                        showContentView();
+                    } else {
+                        mRefreshLayout.finishRefresh();
+                        mRefreshLayout.finishRefreshLoadMore();
+                    }
+                    mIsFirst = false;
+                    if (entity == null) {
+                        DialogUtil.showErrDialog(RectifyTaskActivity.this, "没有任务");
+                        return;
+                    }
+                    List<RectifyTaskEntity.InfoListBean> list = entity.getInfoList();
+
+                    if (!"1000".endsWith(entity.getReturnCode())) {
+                        DialogUtil.showErrDialog(RectifyTaskActivity.this, entity.getReturnMsg());
+                        return;
+                    }
+                    if (list == null) {
+                        mRefreshLayout.setLoadMore(false);
+                        return;
+                    }
+                    if (list.size() < 10) {
+                        mRefreshLayout.setLoadMore(false);
+                    }
+                    if (mPage == 1) {
+                        mList.clear();
+                    }
+                    mPage++;
+                    mList.addAll(list);
+                    mAdapter.notifyDataSetChanged();
+                    if (mList.isEmpty()) {
+                        showEmptyView();
+                    }
+                }
+            });
+        }
+        else if(mType==3){
+            OkHttpUtils.post()
+                    .url(HttpUrl.RECTIFY_TASK)
+//                    .url(HttpUrl.RECHECK_TASK)
+                    .addParams("uCode", mUserInfo.getUserCode())
+                    .addParams("status", 4 + "")
+                    .build().execute(new Callback<RectifyTaskEntity>() {
+                @Override
+                public RectifyTaskEntity parseNetworkResponse(Response response, int id) throws Exception {
+                    String jsonStr = response.body().string();
+                    return (RectifyTaskEntity) JsonUtils.parseJson2Obj(jsonStr, RectifyTaskEntity.class);
+                }
+
+                @Override
+                public void onError(Call call, Exception e, int id) {
+                    if (mIsFirst) {
+                        showFailView();
+                    } else {
+                        mRefreshLayout.finishRefresh();
+                        mRefreshLayout.finishRefreshLoadMore();
+                    }
+                    DialogUtil.showNetFailDialog(RectifyTaskActivity.this);
+                }
+
+                @Override
+                public void onResponse(RectifyTaskEntity entity, int id) {
+
+                    if (mIsFirst) {
+                        showContentView();
+                    } else {
+                        mRefreshLayout.finishRefresh();
+                        mRefreshLayout.finishRefreshLoadMore();
+                    }
+                    mIsFirst = false;
+                    if (entity == null) {
+                        DialogUtil.showErrDialog(RectifyTaskActivity.this, "没有任务");
+                        return;
+                    }
+                    List<RectifyTaskEntity.InfoListBean> list = entity.getInfoList();
+
+                    if (!"1000".endsWith(entity.getReturnCode())) {
+                        DialogUtil.showErrDialog(RectifyTaskActivity.this, entity.getReturnMsg());
+                        return;
+                    }
+                    if (list == null) {
+                        mRefreshLayout.setLoadMore(false);
+                        return;
+                    }
+                    if (list.size() < 10) {
+                        mRefreshLayout.setLoadMore(false);
+                    }
+                    if (mPage == 1) {
+                        mList.clear();
+                    }
+                    mPage++;
+                    mList.addAll(list);
+                    mAdapter.notifyDataSetChanged();
+                    if (mList.isEmpty()) {
+                        showEmptyView();
+                    }
+                }
+            });
+        }
+    }
+
+    private void init() {
+        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
+        mRecyclerView.setHasFixedSize(true);
+        mList = new ArrayList<>();
+//        mgList=new ArrayList<>();ArrayList
+//        if(mType==1){
+            mRecyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(this)
+                    .color(getResources().getColor(R.color.line_gray))
+                    .size(DensityUtil.dip2px(this, 1))
+                    .build());
+            mAdapter = new CommonAdapter<RectifyTaskEntity.InfoListBean>(this, R.layout.item_rectify_task, mList) {//item_rectify_task   item_type_task
+                @Override
+                protected void convert(ViewHolder holder, final RectifyTaskEntity.InfoListBean bean, int position) {
+                    holder.setText(R.id.tv_add, bean.getCName());
+                    Log.i("address==", bean.getCName());
+                    Log.i("status==", bean.getRectify_status());
+                    String StatesStr = "";
+                    // status=0 待审核 = 1已驳回 = 2已通过 null未提交
+                    if (bean.getRectify_status().equals("-1") && bean.getRecheck_status().equals("-1")) {
+                        StatesStr = "未提交";
+                        holder.setVisible(R.id.btn_to_rl_upload2, true);
+                        holder.setVisible(R.id.btn_to_rl_upload, true);
+                    } else if (bean.getRecheck_status().equals("0")) {
+                        StatesStr = "复议待审核";
+                        holder.setVisible(R.id.btn_to_rl_upload2, false);
+                        holder.setVisible(R.id.btn_to_rl_upload, false);
+                    } else if (bean.getRecheck_status().equals("1") && bean.getRectify_status().equals("-1")) {
+                        StatesStr = "复议已驳回";
+                        holder.setVisible(R.id.btn_to_rl_upload2, true);
+                        holder.setVisible(R.id.btn_to_rl_upload, false);
+                    } else if (bean.getRectify_status().equals("1") && bean.getRecheck_status().equals("-1")) {
+                        StatesStr = "不通过";
+                        holder.setVisible(R.id.btn_to_rl_upload2, false);
+                        holder.setVisible(R.id.btn_to_rl_upload, false);
+                    } else if (bean.getRectify_status().equals("1") && bean.getRecheck_status().equals("1")) {
+                        StatesStr = "不通过";
+                        holder.setVisible(R.id.btn_to_rl_upload2, false);
+                        holder.setVisible(R.id.btn_to_rl_upload, false);
+                    }
+                    final ArrayList imgList=bean.getUrls();
+                    Log.i("imgList----/", String.valueOf(imgList));
+                    holder.setText(R.id.tv_check, StatesStr);
+                    holder.setText(R.id.tv_question, " • " + bean.getQuestion());
+                    holder.setOnClickListener(R.id.btn_to_rl_upload, new View.OnClickListener() {
+                        @Override
+                        public void onClick(View view) {
+                            String text = " • " + bean.getQuestion();
+                            toActivityRecify(RecifyUploadActivity.class, mUserInfo, bean.getPbCode(), bean.getCName(), text, 2,imgList);
+                        }
+                    });
+                    holder.setOnClickListener(R.id.btn_to_rl_upload2, new View.OnClickListener() {
+                        @Override
+                        public void onClick(View view) {
+                            String text = " • " + bean.getQuestion();
+                            toActivityRecify(RecifyUploadActivity.class, mUserInfo, bean.getPbCode(), bean.getCName(), text, 1,imgList);
+                        }
+                    });
+                }
+            };
+            mRecyclerView.setAdapter(mAdapter);
+//        }else{
+//            mRecyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(this)
+//                    .color(getResources().getColor(R.color.line_gray))
+//                    .size(DensityUtil.dip2px(this, 1))
+//                    .build());
+//            mAdapter = new CommonAdapter<RectifyTaskEntity.InfoListBean>(this, R.layout.item_rectify_task, mList) {//item_rectify_task   item_type_task
+//                @Override
+//                protected void convert(ViewHolder holder, final RectifyTaskEntity.InfoListBean bean, int position) {
+//                    holder.setText(R.id.tv_add, bean.getCName());
+//                    Log.i("address==", bean.getCName());
+//                    Log.i("status==", bean.getRectify_status());
+//                    String StatesStr = "";
+//                    // status=0 待审核 = 1已驳回 = 2已通过 null未提交
+//                        holder.setVisible(R.id.btn_to_rl_upload2, true);
+//                        holder.setVisible(R.id.btn_to_rl_upload, true);
+//
+//                    holder.setText(R.id.tv_check, StatesStr);
+//                    holder.setText(R.id.tv_question, " • " + bean.getQuestion());
+////                    holder.setOnClickListener(R.id.btn_to_rl_upload, new View.OnClickListener() {
+////                        @Override
+////                        public void onClick(View view) {
+////                            String text = " • " + bean.getQuestion();
+////                            toActivityRecify(RecifyUploadActivity.class, mUserInfo, bean.getPbCode(), bean.getCName(), text, 2);
+////                        }
+////                    });
+////                    holder.setOnClickListener(R.id.btn_to_rl_upload2, new View.OnClickListener() {
+////                        @Override
+////                        public void onClick(View view) {
+////                            String text = " • " + bean.getQuestion();
+////                            toActivityRecify(RecifyUploadActivity.class, mUserInfo, bean.getPbCode(), bean.getCName(), text, 1);
+////                        }
+////                    });
+//                }
+//            };
+//            mRecyclerView.setAdapter(mAdapter);
+//        }
+
+        mRefreshLayout.setMaterialRefreshListener(new MaterialRefreshListener() {
+            @Override
+            public void onRefresh(final MaterialRefreshLayout materialRefreshLayout) {
+                mPage = 1;
+                mRefreshLayout.setLoadMore(true);
+                request();
+            }
+
+            @Override
+            public void onRefreshLoadMore(MaterialRefreshLayout materialRefreshLayout) {
+                //load more refreshing...
+                request();
+            }
+        });
+    }
+
+
+}

+ 520 - 0
app/src/main/java/com/zhilin/patrol/ui/activity/TaskTypeActivity.java

xqd
@@ -0,0 +1,520 @@
+package com.zhilin.patrol.ui.activity;
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.LinearGradient;
+import android.os.Bundle;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.widget.ImageView;
+
+import com.cjj.MaterialRefreshLayout;
+import com.cjj.MaterialRefreshListener;
+import com.fuyin.constans.P;
+import com.fuyin.interfaces.OnItemPictureClickListener;
+import com.fuyin.ui.ImagePreviewActivity;
+import com.fuyin.views.NineGridTestLayout;
+import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration;
+import com.zhilin.patrol.R;
+import com.zhilin.patrol.bean.FinishTaskEntity;
+import com.zhilin.patrol.bean.LoginEntity;
+import com.zhilin.patrol.bean.MyTaskEntity;
+import com.zhilin.patrol.bean.TaskTypeEntity;
+import com.zhilin.patrol.http.HttpUrl;
+import com.zhilin.patrol.tool.DensityUtil;
+import com.zhilin.patrol.tool.DialogUtil;
+import com.zhilin.patrol.tool.IpUtils;
+import com.zhilin.patrol.tool.JsonUtils;
+import com.zhy.adapter.recyclerview.CommonAdapter;
+import com.zhy.adapter.recyclerview.base.ViewHolder;
+import com.zhy.http.okhttp.OkHttpUtils;
+import com.zhy.http.okhttp.callback.Callback;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import okhttp3.Call;
+import okhttp3.Response;
+
+/**
+ * 抽样,整改,逾期类型任务
+ */
+public class TaskTypeActivity extends BaseActivity {
+
+    @BindView(R.id.recycler)
+    RecyclerView mRecyclerView;
+    @BindView(R.id.swipe_refresh_layout)
+    MaterialRefreshLayout mRefreshLayout;
+
+    private boolean mIsFirst;
+
+    private LoginEntity.InfoListBean.UserInfoBean mUserInfo;
+    private List<TaskTypeEntity.InfoListBean> mList;
+    private CommonAdapter<TaskTypeEntity.InfoListBean> mAdapter;
+
+    private int mPage = 1;
+    /**
+     * 0-未完成任务
+     * 1-普通任务
+     */
+    private int type;
+    private String planCode;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_my_task);
+        ButterKnife.bind(this);
+
+        mUserInfo = (LoginEntity.InfoListBean.UserInfoBean) getIntent().getSerializableExtra("userInfo");
+        type = getIntent().getIntExtra("type", 0);
+        planCode = getIntent().getStringExtra("planCode");
+        if (type == 4) {
+            setTitle("抽样任务");
+        } else if (type == 3) {
+            setTitle("整改任务");
+        } else if (type == 5) {
+            setTitle("逾期任务");
+        }else if (type == 6) {
+            setTitle("任务点位");
+        }
+        else if (type == 7) {
+            setTitle("上月整改不通过任务");
+        }
+        init();
+
+        showLoadingView();
+        mIsFirst = true;
+        request();
+    }
+
+    @Override
+    public void request() {
+        String ipAddress = IpUtils.getIpAddress(this);
+
+        Log.i("1111","_________");
+        Log.i("1111","userCode="+mUserInfo.getUserCode());
+        Log.i("1111","userRole="+mUserInfo.getUserRole());
+        Log.i("1111","page="+mPage);
+        Log.i("1111","planType="+type);
+        Log.i("1111","planCode="+planCode);
+        Log.i("1111","userIP="+ipAddress);
+        OkHttpUtils.post()
+                .url(HttpUrl.GET_REUPLOAD_LIST_URL)
+                .addParams("userCode", mUserInfo.getUserCode())
+                .addParams("userRole", mUserInfo.getUserRole() + "")
+                .addParams("page", mPage + "")
+                .addParams("planType", type + "")
+                .addParams("planCode", planCode)
+                .addParams("userIP", ipAddress)
+                .build().execute(new Callback<TaskTypeEntity>() {
+            @Override
+            public TaskTypeEntity parseNetworkResponse(Response response, int id) throws Exception {
+                String jsonStr = response.body().string();
+                return (TaskTypeEntity) JsonUtils.parseJson2Obj(jsonStr, TaskTypeEntity.class);
+            }
+
+            @Override
+            public void onError(Call call, Exception e, int id) {
+                if (mIsFirst) {
+                    showFailView();
+                } else {
+                    mRefreshLayout.finishRefresh();
+                    mRefreshLayout.finishRefreshLoadMore();
+                }
+                DialogUtil.showNetFailDialog(TaskTypeActivity.this);
+            }
+
+            @Override
+            public void onResponse(TaskTypeEntity entity, int id) {
+                if (mIsFirst) {
+                    showContentView();
+                } else {
+                    mRefreshLayout.finishRefresh();
+                    mRefreshLayout.finishRefreshLoadMore();
+                }
+                mIsFirst = false;
+                if (entity == null) {
+                    DialogUtil.showErrDialog(TaskTypeActivity.this, "返回信息为空");
+                    return;
+                }
+                List<TaskTypeEntity.InfoListBean> list = entity.getInfoList();
+                if (!"1000".endsWith(entity.getReturnCode())) {
+                    DialogUtil.showErrDialog(TaskTypeActivity.this, entity.getReturnMsg());
+                    return;
+                }
+                if (list == null) {
+                    mRefreshLayout.setLoadMore(false);
+                    return;
+                }
+                if (list.size() < 10) {
+                    mRefreshLayout.setLoadMore(false);
+                }
+                if (mPage == 1) {
+                    mList.clear();
+                }
+                mList.addAll(list);
+                mAdapter.notifyDataSetChanged();
+                mPage++;
+                if (mList.isEmpty()) {
+                    showEmptyView();
+                }
+            }
+        });
+    }
+    /*public void request2() {
+        TaskTypeEntity.InfoListBean bean=null;
+        Log.i("1111","_________结束任务接口");
+        Log.i("111","mUserInfo.getUserCode()="+mUserInfo.getUserCode());
+        Log.i("111","mbean.getPCode()="+planCode);
+        OkHttpUtils.post()
+                .url(HttpUrl.FINISH_TASK)
+                .addParams("userCode", mUserInfo.getUserCode())
+                .addParams("pCode", planCode)
+                .build().execute(new Callback<FinishTaskEntity>() {
+            @Override
+            public FinishTaskEntity parseNetworkResponse(Response response, int id) throws Exception {
+                String jsonStr = response.body().string();
+                Log.i("1111","json=="+jsonStr);
+                return (FinishTaskEntity) JsonUtils.parseJson2Obj(jsonStr, FinishTaskEntity.class);
+            }
+
+            @Override
+            public void onError(Call call, Exception e, int id) {
+                DialogUtil.showNetFailDialog(TaskTypeActivity.this);
+            }
+
+            @Override
+            public void onResponse(FinishTaskEntity response, int id) {
+                if (response == null) {
+                    DialogUtil.showErrDialog(TaskTypeActivity.this, "返回信息为空");
+                    return;
+                }
+                if (!"1000".endsWith(response.getReturnCode())) {
+                    DialogUtil.showErrDialog(TaskTypeActivity.this, response.getReturnMsg());
+                    return;
+                }
+                if ("1000".endsWith(response.getReturnCode())) {
+                    DialogUtil.showErrDialog(TaskTypeActivity.this, "提交完成");
+                    return;
+                }
+                Log.i("111","response.getReturnCode()=="+response.getReturnCode());
+            }
+        });
+    }*/
+    private void init() {
+        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
+        mRecyclerView.setHasFixedSize(true);
+        mList = new ArrayList<>();
+        mRecyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(this)
+                .color(getResources().getColor(R.color.line_gray))
+                .size(DensityUtil.dip2px(this, 1))
+                .build());
+        if (type == 3) {//整改任务
+        /*    mAdapter = new CommonAdapter<TaskTypeEntity.InfoListBean>(this, R.layout.item_rectify_task, mList) {//item_rectify_task   item_type_task
+                @Override
+                protected void convert(ViewHolder holder, final TaskTypeEntity.InfoListBean bean, int position) {
+//                    if(bean.getIsFinish().equals("0")){
+                        holder.setText(R.id.tv_add, bean.getAddress());
+                        holder.setOnClickListener(R.id.tv_add, new View.OnClickListener() {
+                            @Override
+                            public void onClick(View v) {
+                                toActivity(PatrolUploadActivity.class, mUserInfo,bean.getPCode(),bean.getAddress(),type);
+                            }
+                        });
+                        holder.setOnClickListener(R.id.btn_to_rl_upload2, new View.OnClickListener() {
+                            @Override
+                            public void onClick(View view) {
+                                List<String> questionArr = bean.getQuestionArr();
+                                StringBuilder sb = new StringBuilder("");
+                                if (questionArr != null && !questionArr.isEmpty()) {
+                                    int size = questionArr.size();
+                                    for (int i = 0; i < size; i++) {
+                                        sb.append(" • ").append(questionArr.get(i));
+                                        if (i != (size - 1)) {
+                                            sb.append("\n");
+                                        }
+                                    }
+                                }
+                                String text = sb.toString();
+//                                toActivityRecify(RecifyUploadActivity.class, mUserInfo,bean.getPCode(),bean.getAddress(),text);
+                            }
+                        });
+                        holder.setOnClickListener(R.id.tv_check, new View.OnClickListener() {
+                            @Override
+                            public void onClick(View view) {
+                                MapActivity.toMap(TaskTypeActivity.this, Double.parseDouble(bean.getLatitude()), Double.parseDouble(bean.getLongitude()), bean.getAddress());
+                            }
+                        });
+
+                        List<String> questionArr = bean.getQuestionArr();
+                        StringBuilder sb = new StringBuilder("");
+                        if (questionArr != null && !questionArr.isEmpty()) {
+                            int size = questionArr.size();
+                            for (int i = 0; i < size; i++) {
+                                sb.append(" • ").append(questionArr.get(i));
+                                if (i != (size - 1)) {
+                                    sb.append("\n");
+                                }
+                            }
+                        }
+                        String text = sb.toString();
+                        if (TextUtils.isEmpty(text)) {
+                            holder.setVisible(R.id.tv_question, false);
+                        } else {
+                            holder.setVisible(R.id.tv_question, true);
+                            holder.setText(R.id.tv_question, text);
+                        }
+                *//*    int taskNum=Integer.parseInt(bean.getTaskNum());
+                    if (taskNum <= bean.getFinishNum()) {
+//                            int n=(Integer) v.getTag();
+                        holder.setVisible(R.id.tv_add, true);
+                        holder.setVisible(R.id.btn_to_rl_upload2, true);
+                        holder.setVisible(R.id.tv_check, true);
+                    } else {
+                        holder.setVisible(R.id.tv_add, false);
+                        holder.setVisible(R.id.btn_to_rl_upload2, false);
+                        holder.setVisible(R.id.tv_check, false);
+                    }*//*
+                      *//*  holder.setOnClickListener(R.id.tv_check3, new View.OnClickListener() {
+                            @Override
+                            public void onClick(View view) {
+                                int taskNum=Integer.parseInt(bean.getTaskNum());
+                                int finishNum=bean.getFinishNum();
+                                if(taskNum<=finishNum){
+                                    request2();
+                                    Log.i("111","整改任务完成*******");
+                                }else{
+                                    DialogUtil.showErrDialog(TaskTypeActivity.this, "未完成");
+                                }
+                            }
+                        });*//*
+
+                    *//*}else {
+                        View view  = holder.getView(R.id.tv_add);
+                        view.setVisibility(View.GONE);//VISIBLE
+                        View view2  = holder.getView(R.id.btn_to_rl_upload2);
+                        view2.setVisibility(View.GONE);
+                        View view3  = holder.getView(R.id.tv_check);
+                        view3.setVisibility(View.GONE);
+                        View view4  = holder.getView(R.id.tv_question);
+                        view4.setVisibility(View.GONE);
+                        View view5  = holder.getView(R.id.tv_check3);
+                        view5.setVisibility(View.GONE);
+                    }*//*
+
+                }
+            };*/
+        }
+        else if(type==7) {//整改不通过任务
+            mAdapter = new CommonAdapter<TaskTypeEntity.InfoListBean>(this, R.layout.item_type_task, mList) {
+                @Override
+                protected void convert(ViewHolder holder, final TaskTypeEntity.InfoListBean bean, int position) {
+//                    if(bean.getIsFinish().equals("0")){
+                    holder.setText(R.id.tv_add, bean.getAddress() + "(需巡" + bean.getTaskNum() + "次|" + "已巡" + bean.getPostNum() + "次)");
+                    holder.setOnClickListener(R.id.tv_add, new View.OnClickListener() {
+                        @Override
+                        public void onClick(View v) {
+                            toActivity(PatrolUploadActivity.class, mUserInfo, bean.getPCode(), bean.getAddress(),type);
+                        }
+                    });
+                    holder.setOnClickListener(R.id.btn_to_rl_upload2, new View.OnClickListener() {
+                        @Override
+                        public void onClick(View view) {
+                            toActivity(PatrolUploadActivity.class, mUserInfo, bean.getPCode(), bean.getAddress(),type);
+                        }
+                    });
+                    holder.setOnClickListener(R.id.tv_check, new View.OnClickListener() {
+                        @Override
+                        public void onClick(View view) {
+                            MapActivity.toMap(TaskTypeActivity.this, Double.parseDouble(bean.getLatitude()), Double.parseDouble(bean.getLongitude()), bean.getAddress());
+                        }
+                    });
+                }
+            };
+        }
+        else if(type==4){//抽样任务
+            mAdapter = new CommonAdapter<TaskTypeEntity.InfoListBean>(this, R.layout.item_type_task, mList) {
+                @Override
+                protected void convert(ViewHolder holder, final TaskTypeEntity.InfoListBean bean, int position) {
+//                    if(bean.getIsFinish().equals("0")){
+                    holder.setText(R.id.tv_add, bean.getAddress() + "(需巡"+bean.getTaskNum()+"次|"+"已巡"+bean.getPostNum()+"次)");
+                    holder.setOnClickListener(R.id.tv_add, new View.OnClickListener() {
+                        @Override
+                        public void onClick(View v) {
+                            toActivity(PatrolUploadActivity.class, mUserInfo,bean.getPCode(),bean.getAddress(),type);
+                        }
+                    });
+                    holder.setOnClickListener(R.id.btn_to_rl_upload2, new View.OnClickListener() {
+                        @Override
+                        public void onClick(View view) {
+                            toActivity(PatrolUploadActivity.class, mUserInfo,bean.getPCode(),bean.getAddress(),type);
+                        }
+                    });
+                    holder.setOnClickListener(R.id.tv_check, new View.OnClickListener() {
+                        @Override
+                        public void onClick(View view) {
+                            MapActivity.toMap(TaskTypeActivity.this, Double.parseDouble(bean.getLatitude()), Double.parseDouble(bean.getLongitude()), bean.getAddress());
+                        }
+                    });
+           /*         int taskNum=Integer.parseInt(bean.getTaskNum());
+                    if (taskNum <= bean.getFinishNum()) {
+//                            int n=(Integer) v.getTag();
+                        holder.setVisible(R.id.tv_add, true);
+                        holder.setVisible(R.id.btn_to_rl_upload2, true);
+                        holder.setVisible(R.id.tv_check, true);
+                    } else {
+                        holder.setVisible(R.id.tv_add, false);
+                        holder.setVisible(R.id.btn_to_rl_upload2, false);
+                        holder.setVisible(R.id.tv_check, false);
+                    }*/
+                    /*holder.setOnClickListener(R.id.tv_check3, new View.OnClickListener() {
+                        @Override
+                        public void onClick(View view) {
+                            int taskNum=Integer.parseInt(bean.getTaskNum());
+                            int finishNum=bean.getFinishNum();
+                            if(taskNum<=finishNum){
+                                request2();
+                                Log.i("111","抽样任务完成*******");
+                            }else{
+                                DialogUtil.showErrDialog(TaskTypeActivity.this, "未完成");
+                            }
+                        }
+                    });*/
+//                }
+                    /*else {
+                        View view  = holder.getView(R.id.tv_add);
+                        view.setVisibility(View.GONE);//VISIBLE
+                        View view2  = holder.getView(R.id.btn_to_rl_upload2);
+                        view2.setVisibility(View.GONE);
+                        View view3  = holder.getView(R.id.tv_check);
+                        view3.setVisibility(View.GONE);
+                        View view5  = holder.getView(R.id.tv_check3);
+                        view5.setVisibility(View.GONE);
+                    }*/
+                }
+            };
+        }
+        else if(type==5){//逾期任务
+            mAdapter = new CommonAdapter<TaskTypeEntity.InfoListBean>(this, R.layout.item_type_task2, mList) {
+                @Override
+                protected void convert(ViewHolder holder, final TaskTypeEntity.InfoListBean bean, int position) {
+                    Log.i("111","getAddress=="+bean.getAddress());
+                    if (bean!=null) {
+                        holder.setText(R.id.tv_add, bean.getAddress()+"(需巡"+bean.getTaskNum()+"次|"+"已巡"+bean.getPostNum()+"次)");//
+//                        holder.setOnClickListener(R.id.tv_add, new View.OnClickListener() {
+//                            @Override
+//                            public void onClick(View v) {
+//                                toActivity(PatrolUploadActivity.class, mUserInfo);
+//                            }
+//                        });
+                        holder.setOnClickListener(R.id.btn_to_rl_upload2, new View.OnClickListener() {
+                            @Override
+                            public void onClick(View view) {
+                                toActivity(PatrolUploadActivity.class, mUserInfo,bean.getPCode(),bean.getAddress(),type);
+                            }
+                        });
+
+                /*        int taskNum=Integer.parseInt(bean.getTaskNum());
+                        if (taskNum <= bean.getFinishNum()) {
+//                            int n=(Integer) v.getTag();
+                            holder.setVisible(R.id.tv_add, true);
+                            holder.setVisible(R.id.btn_to_rl_upload2, true);
+                            holder.setVisible(R.id.tv_check, true);
+                        } else {
+                            holder.setVisible(R.id.tv_add, false);
+                            holder.setVisible(R.id.btn_to_rl_upload2, false);
+                            holder.setVisible(R.id.tv_check, false);
+                        }*/
+                        holder.setOnClickListener(R.id.tv_check, new View.OnClickListener() {
+                            @Override
+                            public void onClick(View view) {
+                                MapActivity.toMap(TaskTypeActivity.this, Double.parseDouble(bean.getLatitude()), Double.parseDouble(bean.getLongitude()), bean.getAddress());
+                            }
+                        });
+                    }
+                }
+            };
+        }
+        else if(type==6){//任务点位
+            mAdapter = new CommonAdapter<TaskTypeEntity.InfoListBean>(this, R.layout.item_type_task, mList) {
+                @Override
+                protected void convert(ViewHolder holder, final TaskTypeEntity.InfoListBean bean, int position) {
+                    holder.setText(R.id.tv_add, bean.getAddress() + "(需巡"+bean.getTaskNum()+"次|"+"已巡"+bean.getPostNum()+"次)");
+                    holder.setOnClickListener(R.id.tv_add, new View.OnClickListener() {
+                        @Override
+                        public void onClick(View v) {
+                            toActivity(PatrolUploadActivity.class, mUserInfo,bean.getPCode(),bean.getAddress(),type);
+                        }
+                    });
+                    holder.setOnClickListener(R.id.tv_check, new View.OnClickListener() {
+                        @Override
+                        public void onClick(View view) {
+                            MapActivity.toMap(TaskTypeActivity.this, Double.parseDouble(bean.getLatitude()), Double.parseDouble(bean.getLongitude()), bean.getAddress());
+                        }
+                    });
+                    holder.setOnClickListener(R.id.btn_to_rl_upload2, new View.OnClickListener() {
+                        @Override
+                        public void onClick(View view) {
+                            toActivity(PatrolUploadActivity.class, mUserInfo,bean.getPCode(),bean.getAddress(),type);
+                        }
+                    });
+           /*         int taskNum=Integer.parseInt(bean.getTaskNum());
+                    if (taskNum <= bean.getFinishNum()) {
+//                            int n=(Integer) v.getTag();
+                        holder.setVisible(R.id.tv_add, true);
+                        holder.setVisible(R.id.btn_to_rl_upload2, true);
+                        holder.setVisible(R.id.tv_check, true);
+                    } else {
+                        holder.setVisible(R.id.tv_add, false);
+                        holder.setVisible(R.id.btn_to_rl_upload2, false);
+                        holder.setVisible(R.id.tv_check, false);
+                    }*/
+                    /*holder.setOnClickListener(R.id.tv_check3, new View.OnClickListener() {
+                        @Override
+                        public void onClick(View view) {
+                            int taskNum=Integer.parseInt(bean.getTaskNum());
+                            int finishNum=bean.getFinishNum();
+                            if(taskNum<=finishNum){
+                                request2();
+                            }else{
+                                DialogUtil.showErrDialog(TaskTypeActivity.this, "未完成");
+                            }
+                        }
+                    });*/
+                }
+            };
+        }
+        mRecyclerView.setAdapter(mAdapter);
+
+        mRefreshLayout.setMaterialRefreshListener(new MaterialRefreshListener() {
+            @Override
+            public void onRefresh(final MaterialRefreshLayout materialRefreshLayout) {
+                //refreshing...
+                mPage = 1;
+                mRefreshLayout.setLoadMore(true);
+                request();
+            }
+
+            @Override
+            public void onRefreshLoadMore(MaterialRefreshLayout materialRefreshLayout) {
+                //load more refreshing...
+                request();
+            }
+        });
+    }
+
+    public static void toTypeTask(Context context, LoginEntity.InfoListBean.UserInfoBean userInfo, String planCode, int type) {
+        Intent intent = new Intent(context, TaskTypeActivity.class);
+        intent.putExtra("userInfo", userInfo);
+        intent.putExtra("type", type);
+        intent.putExtra("planCode", planCode);
+        context.startActivity(intent);
+    }
+
+}

+ 260 - 0
app/src/main/java/com/zhilin/patrol/ui/fragment/PatrolRecordFragment.java

xqd
@@ -0,0 +1,260 @@
+package com.zhilin.patrol.ui.fragment;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.cjj.MaterialRefreshLayout;
+import com.cjj.MaterialRefreshListener;
+import com.fuyin.constans.P;
+import com.fuyin.interfaces.OnItemPictureClickListener;
+import com.fuyin.ui.ImagePreviewActivity;
+import com.fuyin.views.NineGridTestLayout;
+import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration;
+import com.zhilin.patrol.R;
+import com.zhilin.patrol.bean.LoginEntity;
+import com.zhilin.patrol.bean.PatrolRecordEntity;
+import com.zhilin.patrol.http.HttpUrl;
+import com.zhilin.patrol.tool.DensityUtil;
+import com.zhilin.patrol.tool.DialogUtil;
+import com.zhilin.patrol.tool.IpUtils;
+import com.zhilin.patrol.tool.JsonUtils;
+import com.zhilin.patrol.ui.activity.PatrolRecordActivity;
+import com.zhilin.patrol.ui.activity.PatrolUploadActivity;
+import com.zhy.adapter.recyclerview.CommonAdapter;
+import com.zhy.adapter.recyclerview.base.ViewHolder;
+import com.zhy.http.okhttp.OkHttpUtils;
+import com.zhy.http.okhttp.callback.Callback;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import okhttp3.Call;
+import okhttp3.Response;
+
+/**
+ * 巡查记录的fragment
+ */
+public class PatrolRecordFragment extends Fragment {
+
+    public static final String TYPE = "type";
+    @BindView(R.id.recycler)
+    RecyclerView mRecyclerView;
+    @BindView(R.id.swipe_refresh_layout)
+    MaterialRefreshLayout mRefreshLayout;
+
+    private int itemPosition;
+    /**
+     * 类型
+     */
+    private int mType;
+    private int mPage = 1;
+
+    private LoginEntity.InfoListBean.UserInfoBean mUserInfo;
+    private List<PatrolRecordEntity.InfoListBean> mList;
+    private CommonAdapter<PatrolRecordEntity.InfoListBean> mAdapter;
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Bundle arguments = getArguments();
+        mType = arguments.getInt(TYPE);
+    }
+
+    @Nullable
+    @Override
+    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        View view = inflater.inflate(R.layout.fragment_patrol_record, container, false);
+        ButterKnife.bind(this, view);
+        mUserInfo = (LoginEntity.InfoListBean.UserInfoBean) getActivity().getIntent().getSerializableExtra("userInfo");
+        init();
+        request();
+        return view;
+    }
+
+    public void request() {
+        String ipAddress = IpUtils.getIpAddress(getActivity());
+        OkHttpUtils.post()
+                .url(HttpUrl.TASK_LIST_URL)
+                .addParams("userCode", mUserInfo.getUserCode())
+//                .addParams("userCode", "20180619114559kc2tputyb445frazsq")
+                .addParams("userRole", mUserInfo.getUserRole() + "")
+                .addParams("taskType", mType + "")
+                .addParams("page", mPage + "")
+                .addParams("userIP", ipAddress)
+                .build().execute(new Callback<PatrolRecordEntity>() {
+            @Override
+            public PatrolRecordEntity parseNetworkResponse(Response response, int id) throws Exception {
+                String jsonStr = response.body().string();
+                return (PatrolRecordEntity) JsonUtils.parseJson2Obj(jsonStr, PatrolRecordEntity.class);
+            }
+
+            @Override
+            public void onError(Call call, Exception e, int id) {
+                mRefreshLayout.finishRefresh();
+                mRefreshLayout.finishRefreshLoadMore();
+                DialogUtil.showNetFailDialog(getActivity());
+            }
+
+            @Override
+            public void onResponse(PatrolRecordEntity entity, int id) {
+                mRefreshLayout.finishRefresh();
+                mRefreshLayout.finishRefreshLoadMore();
+                if (entity == null) {
+                    DialogUtil.showErrDialog(getActivity(), "返回信息为空");
+                    return;
+                }
+                List<PatrolRecordEntity.InfoListBean> list = entity.getInfoList();
+                if (!"1000".endsWith(entity.getReturnCode())) {
+                    DialogUtil.showErrDialog(getActivity(), entity.getReturnMsg());
+                    return;
+                }
+                if (list == null) {
+                    mRefreshLayout.setLoadMore(false);
+                    return;
+                }
+                if (list.size() < 10) {
+                    mRefreshLayout.setLoadMore(false);
+                } else {
+                    mRefreshLayout.setLoadMore(true);
+                }
+                if (mPage == 1) {
+                    mList.clear();
+                }
+                mList.addAll(list);
+                mAdapter.notifyDataSetChanged();
+                mPage++;
+            }
+        });
+    }
+
+    private void init() {
+        mRefreshLayout.setMaterialRefreshListener(new MaterialRefreshListener() {
+            @Override
+            public void onRefresh(final MaterialRefreshLayout materialRefreshLayout) {
+                //refreshing...
+                mPage = 1;
+                mRefreshLayout.setLoadMore(true);
+                request();
+            }
+
+            @Override
+            public void onRefreshLoadMore(MaterialRefreshLayout materialRefreshLayout) {
+                //load more refreshing...
+                request();
+            }
+        });
+        FragmentActivity activity = getActivity();
+        mRecyclerView.setLayoutManager(new LinearLayoutManager(activity));
+        mRecyclerView.setHasFixedSize(true);
+        mRecyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(getActivity())
+                .size(DensityUtil.dip2px(activity, 8))
+                .color(getResources().getColor(R.color.bg_gray))
+                .build());
+        mList = new ArrayList<>();
+        mAdapter = new CommonAdapter<PatrolRecordEntity.InfoListBean>(activity, R.layout.item_patrol_record, mList) {
+            @Override
+            protected void convert(ViewHolder holder, final PatrolRecordEntity.InfoListBean record, int position) {
+                TextView statusTv = holder.getView(R.id.tv_status);
+                int passState = record.getPassState();
+                holder.setText(R.id.tv_add, record.getAddress());
+                holder.setText(R.id.tv_date, record.getSubTime());
+                if (!TextUtils.isEmpty(record.getQuestion())) {
+                    holder.setVisible(R.id.tv_question_type, true);
+                    holder.setText(R.id.tv_question_type, record.getQuestion());
+                } else {
+                    holder.setVisible(R.id.tv_question_type, false);
+                }
+                //有问题
+                if (0 == record.getIsQuestion()) {//没问题
+                    holder.setText(R.id.tv_question, "没问题");
+                } else {
+                    holder.setText(R.id.tv_question, "有问题");
+                }
+                //指派任务
+                holder.setVisible(R.id.tv_assign, 1 == record.getIsAssign());
+                //审核状态
+                if (-1 == passState) {
+                    holder.setVisible(R.id.ll_fail, false);
+                    holder.setVisible(R.id.tv_reason, false);
+                    holder.setVisible(R.id.tv_desc, false);
+                    statusTv.setText("待审核");
+                    statusTv.setBackground(getResources().getDrawable(R.drawable.bg_yellow_solid_conner));
+                } else if (0 == passState) {
+                    statusTv.setText("不通过");
+                    statusTv.setBackground(getResources().getDrawable(R.drawable.bg_red_solid_conner));
+                    holder.setVisible(R.id.ll_fail, true);
+                    String infoExt = record.getInfoExt();
+                    if (!TextUtils.isEmpty(infoExt)) {
+                        holder.setText(R.id.tv_desc, infoExt);
+                        holder.setVisible(R.id.tv_desc, true);
+                        holder.setVisible(R.id.line_desc, true);
+                    } else {
+                        holder.setVisible(R.id.tv_reason, false);
+                        holder.setVisible(R.id.line_desc, false);
+                    }
+                    String reason = record.getReason();
+                    if (!TextUtils.isEmpty(reason)) {
+                        holder.setText(R.id.tv_reason, "不通过原因: " + reason);
+                        holder.setVisible(R.id.tv_reason, true);
+                    } else {
+                        holder.setVisible(R.id.tv_reason, false);
+                    }
+                } else if (1 == passState) {
+                    statusTv.setText("已通过");
+                    holder.setVisible(R.id.ll_fail, false);
+                    holder.setVisible(R.id.tv_reason, false);
+                    holder.setVisible(R.id.tv_desc, false);
+                    statusTv.setBackground(getResources().getDrawable(R.drawable.bg_blue_solid_conner));
+                }
+                holder.setOnClickListener(R.id.tv_re_upload, new View.OnClickListener() {
+                    @Override
+                    public void onClick(View view) {
+                        // 跳转到上传
+                        ((PatrolRecordActivity) getActivity()).toActivityReUpload(PatrolUploadActivity.class, mUserInfo,record.getPlanCode(),record.getPbCode(),record.getAddress());
+                    }
+                });
+                NineGridTestLayout nineGridTestLayout = holder.getView(R.id.nineTestlayout);
+                nineGridTestLayout.setItemPosition(position);
+                nineGridTestLayout.setIsShowAll(false); //当传入的图片数超过9张时,是否全部显示
+                nineGridTestLayout.setSpacing(5); //动态设置图片之间的间隔
+                nineGridTestLayout.setUrlList(record.getImgs());
+                nineGridTestLayout.setListener(new OnItemPictureClickListener() {
+                    @Override
+                    public void onItemPictureClick(int item, int position, String url, List<String> urlList, ImageView imageView) {
+                        itemPosition = item;
+                        Intent intent = new Intent(getActivity(), ImagePreviewActivity.class);
+                        intent.putStringArrayListExtra("imageList", (ArrayList<String>) urlList);
+                        intent.putExtra(P.START_ITEM_POSITION, itemPosition);
+                        intent.putExtra(P.START_IAMGE_POSITION, position);
+//                        ActivityOptions compat = ActivityOptions.makeSceneTransitionAnimation(getActivity(), imageView, imageView.getTransitionName());
+//                        startActivity(intent, compat.toBundle());
+                        startActivity(intent);
+                        getActivity().overridePendingTransition(0, 0);
+                    }
+                });
+            }
+        };
+        mRecyclerView.setAdapter(mAdapter);
+    }
+
+    public static PatrolRecordFragment newInstance(int type) {
+        PatrolRecordFragment fragment = new PatrolRecordFragment();
+        Bundle bundle = new Bundle();
+        bundle.putInt(TYPE, type);
+        fragment.setArguments(bundle);
+        return fragment;
+    }
+}

+ 69 - 0
app/src/main/java/com/zhilin/patrol/ui/sort/PinyinUtils.java

xqd
@@ -0,0 +1,69 @@
+package com.zhilin.patrol.ui.sort;
+
+
+import net.sourceforge.pinyin4j.PinyinHelper;
+import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
+import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
+import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
+import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
+import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
+
+public class PinyinUtils {
+    /**
+     * 获取拼音
+     *
+     * @param inputString
+     * @return
+     */
+    public static String getPingYin(String inputString) {
+        HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
+        format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
+        format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
+        format.setVCharType(HanyuPinyinVCharType.WITH_V);
+
+        char[] input = inputString.trim().toCharArray();
+        String output = "";
+
+        try {
+            for (char curChar : input) {
+                if (Character.toString(curChar).matches("[\\u4E00-\\u9FA5]+")) {
+                    String[] temp = PinyinHelper.toHanyuPinyinStringArray(curChar, format);
+                    output += temp[0];
+                } else
+                    output += Character.toString(curChar);
+            }
+        } catch (BadHanyuPinyinOutputFormatCombination e) {
+            e.printStackTrace();
+        }
+        return output;
+    }
+
+    /**
+     * 获取第一个字的拼音首字母
+     * @param chinese
+     * @return
+     */
+    public static String getFirstSpell(String chinese) {
+        StringBuffer pinYinBF = new StringBuffer();
+        char[] arr = chinese.toCharArray();
+        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
+        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
+        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
+        for (char curChar : arr) {
+            if (curChar > 128) {
+                try {
+                    String[] temp = PinyinHelper.toHanyuPinyinStringArray(curChar, defaultFormat);
+                    if (temp != null) {
+                        pinYinBF.append(temp[0].charAt(0));
+                    }
+                } catch (BadHanyuPinyinOutputFormatCombination e) {
+                    e.printStackTrace();
+                }
+            } else {
+                pinYinBF.append(curChar);
+            }
+        }
+        return pinYinBF.toString().replaceAll("\\W", "").trim();
+    }
+
+}

+ 180 - 0
app/src/main/java/com/zhilin/patrol/views/AlertDialog.java

xqd
@@ -0,0 +1,180 @@
+package com.zhilin.patrol.views;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.view.Display;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.LinearLayout.LayoutParams;
+import android.widget.TextView;
+
+import com.zhilin.patrol.R;
+import com.zhilin.patrol.ui.activity.RecifyUploadActivity;
+
+
+public class AlertDialog {
+	private Context context;
+	private Dialog dialog;
+	private LinearLayout lLayout_bg;
+	private TextView txt_title;
+	private TextView txt_msg;
+	private Button btn_neg;
+	private Button btn_pos;
+	private ImageView img_line;
+	private Display display;
+	private boolean showTitle = false;
+	private boolean showMsg = false;
+	private boolean showPosBtn = false;
+	private boolean showNegBtn = false;
+
+	public AlertDialog(Context context) {
+		this.context = context;
+		WindowManager windowManager = (WindowManager) context
+				.getSystemService(Context.WINDOW_SERVICE);
+		display = windowManager.getDefaultDisplay();
+	}
+
+	public AlertDialog builder() {
+		View view = LayoutInflater.from(context).inflate(
+				R.layout.view_alertdialog, null);
+
+		lLayout_bg = (LinearLayout) view.findViewById(R.id.lLayout_bg);
+		txt_title = (TextView) view.findViewById(R.id.txt_title);
+		txt_title.setVisibility(View.GONE);
+		txt_msg = (TextView) view.findViewById(R.id.txt_msg);
+		txt_msg.setVisibility(View.GONE);
+		btn_neg = (Button) view.findViewById(R.id.btn_neg);
+		btn_neg.setVisibility(View.GONE);
+		btn_pos = (Button) view.findViewById(R.id.btn_pos);
+		btn_pos.setVisibility(View.GONE);
+		img_line = (ImageView) view.findViewById(R.id.img_line);
+		img_line.setVisibility(View.GONE);
+
+		dialog = new Dialog(context, R.style.AlertDialogStyle);
+		dialog.setContentView(view);
+
+		lLayout_bg.setLayoutParams(new FrameLayout.LayoutParams((int) (display
+				.getWidth() * 0.68), LayoutParams.WRAP_CONTENT));
+
+		return this;
+	}
+
+	public AlertDialog setTitle(String title) {
+		showTitle = true;
+		if ("".equals(title)) {
+			txt_title.setText("标题");
+		} else {
+			txt_title.setText(title);
+		}
+		return this;
+	}
+
+	public AlertDialog setMsg(String msg) {
+		showMsg = true;
+		if ("".equals(msg)) {
+			txt_msg.setText("消息");
+		} else {
+			txt_msg.setText(msg);
+		}
+		return this;
+	}
+
+	public AlertDialog setCancelable(boolean cancel) {
+		dialog.setCancelable(cancel);
+		return this;
+	}
+
+	public AlertDialog setPositiveButton(String text,
+			final OnClickListener listener) {
+		showPosBtn = true;
+		if ("".equals(text)) {
+			btn_pos.setText("确定");
+		} else {
+			btn_pos.setText(text);
+		}
+		btn_pos.setOnClickListener(new OnClickListener() {
+			@Override
+			public void onClick(View v) {
+				listener.onClick(v);
+				dialog.dismiss();
+			}
+		});
+		return this;
+	}
+
+	public AlertDialog setNegativeButton(String text,
+			final OnClickListener listener) {
+		showNegBtn = true;
+		if ("".equals(text)) {
+			btn_neg.setText("取消");
+		} else {
+			btn_neg.setText(text);
+		}
+		btn_neg.setOnClickListener(new OnClickListener() {
+			@Override
+			public void onClick(View v) {
+				listener.onClick(v);
+				dialog.dismiss();
+			}
+		});
+		return this;
+	}
+
+	private void setLayout() {
+		if (!showTitle && !showMsg) {
+			txt_title.setText("提示");
+			txt_title.setVisibility(View.VISIBLE);
+		}
+
+		if (showTitle) {
+			txt_title.setVisibility(View.VISIBLE);
+		}
+
+		if (showMsg) {
+			txt_msg.setVisibility(View.VISIBLE);
+		}
+
+		if (!showPosBtn && !showNegBtn) {
+			btn_pos.setText("确定");
+			btn_pos.setVisibility(View.VISIBLE);
+			btn_pos.setBackgroundResource(R.drawable.alertdialog_single_selector);
+			btn_pos.setOnClickListener(new OnClickListener() {
+				@Override
+				public void onClick(View v) {
+					dialog.dismiss();
+				}
+			});
+		}
+
+		if (showPosBtn && showNegBtn) {
+			btn_pos.setVisibility(View.VISIBLE);
+			btn_pos.setBackgroundResource(R.drawable.alertdialog_right_selector);
+			btn_neg.setVisibility(View.VISIBLE);
+			btn_neg.setBackgroundResource(R.drawable.alertdialog_left_selector);
+			img_line.setVisibility(View.VISIBLE);
+		}
+
+		if (showPosBtn && !showNegBtn) {
+			btn_pos.setVisibility(View.VISIBLE);
+			btn_pos.setBackgroundResource(R.drawable.alertdialog_single_selector);
+		}
+
+		if (!showPosBtn && showNegBtn) {
+			btn_neg.setVisibility(View.VISIBLE);
+			btn_neg.setBackgroundResource(R.drawable.alertdialog_single_selector);
+		}
+	}
+
+	public void show() {
+		setLayout();
+		dialog.show();
+	}
+
+
+}

+ 41 - 0
app/src/main/java/com/zhilin/patrol/views/CustomProgressDialog.java

xqd
@@ -0,0 +1,41 @@
+package com.zhilin.patrol.views;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.view.View;
+import android.widget.TextView;
+
+import com.zhilin.patrol.R;
+
+
+/**
+ * 加载框
+ */
+public class CustomProgressDialog extends Dialog {
+    private Context context;
+    private View layout;
+    TextView loading_txt;
+
+    public CustomProgressDialog(Context context) {
+        super(context, R.style.CustomeDialogStyle);
+        this.setCancelable(false);//点击屏幕不消失
+        this.context = context;
+        initView();
+    }
+
+    private void initView() {
+        layout = View.inflate(context, R.layout.dialog_progress_custom, null);
+        loading_txt = (TextView) layout.findViewById(R.id.loading_txt);
+    }
+
+    public void setText(String msg) {
+        loading_txt.setText(msg);
+    }
+
+    public void showDialog(String msg) {
+        loading_txt.setText(msg);
+        this.setContentView(layout);
+        this.setCanceledOnTouchOutside(false);//点击屏幕不消失
+        this.show();
+    }
+}

BIN
app/src/main/jniLibs/armeabi/libAMapSDK_MAP_v6_3_0.so


BIN
app/src/main/jniLibs/armeabi/libAMapSDK_NAVI_v6_1_0.so


BIN
app/src/main/jniLibs/armeabi/librtbt828.so


BIN
app/src/main/jniLibs/armeabi/libwtbt828.so


BIN
app/src/main/jniLibs/armeabi/libztcodec2.so


+ 19 - 0
app/src/main/res/anim/activity_zoom_close.xml

xqd
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+    android:interpolator="@android:anim/decelerate_interpolator" >
+
+    <scale
+        android:fromXScale="1.0"
+        android:fromYScale="1.0"
+        android:toXScale="0.0"
+        android:toYScale="0.0"
+        android:pivotX="50%"
+        android:pivotY="50%"
+        android:duration="100" />
+
+    <alpha
+        android:fromAlpha="1.0"
+        android:toAlpha="0.0"
+        android:duration="100"/>
+
+</set>

+ 19 - 0
app/src/main/res/anim/activity_zoom_open.xml

xqd
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+    android:interpolator="@android:anim/accelerate_interpolator" >
+
+    <scale
+        android:fromXScale="0.0"
+        android:fromYScale="0.0"
+        android:toXScale="1.0"
+        android:toYScale="1.0"
+        android:pivotX="50%"
+        android:pivotY="50%"
+        android:duration="100" />
+
+    <alpha
+        android:fromAlpha="0.0"
+        android:toAlpha="1.0"
+        android:duration="100" />
+
+</set>

+ 18 - 0
app/src/main/res/anim/scale_in_center.xml

xqd
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <alpha
+        android:duration="@android:integer/config_mediumAnimTime"
+        android:fromAlpha="0.6"
+        android:toAlpha="1.0" />
+
+    <scale
+        android:duration="@android:integer/config_mediumAnimTime"
+        android:fromXScale="0.8"
+        android:fromYScale="0.8"
+        android:pivotX="50%"
+        android:pivotY="50%"
+        android:toXScale="1.0"
+        android:toYScale="1.0" />
+
+</set>

+ 18 - 0
app/src/main/res/anim/scale_out_center.xml

xqd
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <alpha
+        android:duration="@android:integer/config_mediumAnimTime"
+        android:fromAlpha="1.0"
+        android:toAlpha="0.6" />
+
+    <scale
+        android:duration="@android:integer/config_mediumAnimTime"
+        android:fromXScale="1.0"
+        android:fromYScale="1.0"
+        android:pivotX="50%"
+        android:pivotY="50%"
+        android:toXScale="0.8"
+        android:toYScale="0.8" />
+
+</set>

+ 5 - 0
app/src/main/res/anim/slide_in_right.xml

xqd
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set
+  xmlns:android="http://schemas.android.com/apk/res/android">
+    <translate android:duration="@android:integer/config_mediumAnimTime" android:fromXDelta="100.0%p" android:toXDelta="0.0" />
+</set>

+ 5 - 0
app/src/main/res/anim/slide_out_right.xml

xqd
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set
+  xmlns:android="http://schemas.android.com/apk/res/android">
+    <translate android:duration="@android:integer/config_mediumAnimTime" android:fromXDelta="0.0" android:toXDelta="100.0%p" />
+</set>

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä