Просмотр исходного кода

Merge branch 'developer_master' of https://gitlab.com/Arisono/SkWeiChat-Baidu into developer_master

LiuJie 10 лет назад
Родитель
Сommit
f7eef456ce
74 измененных файлов с 1975 добавлено и 173 удалено
  1. 1 1
      WeiChat/build.gradle
  2. 84 125
      WeiChat/src/main/AndroidManifest.xml
  3. 5 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/adapter/PublicMessageAdapter.java
  4. 227 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/CompanyActivity.java
  5. 74 19
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/CompanyContactsActivity.java
  6. 3 3
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/view/CustomerListView.java
  7. 6 17
      WeiChat/src/main/java/com/xzjmyk/pm/activity/util/SmileyParser.java
  8. 1453 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/view/SuperSwipeRefreshLayout.java
  9. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif1.gif
  10. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif10.gif
  11. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif11.gif
  12. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif12.gif
  13. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif13.gif
  14. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif14.gif
  15. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif15.gif
  16. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif16.gif
  17. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif2.gif
  18. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif3.gif
  19. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif4.gif
  20. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif5.gif
  21. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif6.gif
  22. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif7.gif
  23. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif8.gif
  24. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif9.gif
  25. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_001.gif
  26. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_002.gif
  27. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_003.gif
  28. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_004.gif
  29. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_005.gif
  30. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_006.gif
  31. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_007.gif
  32. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_008.gif
  33. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_009.gif
  34. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_010.gif
  35. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_011.gif
  36. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_012.gif
  37. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_013.gif
  38. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_014.gif
  39. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_015.gif
  40. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_016.gif
  41. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_017.gif
  42. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_018.gif
  43. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_019.gif
  44. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_020.gif
  45. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_021.gif
  46. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_022.gif
  47. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_023.gif
  48. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_024.gif
  49. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_025.gif
  50. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_026.gif
  51. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_027.gif
  52. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_028.gif
  53. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_029.gif
  54. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_030.gif
  55. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_031.gif
  56. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_032.gif
  57. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_033.gif
  58. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_034.gif
  59. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_035.gif
  60. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_036.gif
  61. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_037.gif
  62. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_038.gif
  63. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_039.gif
  64. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_040.gif
  65. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_041.gif
  66. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_042.gif
  67. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_043.gif
  68. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_044.gif
  69. BIN
      WeiChat/src/main/res/drawable-xhdpi/gif_045.gif
  70. 5 4
      WeiChat/src/main/res/layout/act_staff_query_list.xml
  71. 80 0
      WeiChat/src/main/res/layout/activity_company.xml
  72. 33 0
      WeiChat/src/main/res/layout/head_view.xml
  73. 2 2
      WeiChat/src/main/res/values/dimens.xml
  74. 2 2
      WeiChat/src/main/res/values/strings.xml

+ 1 - 1
WeiChat/build.gradle

@@ -35,7 +35,6 @@ dependencies {
     compile project(':libfloatingactionbutton')
     compile project(':libpsectionlistview')
     compile project(':libbdupdatesdk')
-
     compile 'com.android.support:support-v4:22.2.0'
     compile 'com.android.support:appcompat-v7:22.2.0'
     compile 'com.commit451:PhotoView:1.2.5'
@@ -56,4 +55,5 @@ dependencies {
     compile files('libs/pushservice-4.5.5.77.jar')
     compile files('libs/xutils.jar')
     compile files('libs/flexjson-2.1.jar')
+    compile 'com.android.support:support-v4:23.3.0'
 }

+ 84 - 125
WeiChat/src/main/AndroidManifest.xml

@@ -2,15 +2,14 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.xzjmyk.pm.activity"
     android:versionCode="34"
-    android:versionName="3.4" >
+    android:versionName="3.4">
 
     <uses-sdk
         android:minSdkVersion="14"
         android:targetSdkVersion="22" />
 
     <!-- 拨打电话 -->
-    <uses-permission android:name="android.permission.CALL_PHONE" >
-    </uses-permission>
+    <uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
 
     <uses-feature android:name="android.hardware.camera" />
     <uses-feature android:name="android.hardware.camera.autofocus" />
@@ -57,26 +56,26 @@
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
-    <!--百度自动更新-->
-    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
-    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
-    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
-    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
-    <uses-permission android:name="android.permission.INTERNET"/>
-    <uses-permission android:name="android.permission.GET_TASKS"/>
-    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
+    <!-- 百度自动更新 -->
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.GET_TASKS" />
+    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
 
     <application
         android:name=".MyApplication"
         android:allowBackup="true"
         android:icon="@drawable/uuu"
         android:label="@string/app_name"
-        android:theme="@style/AppTheme" >
+        android:theme="@style/AppTheme">
 
         <!-- 启动页面 -->
         <activity
             android:name=".ui.SplashActivity"
-            android:theme="@style/SplashTheme" >
+            android:theme="@style/SplashTheme">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 
@@ -84,18 +83,12 @@
             </intent-filter>
         </activity>
         <!-- 登录模块 -->
-        <activity android:name=".ui.account.LoginActivity" >
-        </activity>
-        <activity android:name=".ui.account.LoginHistoryActivity" >
-        </activity>
-        <activity android:name=".ui.account.DataDownloadActivity" >
-        </activity>
-        <activity android:name=".ui.account.RegisterActivity" >
-        </activity>
-        <activity android:name=".ui.account.RegisterPasswordActivity" >
-        </activity>
-        <activity android:name=".ui.account.RegisterUserBasicInfoActivity" >
-        </activity>
+        <activity android:name=".ui.account.LoginActivity"></activity>
+        <activity android:name=".ui.account.LoginHistoryActivity"></activity>
+        <activity android:name=".ui.account.DataDownloadActivity"></activity>
+        <activity android:name=".ui.account.RegisterActivity"></activity>
+        <activity android:name=".ui.account.RegisterPasswordActivity"></activity>
+        <activity android:name=".ui.account.RegisterUserBasicInfoActivity"></activity>
 
         <!-- ERP模块 -->
         <activity android:name=".ui.erp.activity.NoticeMenuActivity" />
@@ -111,15 +104,14 @@
         <activity android:name=".ui.erp.activity.QueryActivity" />
         <activity android:name=".ui.erp.activity.ErpMenActivity" />
         <activity android:name=".ui.erp.activity.DbfindListActivity" />
-        <activity android:name=".ui.erp.activity.AddTaskActivity"
-            android:windowSoftInputMode="adjustUnspecified|stateHidden"
-            android:configChanges="orientation|keyboardHidden"/>
+        <activity
+            android:name=".ui.erp.activity.AddTaskActivity"
+            android:configChanges="orientation|keyboardHidden"
+            android:windowSoftInputMode="adjustUnspecified|stateHidden" />
         <activity android:name=".ui.erp.activity.WebViewCommActivity" />
-
         <activity
             android:name=".ui.erp.activity.DetailTaskActivity"
-            android:windowSoftInputMode="adjustUnspecified|stateHidden" >
-        </activity>
+            android:windowSoftInputMode="adjustUnspecified|stateHidden"></activity>
         <activity android:name=".ui.erp.activity.WebViewLoadActivity" />
         <activity android:name=".ui.erp.activity.NewsDetailActivity" />
         <activity android:name=".ui.erp.activity.NewsTwoActivity" />
@@ -131,7 +123,7 @@
         <activity android:name=".ui.erp.activity.CompanyContactsActivity" />
         <!-- 通用的activity 加载fragment -->
         <activity android:name=".ui.erp.activity.CommonFragmentActivity" />
-        <activity android:name=".ui.erp.activity.MyFriendActivity"/>
+        <activity android:name=".ui.erp.activity.MyFriendActivity" />
         <!-- UserCheckedActivity -->
         <activity
             android:name=".ui.UserCheckedActivity"
@@ -139,130 +131,97 @@
             android:theme="@style/IMTheme.DialogStyle" />
         <activity
             android:name=".ui.MainActivity"
+            android:configChanges="keyboardHidden|orientation"
             android:label="@string/app_name"
             android:launchMode="singleTask"
-            android:configChanges="keyboardHidden|orientation"
             android:screenOrientation="portrait"
-            android:windowSoftInputMode="stateUnspecified|adjustNothing" >
-        </activity>
+            android:windowSoftInputMode="stateUnspecified|adjustNothing"></activity>
         <!-- 消息模块 -->
-        <activity android:name=".ui.message.ChatActivity" >
-        </activity>
-        <activity android:name=".ui.message.NewFriendActivity" >
-        </activity>
-        <activity android:name=".ui.message.MucChatActivity" >
-        </activity>
-        <activity android:name=".ui.message.RoomInfoActivity" >
-        </activity>
-        <activity android:name=".ui.message.AddContactsActivity" >
-        </activity>
+        <activity android:name=".ui.message.ChatActivity"></activity>
+        <activity android:name=".ui.message.NewFriendActivity"></activity>
+        <activity android:name=".ui.message.MucChatActivity"></activity>
+        <activity android:name=".ui.message.RoomInfoActivity"></activity>
+        <activity android:name=".ui.message.AddContactsActivity"></activity>
         <!-- 群聊 -->
-        <activity android:name=".ui.groupchat.SelectContactsActivity" >
-        </activity>
+        <activity android:name=".ui.groupchat.SelectContactsActivity"></activity>
 
         <!-- Circlr模块 -->
-        <activity android:name=".ui.circle.BasicInfoActivity" >
-        </activity>
-        <activity android:name=".ui.circle.BusinessCircleActivity" >
-        </activity>
-        <activity android:name=".ui.circle.CircleAudioRecordActivity" >
-        </activity>
+        <activity android:name=".ui.circle.BasicInfoActivity"></activity>
+        <activity android:name=".ui.circle.BusinessCircleActivity"></activity>
+        <activity android:name=".ui.circle.CircleAudioRecordActivity"></activity>
         <activity
             android:name=".ui.circle.SendAudioActivity"
-            android:windowSoftInputMode="stateHidden|stateAlwaysHidden" >
-        </activity>
+            android:windowSoftInputMode="stateHidden|stateAlwaysHidden"></activity>
         <activity
             android:name=".ui.circle.SendShuoshuoActivity"
-            android:windowSoftInputMode="stateHidden|stateAlwaysHidden" >
-        </activity>
+            android:windowSoftInputMode="stateHidden|stateAlwaysHidden"></activity>
         <activity
             android:name=".ui.circle.SendVideoActivity"
-            android:windowSoftInputMode="stateHidden|stateAlwaysHidden" >
-        </activity>
+            android:windowSoftInputMode="stateHidden|stateAlwaysHidden"></activity>
         <activity
             android:name=".ui.circle.PMsgDetailActivity"
             android:configChanges="orientation|screenSize"
-            android:windowSoftInputMode="stateAlwaysHidden|adjustUnspecified" >
-        </activity>
-        <activity android:name=".ui.circle.BaiduMapActivity" >
-        </activity>
+            android:windowSoftInputMode="stateAlwaysHidden|adjustUnspecified"></activity>
+        <activity android:name=".ui.circle.BaiduMapActivity"></activity>
 
         <!-- 附近模块 -->
         <activity
             android:name=".ui.nearby.UserSearchActivity"
-            android:windowSoftInputMode="stateHidden|stateAlwaysHidden" >
-        </activity>
-        <activity android:name=".ui.nearby.UserListActivity" >
-        </activity>
+            android:windowSoftInputMode="stateHidden|stateAlwaysHidden"></activity>
+        <activity android:name=".ui.nearby.UserListActivity"></activity>
         <!-- Me模块 -->
-        <activity android:name=".ui.me.LocalVideoActivity" >
-        </activity>
-        <activity android:name=".ui.me.SettingActivity"
+        <activity android:name=".ui.me.LocalVideoActivity"></activity>
+        <activity
+            android:name=".ui.me.SettingActivity"
             android:configChanges="keyboardHidden|orientation"
-            android:screenOrientation="portrait">
-        </activity>
-        <activity android:name=".ui.me.AboutActivity" >
-        </activity>
-        <activity android:name=".video.VideoRecordActivity" >
-        </activity>
-        <activity android:name=".ui.cardcast.CardcastActivity" android:theme="@style/Theme.AppCompat.Light.NoActionBar" >
-
-        </activity>
+            android:screenOrientation="portrait"></activity>
+        <activity android:name=".ui.me.AboutActivity"></activity>
+        <activity android:name=".video.VideoRecordActivity"></activity>
+        <activity
+            android:name=".ui.cardcast.CardcastActivity"
+            android:theme="@style/Theme.AppCompat.Light.NoActionBar"></activity>
         <activity
             android:name=".ui.me.BasicInfoEditActivity"
-            android:windowSoftInputMode="stateHidden|stateAlwaysHidden" >
-        </activity>
+            android:windowSoftInputMode="stateHidden|stateAlwaysHidden"></activity>
         <!-- Tool Activity -->
         <activity
             android:name=".ui.tool.MultiImagePreviewActivity"
-            android:screenOrientation="portrait" >
-        </activity>
+            android:screenOrientation="portrait"></activity>
         <activity
             android:name=".ui.tool.SelectAreaActivity"
-            android:screenOrientation="portrait" >
-        </activity>
+            android:screenOrientation="portrait"></activity>
         <activity
             android:name=".ui.tool.SelectConstantActivity"
-            android:screenOrientation="portrait" >
-        </activity>
+            android:screenOrientation="portrait"></activity>
         <activity
             android:name=".ui.tool.SelectConstantSectionActivity"
-            android:screenOrientation="portrait" >
-        </activity>
+            android:screenOrientation="portrait"></activity>
         <activity
             android:name=".ui.tool.SingleImagePreviewActivity"
-            android:screenOrientation="portrait" >
-        </activity>
+            android:screenOrientation="portrait"></activity>
         <activity
             android:name=".ui.tool.VideoPlayActivity"
-            android:configChanges="orientation|screenSize" >
-        </activity>
+            android:configChanges="orientation|screenSize"></activity>
         <activity
             android:name=".ui.tool.WebViewActivity"
-            android:screenOrientation="portrait" >
-        </activity>
+            android:screenOrientation="portrait"></activity>
         <activity
             android:name=".ui.tool.SelectDateActivity"
-            android:screenOrientation="portrait" >
-        </activity>
+            android:screenOrientation="portrait"></activity>
         <activity
             android:name=".ui.tool.MemoryFileManagement"
-            android:screenOrientation="portrait" >
-        </activity>
+            android:screenOrientation="portrait"></activity>
         <activity
             android:name=".ui.circle.SendBaiDuLocate"
-            android:screenOrientation="portrait" >
-        </activity>
+            android:screenOrientation="portrait"></activity>
 
         <!-- CoreService -->
-        <service android:name=".xmpp.CoreService" >
-        </service>
+        <service android:name=".xmpp.CoreService"></service>
         <!-- 百度Location -->
         <service
             android:name="com.baidu.location.f"
             android:enabled="true"
-            android:process=":remote" >
-        </service>
+            android:process=":remote"></service>
 
         <meta-data
             android:name="com.baidu.lbsapi.API_KEY"
@@ -274,7 +233,7 @@
             android:exported="true"
             android:icon="@drawable/ic_chooser"
             android:label="@string/choose_file"
-            android:theme="@style/ChooserTheme" >
+            android:theme="@style/ChooserTheme">
             <intent-filter>
                 <action android:name="android.intent.action.GET_CONTENT" />
 
@@ -291,13 +250,13 @@
             android:enabled="@bool/use_provider"
             android:exported="true"
             android:grantUriPermissions="true"
-            android:permission="android.permission.MANAGE_DOCUMENTS" >
+            android:permission="android.permission.MANAGE_DOCUMENTS">
             <intent-filter>
                 <action android:name="android.content.action.DOCUMENTS_PROVIDER" />
             </intent-filter>
         </provider>
 
-        <receiver android:name=".broadcast.ScrenLockedBroadCastReceiver" >
+        <receiver android:name=".broadcast.ScrenLockedBroadCastReceiver">
             <intent-filter>
                 <action android:name="android.intent.action.SCREEN_OFF" />
                 <action android:name="android.intent.action.SCREEN_ON" />
@@ -307,18 +266,15 @@
         <activity
             android:name=".ui.message.InstantMessageActivity"
             android:launchMode="singleTask"
-            android:screenOrientation="portrait" >
-        </activity>
+            android:screenOrientation="portrait"></activity>
         <activity
             android:name=".ui.message.SelectNewContactsActivity"
             android:launchMode="singleTask"
-            android:screenOrientation="portrait" >
-        </activity>
+            android:screenOrientation="portrait"></activity>
         <activity
             android:name=".ui.message.SelectNewGroupInstantActivity"
             android:launchMode="singleTask"
-            android:screenOrientation="portrait" >
-        </activity>
+            android:screenOrientation="portrait"></activity>
         <activity
             android:name="com.ipaulpro.afilechooser.FileReceiverActivity"
             android:screenOrientation="portrait" />
@@ -327,7 +283,7 @@
         <!-- 用于接收系统消息以保证PushService正常运行 -->
         <receiver
             android:name="com.baidu.android.pushservice.PushServiceReceiver"
-            android:process=":bdservice_v1" >
+            android:process=":bdservice_v1">
             <intent-filter>
                 <action android:name="android.intent.action.BOOT_COMPLETED" />
                 <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
@@ -343,7 +299,7 @@
         <!-- Push服务接收客户端发送的各种请求 -->
         <receiver
             android:name="com.baidu.android.pushservice.RegistrationReceiver"
-            android:process=":bdservice_v1" >
+            android:process=":bdservice_v1">
             <intent-filter>
                 <action android:name="com.baidu.android.pushservice.action.METHOD" />
                 <action android:name="com.baidu.android.pushservice.action.BIND_SYNC" />
@@ -362,7 +318,7 @@
             android:name="com.baidu.android.pushservice.PushService"
             android:exported="true"
             android:persistent="true"
-            android:process=":bdservice_v1" >
+            android:process=":bdservice_v1">
             <intent-filter>
                 <action android:name="com.baidu.android.pushservice.action.PUSH_SERVICE" />
             </intent-filter>
@@ -376,7 +332,7 @@
 
 
         <!-- 此处Receiver名字修改为当前包名路径 -->
-        <receiver android:name=".ui.PushNetMessageReceiver" >
+        <receiver android:name=".ui.PushNetMessageReceiver">
             <intent-filter>
 
                 <!-- 接收push消息 -->
@@ -397,28 +353,31 @@
             </intent-filter>
         </activity>
         -->
-        <activity android:name=".ui.message.SelectCardActivity" >
+        <activity android:name=".ui.message.SelectCardActivity">
             <intent-filter>
-                <action android:name="com.xzjmyk.pm.activity.ui.message.SelectCardActivity"/>
+                <action android:name="com.xzjmyk.pm.activity.ui.message.SelectCardActivity" />
             </intent-filter>
         </activity>
 
-        <!-- 百度自动更新 -->  <!-- 自动更新SDK -->
+        <!-- 百度自动更新 -->
+        <!-- 自动更新SDK -->
         <meta-data
             android:name="BDAPPID"
             android:value="8037149" />
         <meta-data
             android:name="BDAPPKEY"
             android:value="GMZFDGbbchdQQXjpabX38rTlychRGnEF" />
+
         <activity
             android:name="com.baidu.autoupdatesdk.ConfirmDialoigActivity"
-            android:exported="false"
             android:configChanges="keyboardHidden|orientation"
+            android:exported="false"
             android:screenOrientation="portrait"
             android:theme="@style/bdp_update_dialog_style_fullscreen" />
+
         <receiver
             android:name="com.baidu.autoupdatesdk.receiver.BDBroadcastReceiver"
-            android:exported="false" >
+            android:exported="false">
             <intent-filter>
                 <action android:name="com.baidu.autoupdatesdk.ACTION_NEW_UPDATE" />
                 <action android:name="com.baidu.autoupdatesdk.ACTION_DOWNLOAD_COMPLETE" />
@@ -427,7 +386,7 @@
             </intent-filter>
         </receiver>
 
-
+        <activity android:name=".ui.erp.activity.CompanyActivity"></activity>
     </application>
 
-</manifest>
+</manifest>

+ 5 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/adapter/PublicMessageAdapter.java

@@ -716,11 +716,16 @@ public class PublicMessageAdapter extends BaseAdapter implements BusinessCircleA
             // 设置评论内容
             String commentBody = comment.getBody();
             if (!TextUtils.isEmpty(commentBody)) {
+                Log.i("gongpengming", commentBody.toString());
                 commentBody = StringUtils.replaceSpecialChar(comment.getBody());
+                Log.i("gongpengming", commentBody.toString());
                 CharSequence charSequence = HtmlUtils.transform200SpanString(commentBody.replaceAll("\n", "\r\n"),
                         true);
+                Log.i("gongpengming", charSequence.toString());
                 builder.append(charSequence);
             }
+
+
             holder.text_view.setText(builder);
             holder.text_view.setLinksClickable(true);
             holder.text_view.setMovementMethod(LinkMovementClickMethod.getInstance());

+ 227 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/CompanyActivity.java

@@ -0,0 +1,227 @@
+package com.xzjmyk.pm.activity.ui.erp.activity;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.support.v4.widget.SwipeRefreshLayout;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AbsListView;
+import android.widget.BaseAdapter;
+import android.widget.HorizontalScrollView;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.RadioGroup;
+import android.widget.TextView;
+
+import com.xzjmyk.pm.activity.R;
+import com.xzjmyk.pm.activity.ui.base.BaseActivity;
+import com.xzjmyk.pm.activity.ui.erp.entity.Hrorgs;
+import com.xzjmyk.pm.activity.ui.erp.view.CustomerListView;
+
+import java.util.List;
+
+public class CompanyActivity extends BaseActivity {
+    public static final int LIST_LEFT_MODE = 0;
+    public static final int LIST_RIGHT_MODE = 1;
+    private SwipeRefreshLayout refresh_top;
+    private LinearLayout ll_content;
+    private HorizontalScrollView hv_head_view;
+    private RadioGroup rg_nav_content;
+    private CustomerListView lv_saff_list, lv_left_list;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_company);
+        init();
+        initView();
+    }
+
+    private void initView() {
+        refresh_top = (SwipeRefreshLayout) findViewById(R.id.refresh_top);
+        ll_content = (LinearLayout) findViewById(R.id.ll_content);
+        hv_head_view = (HorizontalScrollView) findViewById(R.id.hv_head_view);
+        rg_nav_content = (RadioGroup) findViewById(R.id.rg_nav_content);
+        lv_saff_list = (CustomerListView) findViewById(R.id.lv_saff_list);
+        lv_left_list = (CustomerListView) findViewById(R.id.lv_left_list);
+
+        refresh_top.setColorSchemeResources(R.color.blue, R.color.yellow, R.color.grey, R.color.red);
+        refresh_top.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
+            @Override
+            public void onRefresh() {
+                // TODO 刷新
+                Log.i("gongpengming", "正在刷新");
+            }
+        });
+        lv_saff_list.setOnScrollListener(new AbsListView.OnScrollListener() {
+            @Override
+            public void onScrollStateChanged(AbsListView absListView, int i) {
+            }
+
+            @Override
+            public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
+                if (firstVisibleItem == 0)
+                    refresh_top.setEnabled(true);
+                else
+                    refresh_top.setEnabled(false);
+            }
+        });
+
+
+
+    }
+
+    private void init() {
+
+
+    }
+
+
+    public class DetailItemAdapter extends BaseAdapter {
+        private Context ct;
+        private LayoutInflater inflater;
+        private List<Hrorgs.HrorgItem> lists;
+        private List<Hrorgs.Employee> employees;
+        private int selectPosition;
+        private int typeMode = LIST_RIGHT_MODE;
+
+
+        public DetailItemAdapter(Context ct, List<Hrorgs.HrorgItem> items) {
+            this.ct = ct;
+            this.inflater = LayoutInflater.from(ct);
+            this.lists = items;
+        }
+
+        public DetailItemAdapter(Context ct, Hrorgs object) {
+            this.ct = ct;
+            this.inflater = LayoutInflater.from(ct);
+            this.employees = object.getEmployees();
+            this.lists = object.getHrorgs();
+        }
+
+        public void setMode(int typeMode) {
+            this.typeMode = typeMode;
+        }
+
+        @Override
+        public int getCount() {
+            if (lists != null && employees != null) {
+                return lists.size() + employees.size();
+            } else if (lists != null) {
+                return lists.size();
+            } else if (employees != null) {
+                return employees.size();
+            }
+            return 0;
+        }
+
+        public List<Hrorgs.Employee> getEmployees() {
+            return employees;
+        }
+
+        public void setEmployees(List<Hrorgs.Employee> employees) {
+            this.employees = employees;
+        }
+
+        @Override
+        public Object getItem(int position) {
+            if (lists != null && employees != null) {
+                if (position < lists.size()) {
+                    return lists.get(position);
+                } else {
+                    return employees.get(position);
+                }
+            } else if (lists != null) {
+                return lists.get(position);
+            } else if (employees != null) {
+                return employees.get(position);
+            }
+            return null;
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return position;
+        }
+
+        public void setSelectPosition(int position) {
+            this.selectPosition = position;
+        }
+
+        @Override
+        public View getView(final int position, View convertView, ViewGroup parent) {
+            ModelItem item = null;
+            if (convertView == null) {
+                item = new ModelItem();
+
+                convertView = inflater.inflate(R.layout.item_staff_tree, parent, false);
+                item.iv_falg = (ImageView) convertView.findViewById(R.id.iv_item_falg);
+                item.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
+                item.tv_type = (TextView) convertView.findViewById(R.id.tv_name_type);
+                item.iv_enter = (ImageView) convertView.findViewById(R.id.iv_item_into);
+                convertView.setTag(item);
+            } else {
+                item = (ModelItem) convertView.getTag();
+            }
+            // 三种情况
+            if (lists != null && employees != null) {
+                if (position < lists.size()) {
+                    item.tv_name.setText(lists.get(position).getOr_name());
+                    item.or_id = lists.get(position).getOr_id();
+                    item.isleaf = lists.get(position).getOr_isleaf();
+                    item.tv_type.setText("部门");
+                    item.tv_type.setVisibility(View.INVISIBLE);
+                } else {
+                    item.tv_name.setText(employees.get(position - lists.size()).em_name);
+                    item.or_id = employees.get(position - lists.size()).getEm_id();
+                    item.isleaf = 1;
+                    item.imid = employees.get(position - lists.size()).getEm_imid();
+                    // item.iv_enter.setVisibility(View.GONE);
+                    item.tv_type.setText("联系人");
+                    item.tv_type.setVisibility(View.INVISIBLE);
+                }
+
+            } else if (lists != null) {
+                item.tv_name.setText(lists.get(position).getOr_name());
+                item.or_id = lists.get(position).getOr_id();
+                item.isleaf = lists.get(position).getOr_isleaf();
+                item.tv_type.setText("部门");
+                item.tv_type.setVisibility(View.INVISIBLE);
+            } else if (employees != null) {
+                item.tv_name.setText(employees.get(position).em_name);
+                item.or_id = employees.get(position).getEm_id();
+                item.isleaf = 1;
+                // item.tv_name.setTextColor(ct.getResources().getColor(R.color.gray));
+                item.tv_type.setText("联系人");
+                item.imid = employees.get(position).getEm_imid();
+                item.tv_type.setVisibility(View.INVISIBLE);
+            }
+            item.iv_falg.setVisibility(View.GONE);
+            if (typeMode == LIST_LEFT_MODE) {
+                if (position == selectPosition) {
+                    convertView.setBackgroundResource(R.drawable.tongcheng_all_bg01);
+                } else {
+                    convertView.setBackgroundColor(Color.parseColor("#f4f4f4"));
+                }
+                item.iv_enter.setVisibility(View.GONE);
+            } else {
+                convertView.setBackgroundColor(Color.parseColor("#FFFFFF"));
+            }
+            return convertView;
+        }
+
+        class ModelItem {
+
+            public int imid;
+            public int or_id;
+            public int isleaf;
+            public TextView tv_type;
+            public ImageView iv_falg;
+            public TextView tv_name;
+            public ImageView iv_enter;
+        }
+    }
+}

+ 74 - 19
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/CompanyContactsActivity.java

@@ -12,6 +12,7 @@ import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.AbsListView;
 import android.widget.AdapterView;
 import android.widget.BaseAdapter;
 import android.widget.HorizontalScrollView;
@@ -20,31 +21,29 @@ import android.widget.LinearLayout;
 import android.widget.RadioButton;
 import android.widget.RadioGroup;
 import android.widget.RelativeLayout;
-import android.widget.ScrollView;
 import android.widget.TextView;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
-import com.handmark.pulltorefresh.library.PullToRefreshBase;
-import com.handmark.pulltorefresh.library.PullToRefreshScrollView;
 import com.lidroid.xutils.ViewUtils;
 import com.lidroid.xutils.view.annotation.ViewInject;
-import com.xzjmyk.pm.activity.db.dao.FriendDao;
-import com.xzjmyk.pm.activity.ui.MainActivity;
-import com.xzjmyk.pm.activity.ui.erp.db.DBManager;
-import com.xzjmyk.pm.activity.ui.erp.entity.Hrorgs;
-import com.xzjmyk.pm.activity.util.TimeUtils;
 import com.xzjmyk.pm.activity.MyApplication;
 import com.xzjmyk.pm.activity.R;
 import com.xzjmyk.pm.activity.bean.Friend;
+import com.xzjmyk.pm.activity.db.dao.FriendDao;
+import com.xzjmyk.pm.activity.ui.MainActivity;
 import com.xzjmyk.pm.activity.ui.base.BaseActivity;
+import com.xzjmyk.pm.activity.ui.erp.db.DBManager;
 import com.xzjmyk.pm.activity.ui.erp.entity.EmployeesEntity;
+import com.xzjmyk.pm.activity.ui.erp.entity.Hrorgs;
 import com.xzjmyk.pm.activity.ui.erp.entity.HrorgsEntity;
 import com.xzjmyk.pm.activity.ui.erp.util.CommonUtil;
 import com.xzjmyk.pm.activity.ui.erp.util.Constants;
 import com.xzjmyk.pm.activity.ui.erp.util.ViewUtil;
 import com.xzjmyk.pm.activity.ui.erp.view.CustomerListView;
 import com.xzjmyk.pm.activity.ui.message.ChatActivity;
+import com.xzjmyk.pm.activity.util.TimeUtils;
+import com.xzjmyk.pm.activity.view.SuperSwipeRefreshLayout;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
@@ -92,7 +91,7 @@ public class CompanyContactsActivity extends BaseActivity {
     @ViewInject(R.id.rl_empty)
     private RelativeLayout rl_empty;
     @ViewInject(R.id.refresh_top)
-    private PullToRefreshScrollView reScrollView;
+    private SuperSwipeRefreshLayout reScrollView;
     private Hrorgs hrorgs_parent;
     private Hrorgs hrorgs_left;
     private int hrorgs_parent_position = 0;
@@ -121,9 +120,9 @@ public class CompanyContactsActivity extends BaseActivity {
                         Log.i(TAG, "数据库缓存时间:" + date);
                         LoadServerData(master, date);//需要获取网络数据
                     } else {
-//                        ViewUtil.ShowBasicNoTitle(ct);
-//                        progressDialog.dismiss();
-                        reScrollView.onRefreshComplete();
+                        if (reScrollView.isRefreshing()) {
+                            reScrollView.setRefreshing(false);
+                        }
                     }
                     break;
                 case LOAD_SUCCESS_ALLDATA:
@@ -139,7 +138,8 @@ public class CompanyContactsActivity extends BaseActivity {
                     if (hrEntity != null) {
                         isFristLoad = false;
                     }
-                    reScrollView.getLoadingLayoutProxy().setRefreshingLabel("正在同步数据,请稍等...");
+                    reScrollView.setRefreshing(true);
+//                    reScrollView.getLoadingLayoutProxy().setRefreshingLabel("正在同步数据,请稍等...");
                     //空代表取缓存
                     if (!hrorgsEntities.isEmpty() || !employeesEntities.isEmpty()) {
                         Log.i(TAG, "是否是第一次加载数据:" + isFristLoad);
@@ -153,7 +153,10 @@ public class CompanyContactsActivity extends BaseActivity {
                         Log.i(TAG, "取缓存数据.....!");
                         LoadRootHrorgFromServer();//取缓存
                     }
-                    reScrollView.onRefreshComplete();
+
+                    if (reScrollView.isRefreshing()) {
+                        reScrollView.setRefreshing(false);
+                    }
 //                    progressDialog.dismiss();
                     break;
                 case Constants.LOAD_SUCCESS://根节点
@@ -364,7 +367,11 @@ public class CompanyContactsActivity extends BaseActivity {
                     String exception = msg.getData().getString("result");
                     com.xzjmyk.pm.activity.ui.erp.net.ViewUtil.ToastMessage(ct, exception);
                     com.xzjmyk.pm.activity.ui.erp.net.ViewUtil.AutoLoginErp(ct);
-                    reScrollView.onRefreshComplete();
+//                    reScrollView.onRefreshComplete();
+
+                    if (reScrollView.isRefreshing()) {
+                        reScrollView.setRefreshing(false);
+                    }
                     break;
                 default:
                     break;
@@ -372,6 +379,7 @@ public class CompanyContactsActivity extends BaseActivity {
         }
 
     };
+    private View viewHead;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -480,17 +488,64 @@ public class CompanyContactsActivity extends BaseActivity {
                 }
             }
         });
+        listview.setOnScrollListener(new AbsListView.OnScrollListener() {
+            @Override
+            public void onScrollStateChanged(AbsListView absListView, int i) {
+            }
 
-        reScrollView.getLoadingLayoutProxy().setPullLabel("同步数据需要时间,需要耐心等待!");
-        reScrollView.getLoadingLayoutProxy().setReleaseLabel("释放刷新");
-        reScrollView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener<ScrollView>() {
+            @Override
+            public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
+                if (firstVisibleItem == 0)
+                    reScrollView.setEnabled(true);
+                else
+                    reScrollView.setEnabled(false);
+            }
+        });
+        mlistleft.setOnScrollListener(new AbsListView.OnScrollListener() {
+            @Override
+            public void onScrollStateChanged(AbsListView absListView, int i) {
+            }
 
             @Override
-            public void onRefresh(PullToRefreshBase<ScrollView> refreshView) {
+            public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
+                if (firstVisibleItem == 0)
+                    reScrollView.setEnabled(true);
+                else
+                    reScrollView.setEnabled(false);
+            }
+        });
+        viewHead = LayoutInflater.from(this).inflate(R.layout.head_view,null);
+        reScrollView.setHeaderView(viewHead);
+        reScrollView.setOnPullRefreshListener(new SuperSwipeRefreshLayout.OnPullRefreshListener() {
+            @Override
+            public void onRefresh() {
                 manager.deleteData(CommonUtil.getSharedPreferences(ct, "erp_master"));
                 LoadServerData(CommonUtil.getSharedPreferences(ct, "erp_master"), null);
             }
+
+            @Override
+            public void onPullDistance(int distance) {
+                //TODO 下拉距离
+            }
+
+            @Override
+            public void onPullEnable(boolean enable) {
+                //TODO 下拉过程中,下拉的距离是否足够出发刷新
+            }
         });
+
+
+
+//        reScrollView.getLoadingLayoutProxy().setPullLabel("同步数据需要时间,需要耐心等待!");
+//        reScrollView.getLoadingLayoutProxy().setReleaseLabel("释放刷新");
+//        reScrollView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener<ScrollView>() {
+//
+//            @Override
+//            public void onRefresh(PullToRefreshBase<ScrollView> refreshView) {
+//                manager.deleteData(CommonUtil.getSharedPreferences(ct, "erp_master"));
+//                LoadServerData(CommonUtil.getSharedPreferences(ct, "erp_master"), null);
+//            }
+//        });
     }
 
     private void EnterChatAction(DetailItemAdapter.ModelItem item) {

+ 3 - 3
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/view/CustomerListView.java

@@ -30,9 +30,9 @@ public class CustomerListView extends ListView {
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
         /**@注释:这两个代码是用在嵌套scrollview控件中的,解决显示一行的问题,但是会产生新的问题  */
-        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
-                MeasureSpec.AT_MOST);
-        super.onMeasure(widthMeasureSpec, expandSpec);
+//        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
+//                MeasureSpec.AT_MOST);
+//        super.onMeasure(widthMeasureSpec, expandSpec);
         int height = getMeasuredHeight();
         int width = 0;
 

+ 6 - 17
WeiChat/src/main/java/com/xzjmyk/pm/activity/util/SmileyParser.java

@@ -140,24 +140,13 @@ public class SmileyParser {
 
         //动态表情
         private static final int[][] IDS = {
-                {R.drawable.gif_001, R.drawable.gif_002, R.drawable.gif_003, R.drawable.gif_004, R.drawable.gif_005, R.drawable.gif_006,
-                        R.drawable.gif_007, R.drawable.gif_008},
-                {R.drawable.gif_009, R.drawable.gif_010, R.drawable.gif_011, R.drawable.gif_012, R.drawable.gif_013, R.drawable.gif_014,
-                        R.drawable.gif_015, R.drawable.gif_016},
-                {R.drawable.gif_017, R.drawable.gif_018, R.drawable.gif_019, R.drawable.gif_020, R.drawable.gif_021, R.drawable.gif_022,
-                        R.drawable.gif_023, R.drawable.gif_024},
-                {R.drawable.gif_025, R.drawable.gif_026, R.drawable.gif_027, R.drawable.gif_028, R.drawable.gif_029, R.drawable.gif_030,
-                        R.drawable.gif_031, R.drawable.gif_032},
-                {R.drawable.gif_033, R.drawable.gif_034, R.drawable.gif_035, R.drawable.gif_036, R.drawable.gif_037, R.drawable.gif_038,
-                        R.drawable.gif_039, R.drawable.gif_040},
-                {R.drawable.gif_041, R.drawable.gif_042, R.drawable.gif_043, R.drawable.gif_044, R.drawable.gif_045}};
+                {R.drawable.gif1, R.drawable.gif2, R.drawable.gif3, R.drawable.gif4, R.drawable.gif5, R.drawable.gif6,
+                        R.drawable.gif7, R.drawable.gif8}, {R.drawable.gif9, R.drawable.gif10, R.drawable.gif11, R.drawable.gif12, R.drawable.gif13, R.drawable.gif14,
+                R.drawable.gif15, R.drawable.gif16}
+        };
         private static final String[][] TEXTS = {
-                {"bad手势.gif", "come手势.gif", "fuck手势.gif", "good手势.gif", "nono手势.gif", "ok手势.gif", "yeh手势.gif", "爱你.gif"},
-                {"抱抱.gif", "鄙视.gif", "闭嘴.gif", "吃惊.gif", "打哈秋.gif", "鼓掌.gif", "哈哈.gif", "害羞.gif"},
-                {"好吃.gif", "呵呵.gif", "哼.gif", "花心.gif", "奸笑.gif", "见钱开眼.gif", "可爱.gif", "困.gif"},
-                {"流汗.gif", "流泪.gif", "怒.gif", "抛媚眼.gif", "亲亲.gif", "傻眼.gif", "生病.gif", "失望.gif"},
-                {"睡觉.gif", "思考.gif", "送花.gif", "调皮.gif", "偷笑.gif", "吐白沫.gif", "委屈.gif", "嘻嘻.gif"},
-                {"喜欢.gif", "兴奋.gif", "嘘!安静.gif", "疑问.gif", "再见.gif"}};
+                {"01.gif", "02.gif", "03.gif", "04.gif", "05.gif", "06.gif", "07.gif", "08.gif"},
+                {"09.gif", "10.gif", "11.gif", "12.gif", "13.gif", "14.gif", "15.gif", "16.gif"}};
         private static final Map<String, Integer> MAPS = new HashMap<String, Integer>();
 
         static {

+ 1453 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/view/SuperSwipeRefreshLayout.java

@@ -0,0 +1,1453 @@
+package com.xzjmyk.pm.activity.view;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ValueAnimator;
+import android.animation.ValueAnimator.AnimatorUpdateListener;
+import android.annotation.SuppressLint;
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.RectF;
+import android.os.Build;
+import android.os.Handler;
+import android.support.v4.view.MotionEventCompat;
+import android.support.v4.view.ViewCompat;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.RecyclerView.LayoutManager;
+import android.support.v7.widget.StaggeredGridLayoutManager;
+import android.util.AttributeSet;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.Display;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.view.animation.Animation;
+import android.view.animation.Animation.AnimationListener;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.Transformation;
+import android.widget.AbsListView;
+import android.widget.RelativeLayout;
+import android.widget.ScrollView;
+
+/**
+ * @Author Zheng Haibo
+ * @PersonalWebsite http://www.mobctrl.net
+ * @Description 自定义CustomeSwipeRefreshLayout<br>
+ * 支持下拉刷新和上拉加载更多<br>
+ * 非侵入式,对原来的ListView、RecyclerView没有任何影响,用法和SwipeRefreshLayout类似。<br>
+ * 可自定义头部View的样式,调用setHeaderView方法即可 <br>
+ * 可自定义页尾View的样式,调用setFooterView方法即可 <br>
+ * 支持RecyclerView,ListView,ScrollView,GridView等等。<br>
+ * 被包含的View(RecyclerView,ListView etc.)可跟随手指的滑动而滑动<br>
+ * 默认是跟随手指的滑动而滑动,也可以设置为不跟随:setTargetScrollWithLayout(false) 回调方法更多<br>
+ * 比如:onRefresh() onPullDistance(int distance)和onPullEnable(boolean
+ * enable)<br>
+ * 开发人员可以根据下拉过程中distance的值做一系列动画。 <br>
+ */
+@SuppressLint("ClickableViewAccessibility")
+public class SuperSwipeRefreshLayout extends ViewGroup {
+    private static final String LOG_TAG = "CustomeSwipeRefreshLayout";
+    private static final int HEADER_VIEW_HEIGHT = 50;// HeaderView height (dp)
+
+    private static final float DECELERATE_INTERPOLATION_FACTOR = 2f;
+    private static final int INVALID_POINTER = -1;
+    private static final float DRAG_RATE = .5f;
+
+    private static final int SCALE_DOWN_DURATION = 150;
+    private static final int ANIMATE_TO_TRIGGER_DURATION = 200;
+    private static final int ANIMATE_TO_START_DURATION = 200;
+    private static final int DEFAULT_CIRCLE_TARGET = 64;
+
+    // SuperSwipeRefreshLayout内的目标View,比如RecyclerView,ListView,ScrollView,GridView
+    // etc.
+    private View mTarget;
+
+    private OnPullRefreshListener mListener;// 下拉刷新listener
+    private OnPushLoadMoreListener mOnPushLoadMoreListener;// 上拉加载更多
+
+    private boolean mRefreshing = false;
+    private boolean mLoadMore = false;
+    private int mTouchSlop;
+    private float mTotalDragDistance = -1;
+    private int mMediumAnimationDuration;
+    private int mCurrentTargetOffsetTop;
+    private boolean mOriginalOffsetCalculated = false;
+
+    private float mInitialMotionY;
+    private boolean mIsBeingDragged;
+    private int mActivePointerId = INVALID_POINTER;
+    private boolean mScale;
+
+    private boolean mReturningToStart;
+    private final DecelerateInterpolator mDecelerateInterpolator;
+    private static final int[] LAYOUT_ATTRS = new int[]{android.R.attr.enabled};
+
+    private HeadViewContainer mHeadViewContainer;
+    private RelativeLayout mFooterViewContainer;
+    private int mHeaderViewIndex = -1;
+    private int mFooterViewIndex = -1;
+
+    protected int mFrom;
+
+    private float mStartingScale;
+
+    protected int mOriginalOffsetTop;
+
+    private Animation mScaleAnimation;
+
+    private Animation mScaleDownAnimation;
+
+    private Animation mScaleDownToStartAnimation;
+
+    // 最后停顿时的偏移量px,与DEFAULT_CIRCLE_TARGET正比
+    private float mSpinnerFinalOffset;
+
+    private boolean mNotify;
+
+    private int mHeaderViewWidth;// headerView的宽度
+
+    private int mFooterViewWidth;
+
+    private int mHeaderViewHeight;
+
+    private int mFooterViewHeight;
+
+    private boolean mUsingCustomStart;
+
+    private boolean targetScrollWithLayout = true;
+
+    private int pushDistance = 0;
+
+    private CircleProgressView defaultProgressView = null;
+
+    private boolean usingDefaultHeader = true;
+
+    private float density = 1.0f;
+
+    private boolean isProgressEnable = true;
+
+    /**
+     * 下拉时,超过距离之后,弹回来的动画监听器
+     */
+    private AnimationListener mRefreshListener = new AnimationListener() {
+        @Override
+        public void onAnimationStart(Animation animation) {
+            isProgressEnable = false;
+        }
+
+        @Override
+        public void onAnimationRepeat(Animation animation) {
+        }
+
+        @Override
+        public void onAnimationEnd(Animation animation) {
+            isProgressEnable = true;
+            if (mRefreshing) {
+                if (mNotify) {
+                    if (usingDefaultHeader) {
+                        ViewCompat.setAlpha(defaultProgressView, 1.0f);
+                        defaultProgressView.setOnDraw(true);
+                        new Thread(defaultProgressView).start();
+                    }
+                    if (mListener != null) {
+                        mListener.onRefresh();
+                    }
+                }
+            } else {
+                mHeadViewContainer.setVisibility(View.GONE);
+                if (mScale) {
+                    setAnimationProgress(0);
+                } else {
+                    setTargetOffsetTopAndBottom(mOriginalOffsetTop
+                            - mCurrentTargetOffsetTop, true);
+                }
+            }
+            mCurrentTargetOffsetTop = mHeadViewContainer.getTop();
+            updateListenerCallBack();
+        }
+    };
+
+    /**
+     * 更新回调
+     */
+    private void updateListenerCallBack() {
+        int distance = mCurrentTargetOffsetTop + mHeadViewContainer.getHeight();
+        if (mListener != null) {
+            mListener.onPullDistance(distance);
+        }
+        if (usingDefaultHeader && isProgressEnable) {
+            defaultProgressView.setPullDistance(distance);
+        }
+    }
+
+    /**
+     * 添加头布局
+     *
+     * @param child
+     */
+    public void setHeaderView(View child) {
+        if (child == null) {
+            return;
+        }
+        if (mHeadViewContainer == null) {
+            return;
+        }
+        usingDefaultHeader = false;
+        mHeadViewContainer.removeAllViews();
+        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
+                mHeaderViewWidth, mHeaderViewHeight);
+        layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
+        mHeadViewContainer.addView(child, layoutParams);
+    }
+
+    public void setFooterView(View child) {
+        if (child == null) {
+            return;
+        }
+        if (mFooterViewContainer == null) {
+            return;
+        }
+        mFooterViewContainer.removeAllViews();
+        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
+                mFooterViewWidth, mFooterViewHeight);
+        mFooterViewContainer.addView(child, layoutParams);
+    }
+
+    public SuperSwipeRefreshLayout(Context context) {
+        this(context, null);
+    }
+
+    @SuppressWarnings("deprecation")
+    public SuperSwipeRefreshLayout(Context context, AttributeSet attrs) {
+        super(context, attrs);
+
+        /**
+         * getScaledTouchSlop是一个距离,表示滑动的时候,手的移动要大于这个距离才开始移动控件。如果小于这个距离就不触发移动控件
+         */
+        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
+
+        mMediumAnimationDuration = getResources().getInteger(
+                android.R.integer.config_mediumAnimTime);
+
+        setWillNotDraw(false);
+        mDecelerateInterpolator = new DecelerateInterpolator(
+                DECELERATE_INTERPOLATION_FACTOR);
+
+        final TypedArray a = context
+                .obtainStyledAttributes(attrs, LAYOUT_ATTRS);
+        setEnabled(a.getBoolean(0, true));
+        a.recycle();
+
+        WindowManager wm = (WindowManager) context
+                .getSystemService(Context.WINDOW_SERVICE);
+        Display display = wm.getDefaultDisplay();
+        final DisplayMetrics metrics = getResources().getDisplayMetrics();
+        mHeaderViewWidth = (int) display.getWidth();
+        mFooterViewWidth = (int) display.getWidth();
+        mHeaderViewHeight = (int) (HEADER_VIEW_HEIGHT * metrics.density);
+        mFooterViewHeight = (int) (HEADER_VIEW_HEIGHT * metrics.density);
+        defaultProgressView = new CircleProgressView(getContext());
+        createHeaderViewContainer();
+        createFooterViewContainer();
+        ViewCompat.setChildrenDrawingOrderEnabled(this, true);
+        mSpinnerFinalOffset = DEFAULT_CIRCLE_TARGET * metrics.density;
+        density = metrics.density;
+        mTotalDragDistance = mSpinnerFinalOffset;
+    }
+
+    /**
+     * 孩子节点绘制的顺序
+     *
+     * @param childCount
+     * @param i
+     * @return
+     */
+    @Override
+    protected int getChildDrawingOrder(int childCount, int i) {
+        // 将新添加的View,放到最后绘制
+        if (mHeaderViewIndex < 0 && mFooterViewIndex < 0) {
+            return i;
+        }
+        if (i == childCount - 2) {
+            return mHeaderViewIndex;
+        }
+        if (i == childCount - 1) {
+            return mFooterViewIndex;
+        }
+        int bigIndex = mFooterViewIndex > mHeaderViewIndex ? mFooterViewIndex
+                : mHeaderViewIndex;
+        int smallIndex = mFooterViewIndex < mHeaderViewIndex ? mFooterViewIndex
+                : mHeaderViewIndex;
+        if (i >= smallIndex && i < bigIndex - 1) {
+            return i + 1;
+        }
+        if (i >= bigIndex || (i == bigIndex - 1)) {
+            return i + 2;
+        }
+        return i;
+    }
+
+    /**
+     * 创建头布局的容器
+     */
+    private void createHeaderViewContainer() {
+        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
+                (int) (mHeaderViewHeight * 0.8),
+                (int) (mHeaderViewHeight * 0.8));
+        layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
+        layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
+        mHeadViewContainer = new HeadViewContainer(getContext());
+        mHeadViewContainer.setVisibility(View.GONE);
+        defaultProgressView.setVisibility(View.VISIBLE);
+        defaultProgressView.setOnDraw(false);
+        mHeadViewContainer.addView(defaultProgressView, layoutParams);
+        addView(mHeadViewContainer);
+    }
+
+    /**
+     * 添加底部布局
+     */
+    private void createFooterViewContainer() {
+        mFooterViewContainer = new RelativeLayout(getContext());
+        mFooterViewContainer.setVisibility(View.GONE);
+        addView(mFooterViewContainer);
+    }
+
+    /**
+     * 设置
+     *
+     * @param listener
+     */
+    public void setOnPullRefreshListener(OnPullRefreshListener listener) {
+        mListener = listener;
+    }
+
+    public void setHeaderViewBackgroundColor(int color) {
+        mHeadViewContainer.setBackgroundColor(color);
+    }
+
+    /**
+     * 设置上拉加载更多的接口
+     *
+     * @param onPushLoadMoreListener
+     */
+    public void setOnPushLoadMoreListener(
+            OnPushLoadMoreListener onPushLoadMoreListener) {
+        this.mOnPushLoadMoreListener = onPushLoadMoreListener;
+    }
+
+    /**
+     * Notify the widget that refresh state has changed. Do not call this when
+     * refresh is triggered by a swipe gesture.
+     *
+     * @param refreshing Whether or not the view should show refresh progress.
+     */
+    public void setRefreshing(boolean refreshing) {
+        if (refreshing && mRefreshing != refreshing) {
+            // scale and show
+            mRefreshing = refreshing;
+            int endTarget = 0;
+            if (!mUsingCustomStart) {
+                endTarget = (int) (mSpinnerFinalOffset + mOriginalOffsetTop);
+            } else {
+                endTarget = (int) mSpinnerFinalOffset;
+            }
+            setTargetOffsetTopAndBottom(endTarget - mCurrentTargetOffsetTop,
+                    true /* requires update */);
+            mNotify = false;
+            startScaleUpAnimation(mRefreshListener);
+        } else {
+            setRefreshing(refreshing, false /* notify */);
+            if (usingDefaultHeader) {
+                defaultProgressView.setOnDraw(false);
+            }
+        }
+    }
+
+    private void startScaleUpAnimation(AnimationListener listener) {
+        mHeadViewContainer.setVisibility(View.VISIBLE);
+        mScaleAnimation = new Animation() {
+            @Override
+            public void applyTransformation(float interpolatedTime,
+                                            Transformation t) {
+                setAnimationProgress(interpolatedTime);
+            }
+        };
+        mScaleAnimation.setDuration(mMediumAnimationDuration);
+        if (listener != null) {
+            mHeadViewContainer.setAnimationListener(listener);
+        }
+        mHeadViewContainer.clearAnimation();
+        mHeadViewContainer.startAnimation(mScaleAnimation);
+    }
+
+    private void setAnimationProgress(float progress) {
+        if (!usingDefaultHeader) {
+            progress = 1;
+        }
+        ViewCompat.setScaleX(mHeadViewContainer, progress);
+        ViewCompat.setScaleY(mHeadViewContainer, progress);
+    }
+
+    private void setRefreshing(boolean refreshing, final boolean notify) {
+        if (mRefreshing != refreshing) {
+            mNotify = notify;
+            ensureTarget();
+            mRefreshing = refreshing;
+            if (mRefreshing) {
+                animateOffsetToCorrectPosition(mCurrentTargetOffsetTop,
+                        mRefreshListener);
+            } else {
+                startScaleDownAnimation(mRefreshListener);
+            }
+        }
+    }
+
+    private void startScaleDownAnimation(AnimationListener listener) {
+        mScaleDownAnimation = new Animation() {
+            @Override
+            public void applyTransformation(float interpolatedTime,
+                                            Transformation t) {
+                setAnimationProgress(1 - interpolatedTime);
+            }
+        };
+        mScaleDownAnimation.setDuration(SCALE_DOWN_DURATION);
+        mHeadViewContainer.setAnimationListener(listener);
+        mHeadViewContainer.clearAnimation();
+        mHeadViewContainer.startAnimation(mScaleDownAnimation);
+    }
+
+    public boolean isRefreshing() {
+        return mRefreshing;
+    }
+
+    /**
+     * 确保mTarget不为空<br>
+     * mTarget一般是可滑动的ScrollView,ListView,RecyclerView等
+     */
+    private void ensureTarget() {
+        if (mTarget == null) {
+            for (int i = 0; i < getChildCount(); i++) {
+                View child = getChildAt(i);
+                if (!child.equals(mHeadViewContainer)
+                        && !child.equals(mFooterViewContainer)) {
+                    mTarget = child;
+                    break;
+                }
+            }
+        }
+    }
+
+    /**
+     * Set the distance to trigger a sync in dips
+     *
+     * @param distance
+     */
+    public void setDistanceToTriggerSync(int distance) {
+        mTotalDragDistance = distance;
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int left, int top, int right,
+                            int bottom) {
+        final int width = getMeasuredWidth();
+        final int height = getMeasuredHeight();
+        if (getChildCount() == 0) {
+            return;
+        }
+        if (mTarget == null) {
+            ensureTarget();
+        }
+        if (mTarget == null) {
+            return;
+        }
+        int distance = mCurrentTargetOffsetTop + mHeadViewContainer.getHeight();
+        if (!targetScrollWithLayout) {
+            // 判断标志位,如果目标View不跟随手指的滑动而滑动,将下拉偏移量设置为0
+            distance = 0;
+        }
+        final View child = mTarget;
+        final int childLeft = getPaddingLeft();
+        final int childTop = getPaddingTop() + distance - pushDistance;// 根据偏移量distance更新
+        final int childWidth = width - getPaddingLeft() - getPaddingRight();
+        final int childHeight = height - getPaddingTop() - getPaddingBottom();
+        Log.d(LOG_TAG, "debug:onLayout childHeight = " + childHeight);
+        child.layout(childLeft, childTop, childLeft + childWidth, childTop
+                + childHeight);// 更新目标View的位置
+        int headViewWidth = mHeadViewContainer.getMeasuredWidth();
+        int headViewHeight = mHeadViewContainer.getMeasuredHeight();
+        mHeadViewContainer.layout((width / 2 - headViewWidth / 2),
+                mCurrentTargetOffsetTop, (width / 2 + headViewWidth / 2),
+                mCurrentTargetOffsetTop + headViewHeight);// 更新头布局的位置
+        int footViewWidth = mFooterViewContainer.getMeasuredWidth();
+        int footViewHeight = mFooterViewContainer.getMeasuredHeight();
+        mFooterViewContainer.layout((width / 2 - footViewWidth / 2), height
+                - pushDistance, (width / 2 + footViewWidth / 2), height
+                + footViewHeight - pushDistance);
+    }
+
+    @Override
+    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        if (mTarget == null) {
+            ensureTarget();
+        }
+        if (mTarget == null) {
+            return;
+        }
+        mTarget.measure(MeasureSpec.makeMeasureSpec(getMeasuredWidth()
+                        - getPaddingLeft() - getPaddingRight(), MeasureSpec.EXACTLY),
+                MeasureSpec.makeMeasureSpec(getMeasuredHeight()
+                                - getPaddingTop() - getPaddingBottom(),
+                        MeasureSpec.EXACTLY));
+        mHeadViewContainer.measure(MeasureSpec.makeMeasureSpec(
+                mHeaderViewWidth, MeasureSpec.EXACTLY), MeasureSpec
+                .makeMeasureSpec(3 * mHeaderViewHeight, MeasureSpec.EXACTLY));
+        mFooterViewContainer.measure(MeasureSpec.makeMeasureSpec(
+                mFooterViewWidth, MeasureSpec.EXACTLY), MeasureSpec
+                .makeMeasureSpec(mFooterViewHeight, MeasureSpec.EXACTLY));
+        if (!mUsingCustomStart && !mOriginalOffsetCalculated) {
+            mOriginalOffsetCalculated = true;
+            mCurrentTargetOffsetTop = mOriginalOffsetTop = -mHeadViewContainer
+                    .getMeasuredHeight();
+            updateListenerCallBack();
+        }
+        mHeaderViewIndex = -1;
+        for (int index = 0; index < getChildCount(); index++) {
+            if (getChildAt(index) == mHeadViewContainer) {
+                mHeaderViewIndex = index;
+                break;
+            }
+        }
+        mFooterViewIndex = -1;
+        for (int index = 0; index < getChildCount(); index++) {
+            if (getChildAt(index) == mFooterViewContainer) {
+                mFooterViewIndex = index;
+                break;
+            }
+        }
+    }
+
+    /**
+     * 判断目标View是否滑动到顶部-还能否继续滑动
+     *
+     * @return
+     */
+    public boolean isChildScrollToTop() {
+        if (Build.VERSION.SDK_INT < 14) {
+            if (mTarget instanceof AbsListView) {
+                final AbsListView absListView = (AbsListView) mTarget;
+                return !(absListView.getChildCount() > 0 && (absListView
+                        .getFirstVisiblePosition() > 0 || absListView
+                        .getChildAt(0).getTop() < absListView.getPaddingTop()));
+            } else {
+                return !(mTarget.getScrollY() > 0);
+            }
+        } else {
+            return !ViewCompat.canScrollVertically(mTarget, -1);
+        }
+    }
+
+    /**
+     * 是否滑动到底部
+     *
+     * @return
+     */
+    public boolean isChildScrollToBottom() {
+        if (isChildScrollToTop()) {
+            return false;
+        }
+        if (mTarget instanceof RecyclerView) {
+            RecyclerView recyclerView = (RecyclerView) mTarget;
+            LayoutManager layoutManager = recyclerView.getLayoutManager();
+            int count = recyclerView.getAdapter().getItemCount();
+            if (layoutManager instanceof LinearLayoutManager && count > 0) {
+                LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
+                if (linearLayoutManager.findLastCompletelyVisibleItemPosition() == count - 1) {
+                    return true;
+                }
+            } else if (layoutManager instanceof StaggeredGridLayoutManager) {
+                StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) layoutManager;
+                int[] lastItems = new int[2];
+                staggeredGridLayoutManager
+                        .findLastCompletelyVisibleItemPositions(lastItems);
+                int lastItem = Math.max(lastItems[0], lastItems[1]);
+                if (lastItem == count - 1) {
+                    return true;
+                }
+            }
+            return false;
+        } else if (mTarget instanceof AbsListView) {
+            final AbsListView absListView = (AbsListView) mTarget;
+            int count = absListView.getAdapter().getCount();
+            int fristPos = absListView.getFirstVisiblePosition();
+            if (fristPos == 0
+                    && absListView.getChildAt(0).getTop() >= absListView
+                    .getPaddingTop()) {
+                return false;
+            }
+            int lastPos = absListView.getLastVisiblePosition();
+            if (lastPos > 0 && count > 0 && lastPos == count - 1) {
+                return true;
+            }
+            return false;
+        } else if (mTarget instanceof ScrollView) {
+            ScrollView scrollView = (ScrollView) mTarget;
+            View view = (View) scrollView
+                    .getChildAt(scrollView.getChildCount() - 1);
+            if (view != null) {
+                int diff = (view.getBottom() - (scrollView.getHeight() + scrollView
+                        .getScrollY()));
+                if (diff == 0) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 主要判断是否应该拦截子View的事件<br>
+     * 如果拦截,则交给自己的OnTouchEvent处理<br>
+     * 否者,交给子View处理<br>
+     */
+    @Override
+    public boolean onInterceptTouchEvent(MotionEvent ev) {
+        ensureTarget();
+
+        final int action = MotionEventCompat.getActionMasked(ev);
+
+        if (mReturningToStart && action == MotionEvent.ACTION_DOWN) {
+            mReturningToStart = false;
+        }
+        if (!isEnabled() || mReturningToStart || mRefreshing || mLoadMore
+                || (!isChildScrollToTop() && !isChildScrollToBottom())) {
+            // 如果子View可以滑动,不拦截事件,交给子View处理-下拉刷新
+            // 或者子View没有滑动到底部不拦截事件-上拉加载更多
+            return false;
+        }
+
+        // 下拉刷新判断
+        switch (action) {
+            case MotionEvent.ACTION_DOWN:
+                setTargetOffsetTopAndBottom(
+                        mOriginalOffsetTop - mHeadViewContainer.getTop(), true);// 恢复HeaderView的初始位置
+                mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
+                mIsBeingDragged = false;
+                final float initialMotionY = getMotionEventY(ev, mActivePointerId);
+                if (initialMotionY == -1) {
+                    return false;
+                }
+                mInitialMotionY = initialMotionY;// 记录按下的位置
+
+            case MotionEvent.ACTION_MOVE:
+                if (mActivePointerId == INVALID_POINTER) {
+                    Log.e(LOG_TAG,
+                            "Got ACTION_MOVE event but don't have an active pointer id.");
+                    return false;
+                }
+
+                final float y = getMotionEventY(ev, mActivePointerId);
+                if (y == -1) {
+                    return false;
+                }
+                float yDiff = 0;
+                if (isChildScrollToBottom()) {
+                    yDiff = mInitialMotionY - y;// 计算上拉距离
+                    if (yDiff > mTouchSlop && !mIsBeingDragged) {// 判断是否下拉的距离足够
+                        mIsBeingDragged = true;// 正在上拉
+                    }
+                } else {
+                    yDiff = y - mInitialMotionY;// 计算下拉距离
+                    if (yDiff > mTouchSlop && !mIsBeingDragged) {// 判断是否下拉的距离足够
+                        mIsBeingDragged = true;// 正在下拉
+                    }
+                }
+                break;
+
+            case MotionEventCompat.ACTION_POINTER_UP:
+                onSecondaryPointerUp(ev);
+                break;
+
+            case MotionEvent.ACTION_UP:
+            case MotionEvent.ACTION_CANCEL:
+                mIsBeingDragged = false;
+                mActivePointerId = INVALID_POINTER;
+                break;
+        }
+
+        return mIsBeingDragged;// 如果正在拖动,则拦截子View的事件
+    }
+
+    private float getMotionEventY(MotionEvent ev, int activePointerId) {
+        final int index = MotionEventCompat.findPointerIndex(ev,
+                activePointerId);
+        if (index < 0) {
+            return -1;
+        }
+        return MotionEventCompat.getY(ev, index);
+    }
+
+    @Override
+    public void requestDisallowInterceptTouchEvent(boolean b) {
+        // Nope.
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent ev) {
+        final int action = MotionEventCompat.getActionMasked(ev);
+
+        if (mReturningToStart && action == MotionEvent.ACTION_DOWN) {
+            mReturningToStart = false;
+        }
+        if (!isEnabled() || mReturningToStart
+                || (!isChildScrollToTop() && !isChildScrollToBottom())) {
+            // 如果子View可以滑动,不拦截事件,交给子View处理
+            return false;
+        }
+
+        if (isChildScrollToBottom()) {// 上拉加载更多
+            return handlerPushTouchEvent(ev, action);
+        } else {// 下拉刷新
+            return handlerPullTouchEvent(ev, action);
+        }
+    }
+
+    private boolean handlerPullTouchEvent(MotionEvent ev, int action) {
+        switch (action) {
+            case MotionEvent.ACTION_DOWN:
+                mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
+                mIsBeingDragged = false;
+                break;
+
+            case MotionEvent.ACTION_MOVE: {
+                final int pointerIndex = MotionEventCompat.findPointerIndex(ev,
+                        mActivePointerId);
+                if (pointerIndex < 0) {
+                    Log.e(LOG_TAG,
+                            "Got ACTION_MOVE event but have an invalid active pointer id.");
+                    return false;
+                }
+
+                final float y = MotionEventCompat.getY(ev, pointerIndex);
+                final float overscrollTop = (y - mInitialMotionY) * DRAG_RATE;
+                if (mIsBeingDragged) {
+                    float originalDragPercent = overscrollTop / mTotalDragDistance;
+                    if (originalDragPercent < 0) {
+                        return false;
+                    }
+                    float dragPercent = Math.min(1f, Math.abs(originalDragPercent));
+                    float extraOS = Math.abs(overscrollTop) - mTotalDragDistance;
+                    float slingshotDist = mUsingCustomStart ? mSpinnerFinalOffset
+                            - mOriginalOffsetTop : mSpinnerFinalOffset;
+                    float tensionSlingshotPercent = Math.max(0,
+                            Math.min(extraOS, slingshotDist * 2) / slingshotDist);
+                    float tensionPercent = (float) ((tensionSlingshotPercent / 4) - Math
+                            .pow((tensionSlingshotPercent / 4), 2)) * 2f;
+                    float extraMove = (slingshotDist) * tensionPercent * 2;
+
+                    int targetY = mOriginalOffsetTop
+                            + (int) ((slingshotDist * dragPercent) + extraMove);
+                    if (mHeadViewContainer.getVisibility() != View.VISIBLE) {
+                        mHeadViewContainer.setVisibility(View.VISIBLE);
+                    }
+                    if (!mScale) {
+                        ViewCompat.setScaleX(mHeadViewContainer, 1f);
+                        ViewCompat.setScaleY(mHeadViewContainer, 1f);
+                    }
+                    if (usingDefaultHeader) {
+                        float alpha = overscrollTop / mTotalDragDistance;
+                        if (alpha >= 1.0f) {
+                            alpha = 1.0f;
+                        }
+                        ViewCompat.setScaleX(defaultProgressView, alpha);
+                        ViewCompat.setScaleY(defaultProgressView, alpha);
+                        ViewCompat.setAlpha(defaultProgressView, alpha);
+                    }
+                    if (overscrollTop < mTotalDragDistance) {
+                        if (mScale) {
+                            setAnimationProgress(overscrollTop / mTotalDragDistance);
+                        }
+                        if (mListener != null) {
+                            mListener.onPullEnable(false);
+                        }
+                    } else {
+                        if (mListener != null) {
+                            mListener.onPullEnable(true);
+                        }
+                    }
+                    setTargetOffsetTopAndBottom(targetY - mCurrentTargetOffsetTop,
+                            true);
+                }
+                break;
+            }
+            case MotionEventCompat.ACTION_POINTER_DOWN: {
+                final int index = MotionEventCompat.getActionIndex(ev);
+                mActivePointerId = MotionEventCompat.getPointerId(ev, index);
+                break;
+            }
+
+            case MotionEventCompat.ACTION_POINTER_UP:
+                onSecondaryPointerUp(ev);
+                break;
+
+            case MotionEvent.ACTION_UP:
+            case MotionEvent.ACTION_CANCEL: {
+                if (mActivePointerId == INVALID_POINTER) {
+                    if (action == MotionEvent.ACTION_UP) {
+                        Log.e(LOG_TAG,
+                                "Got ACTION_UP event but don't have an active pointer id.");
+                    }
+                    return false;
+                }
+                final int pointerIndex = MotionEventCompat.findPointerIndex(ev,
+                        mActivePointerId);
+                final float y = MotionEventCompat.getY(ev, pointerIndex);
+                final float overscrollTop = (y - mInitialMotionY) * DRAG_RATE;
+                mIsBeingDragged = false;
+                if (overscrollTop > mTotalDragDistance) {
+                    setRefreshing(true, true /* notify */);
+                } else {
+                    mRefreshing = false;
+                    AnimationListener listener = null;
+                    if (!mScale) {
+                        listener = new AnimationListener() {
+
+                            @Override
+                            public void onAnimationStart(Animation animation) {
+                            }
+
+                            @Override
+                            public void onAnimationEnd(Animation animation) {
+                                if (!mScale) {
+                                    startScaleDownAnimation(null);
+                                }
+                            }
+
+                            @Override
+                            public void onAnimationRepeat(Animation animation) {
+                            }
+
+                        };
+                    }
+                    animateOffsetToStartPosition(mCurrentTargetOffsetTop, listener);
+                }
+                mActivePointerId = INVALID_POINTER;
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * 处理上拉加载更多的Touch事件
+     *
+     * @param ev
+     * @param action
+     * @return
+     */
+    private boolean handlerPushTouchEvent(MotionEvent ev, int action) {
+        switch (action) {
+            case MotionEvent.ACTION_DOWN:
+                mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
+                mIsBeingDragged = false;
+                Log.d(LOG_TAG, "debug:onTouchEvent ACTION_DOWN");
+                break;
+            case MotionEvent.ACTION_MOVE: {
+                final int pointerIndex = MotionEventCompat.findPointerIndex(ev,
+                        mActivePointerId);
+                if (pointerIndex < 0) {
+                    Log.e(LOG_TAG,
+                            "Got ACTION_MOVE event but have an invalid active pointer id.");
+                    return false;
+                }
+                final float y = MotionEventCompat.getY(ev, pointerIndex);
+                final float overscrollBottom = (mInitialMotionY - y) * DRAG_RATE;
+                if (mIsBeingDragged) {
+                    pushDistance = (int) overscrollBottom;
+                    updateFooterViewPosition();
+                    if (mOnPushLoadMoreListener != null) {
+                        mOnPushLoadMoreListener
+                                .onPushEnable(pushDistance >= mFooterViewHeight);
+                    }
+                }
+                break;
+            }
+            case MotionEventCompat.ACTION_POINTER_DOWN: {
+                final int index = MotionEventCompat.getActionIndex(ev);
+                mActivePointerId = MotionEventCompat.getPointerId(ev, index);
+                break;
+            }
+
+            case MotionEventCompat.ACTION_POINTER_UP:
+                onSecondaryPointerUp(ev);
+                break;
+
+            case MotionEvent.ACTION_UP:
+            case MotionEvent.ACTION_CANCEL: {
+                if (mActivePointerId == INVALID_POINTER) {
+                    if (action == MotionEvent.ACTION_UP) {
+                        Log.e(LOG_TAG,
+                                "Got ACTION_UP event but don't have an active pointer id.");
+                    }
+                    return false;
+                }
+                final int pointerIndex = MotionEventCompat.findPointerIndex(ev,
+                        mActivePointerId);
+                final float y = MotionEventCompat.getY(ev, pointerIndex);
+                final float overscrollBottom = (mInitialMotionY - y) * DRAG_RATE;// 松手是下拉的距离
+                mIsBeingDragged = false;
+                mActivePointerId = INVALID_POINTER;
+                if (overscrollBottom < mFooterViewHeight
+                        || mOnPushLoadMoreListener == null) {// 直接取消
+                    pushDistance = 0;
+                } else {// 下拉到mFooterViewHeight
+                    pushDistance = mFooterViewHeight;
+                }
+                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
+                    updateFooterViewPosition();
+                    if (pushDistance == mFooterViewHeight
+                            && mOnPushLoadMoreListener != null) {
+                        mLoadMore = true;
+                        mOnPushLoadMoreListener.onLoadMore();
+                    }
+                } else {
+                    animatorFooterToBottom((int) overscrollBottom, pushDistance);
+                }
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * 松手之后,使用动画将Footer从距离start变化到end
+     *
+     * @param start
+     * @param end
+     */
+    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+    private void animatorFooterToBottom(int start, final int end) {
+        ValueAnimator valueAnimator = ValueAnimator.ofInt(start, end);
+        valueAnimator.setDuration(150);
+        valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
+
+            @Override
+            public void onAnimationUpdate(ValueAnimator valueAnimator) {
+                // update
+                pushDistance = (Integer) valueAnimator.getAnimatedValue();
+                updateFooterViewPosition();
+            }
+        });
+        valueAnimator.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                if (end > 0 && mOnPushLoadMoreListener != null) {
+                    // start loading more
+                    mLoadMore = true;
+                    mOnPushLoadMoreListener.onLoadMore();
+                } else {
+                    resetTargetLayout();
+                    mLoadMore = false;
+                }
+            }
+        });
+        valueAnimator.setInterpolator(mDecelerateInterpolator);
+        valueAnimator.start();
+    }
+
+    /**
+     * 设置停止加载
+     *
+     * @param loadMore
+     */
+    public void setLoadMore(boolean loadMore) {
+        if (!loadMore && mLoadMore) {// 停止加载
+            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
+                mLoadMore = false;
+                pushDistance = 0;
+                updateFooterViewPosition();
+            } else {
+                animatorFooterToBottom(mFooterViewHeight, 0);
+            }
+        }
+    }
+
+    private void animateOffsetToCorrectPosition(int from,
+                                                AnimationListener listener) {
+        mFrom = from;
+        mAnimateToCorrectPosition.reset();
+        mAnimateToCorrectPosition.setDuration(ANIMATE_TO_TRIGGER_DURATION);
+        mAnimateToCorrectPosition.setInterpolator(mDecelerateInterpolator);
+        if (listener != null) {
+            mHeadViewContainer.setAnimationListener(listener);
+        }
+        mHeadViewContainer.clearAnimation();
+        mHeadViewContainer.startAnimation(mAnimateToCorrectPosition);
+    }
+
+    private void animateOffsetToStartPosition(int from,
+                                              AnimationListener listener) {
+        if (mScale) {
+            startScaleDownReturnToStartAnimation(from, listener);
+        } else {
+            mFrom = from;
+            mAnimateToStartPosition.reset();
+            mAnimateToStartPosition.setDuration(ANIMATE_TO_START_DURATION);
+            mAnimateToStartPosition.setInterpolator(mDecelerateInterpolator);
+            if (listener != null) {
+                mHeadViewContainer.setAnimationListener(listener);
+            }
+            mHeadViewContainer.clearAnimation();
+            mHeadViewContainer.startAnimation(mAnimateToStartPosition);
+        }
+        resetTargetLayoutDelay(ANIMATE_TO_START_DURATION);
+    }
+
+    /**
+     * 重置Target位置
+     *
+     * @param delay
+     */
+    public void resetTargetLayoutDelay(int delay) {
+        new Handler().postDelayed(new Runnable() {
+
+            @Override
+            public void run() {
+                resetTargetLayout();
+            }
+        }, delay);
+    }
+
+    /**
+     * 重置Target的位置
+     */
+    public void resetTargetLayout() {
+        final int width = getMeasuredWidth();
+        final int height = getMeasuredHeight();
+        final View child = mTarget;
+        final int childLeft = getPaddingLeft();
+        final int childTop = getPaddingTop();
+        final int childWidth = child.getWidth() - getPaddingLeft()
+                - getPaddingRight();
+        final int childHeight = child.getHeight() - getPaddingTop()
+                - getPaddingBottom();
+        child.layout(childLeft, childTop, childLeft + childWidth, childTop
+                + childHeight);
+
+        int headViewWidth = mHeadViewContainer.getMeasuredWidth();
+        int headViewHeight = mHeadViewContainer.getMeasuredHeight();
+        mHeadViewContainer.layout((width / 2 - headViewWidth / 2),
+                -headViewHeight, (width / 2 + headViewWidth / 2), 0);// 更新头布局的位置
+        int footViewWidth = mFooterViewContainer.getMeasuredWidth();
+        int footViewHeight = mFooterViewContainer.getMeasuredHeight();
+        mFooterViewContainer.layout((width / 2 - footViewWidth / 2), height,
+                (width / 2 + footViewWidth / 2), height + footViewHeight);
+    }
+
+    private final Animation mAnimateToCorrectPosition = new Animation() {
+        @Override
+        public void applyTransformation(float interpolatedTime, Transformation t) {
+            int targetTop = 0;
+            int endTarget = 0;
+            if (!mUsingCustomStart) {
+                endTarget = (int) (mSpinnerFinalOffset - Math
+                        .abs(mOriginalOffsetTop));
+            } else {
+                endTarget = (int) mSpinnerFinalOffset;
+            }
+            targetTop = (mFrom + (int) ((endTarget - mFrom) * interpolatedTime));
+            int offset = targetTop - mHeadViewContainer.getTop();
+            setTargetOffsetTopAndBottom(offset, false /* requires update */);
+        }
+
+        @Override
+        public void setAnimationListener(AnimationListener listener) {
+            super.setAnimationListener(listener);
+        }
+    };
+
+    private void moveToStart(float interpolatedTime) {
+        int targetTop = 0;
+        targetTop = (mFrom + (int) ((mOriginalOffsetTop - mFrom) * interpolatedTime));
+        int offset = targetTop - mHeadViewContainer.getTop();
+        setTargetOffsetTopAndBottom(offset, false /* requires update */);
+    }
+
+    private final Animation mAnimateToStartPosition = new Animation() {
+        @Override
+        public void applyTransformation(float interpolatedTime, Transformation t) {
+            moveToStart(interpolatedTime);
+        }
+    };
+
+    private void startScaleDownReturnToStartAnimation(int from,
+                                                      AnimationListener listener) {
+        mFrom = from;
+        mStartingScale = ViewCompat.getScaleX(mHeadViewContainer);
+        mScaleDownToStartAnimation = new Animation() {
+            @Override
+            public void applyTransformation(float interpolatedTime,
+                                            Transformation t) {
+                float targetScale = (mStartingScale + (-mStartingScale * interpolatedTime));
+                setAnimationProgress(targetScale);
+                moveToStart(interpolatedTime);
+            }
+        };
+        mScaleDownToStartAnimation.setDuration(SCALE_DOWN_DURATION);
+        if (listener != null) {
+            mHeadViewContainer.setAnimationListener(listener);
+        }
+        mHeadViewContainer.clearAnimation();
+        mHeadViewContainer.startAnimation(mScaleDownToStartAnimation);
+    }
+
+    private void setTargetOffsetTopAndBottom(int offset, boolean requiresUpdate) {
+        mHeadViewContainer.bringToFront();
+        mHeadViewContainer.offsetTopAndBottom(offset);
+        mCurrentTargetOffsetTop = mHeadViewContainer.getTop();
+        if (requiresUpdate && Build.VERSION.SDK_INT < 11) {
+            invalidate();
+        }
+        updateListenerCallBack();
+    }
+
+    /**
+     * 修改底部布局的位置-敏感pushDistance
+     */
+    private void updateFooterViewPosition() {
+        mFooterViewContainer.setVisibility(View.VISIBLE);
+        mFooterViewContainer.bringToFront();
+        mFooterViewContainer.offsetTopAndBottom(-pushDistance);
+        updatePushDistanceListener();
+    }
+
+    private void updatePushDistanceListener() {
+        if (mOnPushLoadMoreListener != null) {
+            mOnPushLoadMoreListener.onPushDistance(pushDistance);
+        }
+    }
+
+    private void onSecondaryPointerUp(MotionEvent ev) {
+        final int pointerIndex = MotionEventCompat.getActionIndex(ev);
+        final int pointerId = MotionEventCompat.getPointerId(ev, pointerIndex);
+        if (pointerId == mActivePointerId) {
+            final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
+            mActivePointerId = MotionEventCompat.getPointerId(ev,
+                    newPointerIndex);
+        }
+    }
+
+    /**
+     * @Description 下拉刷新布局头部的容器
+     */
+    private class HeadViewContainer extends RelativeLayout {
+
+        private AnimationListener mListener;
+
+        public HeadViewContainer(Context context) {
+            super(context);
+        }
+
+        public void setAnimationListener(AnimationListener listener) {
+            mListener = listener;
+        }
+
+        @Override
+        public void onAnimationStart() {
+            super.onAnimationStart();
+            if (mListener != null) {
+                mListener.onAnimationStart(getAnimation());
+            }
+        }
+
+        @Override
+        public void onAnimationEnd() {
+            super.onAnimationEnd();
+            if (mListener != null) {
+                mListener.onAnimationEnd(getAnimation());
+            }
+        }
+    }
+
+    /**
+     * 判断子View是否跟随手指的滑动而滑动,默认跟随
+     *
+     * @return
+     */
+    public boolean isTargetScrollWithLayout() {
+        return targetScrollWithLayout;
+    }
+
+    /**
+     * 设置子View是否跟谁手指的滑动而滑动
+     *
+     * @param targetScrollWithLayout
+     */
+    public void setTargetScrollWithLayout(boolean targetScrollWithLayout) {
+        this.targetScrollWithLayout = targetScrollWithLayout;
+    }
+
+    /**
+     * 下拉刷新回调
+     */
+    public interface OnPullRefreshListener {
+        public void onRefresh();
+
+        public void onPullDistance(int distance);
+
+        public void onPullEnable(boolean enable);
+    }
+
+    /**
+     * 上拉加载更多
+     */
+    public interface OnPushLoadMoreListener {
+        public void onLoadMore();
+
+        public void onPushDistance(int distance);
+
+        public void onPushEnable(boolean enable);
+    }
+
+    /**
+     * Adapter
+     */
+    public class OnPullRefreshListenerAdapter implements OnPullRefreshListener {
+
+        @Override
+        public void onRefresh() {
+
+        }
+
+        @Override
+        public void onPullDistance(int distance) {
+
+        }
+
+        @Override
+        public void onPullEnable(boolean enable) {
+
+        }
+
+    }
+
+    public class OnPushLoadMoreListenerAdapter implements
+            OnPushLoadMoreListener {
+
+        @Override
+        public void onLoadMore() {
+
+        }
+
+        @Override
+        public void onPushDistance(int distance) {
+
+        }
+
+        @Override
+        public void onPushEnable(boolean enable) {
+
+        }
+
+    }
+
+    /**
+     * 设置默认下拉刷新进度条的颜色
+     *
+     * @param color
+     */
+    public void setDefaultCircleProgressColor(int color) {
+        if (usingDefaultHeader) {
+            defaultProgressView.setProgressColor(color);
+        }
+    }
+
+    /**
+     * 设置圆圈的背景色
+     *
+     * @param color
+     */
+    public void setDefaultCircleBackgroundColor(int color) {
+        if (usingDefaultHeader) {
+            defaultProgressView.setCircleBackgroundColor(color);
+        }
+    }
+
+    public void setDefaultCircleShadowColor(int color) {
+        if (usingDefaultHeader) {
+            defaultProgressView.setShadowColor(color);
+        }
+    }
+
+    /**
+     * 默认的下拉刷新样式
+     */
+    public class CircleProgressView extends View implements Runnable {
+
+        private static final int PEROID = 16;// 绘制周期
+        private Paint progressPaint;
+        private Paint bgPaint;
+        private int width;// view的高度
+        private int height;// view的宽度
+
+        private boolean isOnDraw = false;
+        private boolean isRunning = false;
+        private int startAngle = 0;
+        private int speed = 8;
+        private RectF ovalRect = null;
+        private RectF bgRect = null;
+        private int swipeAngle;
+        private int progressColor = 0xffcccccc;
+        private int circleBackgroundColor = 0xffffffff;
+        private int shadowColor = 0xff999999;
+
+        public CircleProgressView(Context context) {
+            super(context);
+        }
+
+        public CircleProgressView(Context context, AttributeSet attrs) {
+            super(context, attrs);
+        }
+
+        public CircleProgressView(Context context, AttributeSet attrs,
+                                  int defStyleAttr) {
+            super(context, attrs, defStyleAttr);
+        }
+
+        @Override
+        protected void onDraw(Canvas canvas) {
+            super.onDraw(canvas);
+            canvas.drawArc(getBgRect(), 0, 360, false, createBgPaint());
+            int index = startAngle / 360;
+            if (index % 2 == 0) {
+                swipeAngle = (startAngle % 720) / 2;
+            } else {
+                swipeAngle = 360 - (startAngle % 720) / 2;
+            }
+            canvas.drawArc(getOvalRect(), startAngle, swipeAngle, false,
+                    createPaint());
+        }
+
+        private RectF getBgRect() {
+            width = getWidth();
+            height = getHeight();
+            if (bgRect == null) {
+                int offset = (int) (density * 2);
+                bgRect = new RectF(offset, offset, width - offset, height
+                        - offset);
+            }
+            return bgRect;
+        }
+
+        private RectF getOvalRect() {
+            width = getWidth();
+            height = getHeight();
+            if (ovalRect == null) {
+                int offset = (int) (density * 8);
+                ovalRect = new RectF(offset, offset, width - offset, height
+                        - offset);
+            }
+            return ovalRect;
+        }
+
+        public void setProgressColor(int progressColor) {
+            this.progressColor = progressColor;
+        }
+
+        public void setCircleBackgroundColor(int circleBackgroundColor) {
+            this.circleBackgroundColor = circleBackgroundColor;
+        }
+
+        public void setShadowColor(int shadowColor) {
+            this.shadowColor = shadowColor;
+        }
+
+        /**
+         * 根据画笔的颜色,创建画笔
+         *
+         * @return
+         */
+        private Paint createPaint() {
+            if (this.progressPaint == null) {
+                progressPaint = new Paint();
+                progressPaint.setStrokeWidth((int) (density * 3));
+                progressPaint.setStyle(Paint.Style.STROKE);
+                progressPaint.setAntiAlias(true);
+            }
+            progressPaint.setColor(progressColor);
+            return progressPaint;
+        }
+
+        private Paint createBgPaint() {
+            if (this.bgPaint == null) {
+                bgPaint = new Paint();
+                bgPaint.setColor(circleBackgroundColor);
+                bgPaint.setStyle(Paint.Style.FILL);
+                bgPaint.setAntiAlias(true);
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+                    this.setLayerType(LAYER_TYPE_SOFTWARE, bgPaint);
+                }
+                bgPaint.setShadowLayer(4.0f, 0.0f, 2.0f, shadowColor);
+            }
+            return bgPaint;
+        }
+
+        public void setPullDistance(int distance) {
+            this.startAngle = distance * 2;
+            postInvalidate();
+        }
+
+        @Override
+        public void run() {
+            while (isOnDraw) {
+                isRunning = true;
+                long startTime = System.currentTimeMillis();
+                startAngle += speed;
+                postInvalidate();
+                long time = System.currentTimeMillis() - startTime;
+                if (time < PEROID) {
+                    try {
+                        Thread.sleep(PEROID - time);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }
+
+        public void setOnDraw(boolean isOnDraw) {
+            this.isOnDraw = isOnDraw;
+        }
+
+        public void setSpeed(int speed) {
+            this.speed = speed;
+        }
+
+        public boolean isRunning() {
+            return isRunning;
+        }
+
+        @Override
+        public void onWindowFocusChanged(boolean hasWindowFocus) {
+            super.onWindowFocusChanged(hasWindowFocus);
+        }
+
+        @Override
+        protected void onDetachedFromWindow() {
+            isOnDraw = false;
+            super.onDetachedFromWindow();
+        }
+
+    }
+
+}

BIN
WeiChat/src/main/res/drawable-xhdpi/gif1.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif10.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif11.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif12.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif13.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif14.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif15.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif16.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif2.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif3.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif4.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif5.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif6.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif7.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif8.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif9.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_001.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_002.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_003.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_004.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_005.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_006.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_007.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_008.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_009.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_010.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_011.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_012.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_013.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_014.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_015.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_016.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_017.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_018.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_019.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_020.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_021.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_022.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_023.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_024.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_025.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_026.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_027.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_028.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_029.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_030.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_031.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_032.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_033.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_034.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_035.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_036.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_037.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_038.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_039.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_040.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_041.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_042.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_043.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_044.gif


BIN
WeiChat/src/main/res/drawable-xhdpi/gif_045.gif


+ 5 - 4
WeiChat/src/main/res/layout/act_staff_query_list.xml

@@ -4,7 +4,8 @@
     android:layout_height="match_parent"
     android:orientation="vertical">
 
-    <com.handmark.pulltorefresh.library.PullToRefreshScrollView xmlns:ptr="http://schemas.android.com/apk/res-auto"
+    <com.xzjmyk.pm.activity.view.SuperSwipeRefreshLayout
+        xmlns:ptr="http://schemas.android.com/apk/res-auto"
         android:id="@+id/refresh_top"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
@@ -58,7 +59,7 @@
                     android:background="@color/white"
                     android:clipToPadding="false"
                     android:fadingEdge="none"
-                    android:scrollbars="none"></com.xzjmyk.pm.activity.ui.erp.view.CustomerListView>
+                    android:scrollbars="none"/>
 
                 <View
                     android:layout_width="1dp"
@@ -70,10 +71,10 @@
                     android:layout_width="0dp"
                     android:layout_height="match_parent"
                     android:layout_weight="5"
-                    android:scrollbars="none"></com.xzjmyk.pm.activity.ui.erp.view.CustomerListView>
+                    android:scrollbars="none"/>
             </LinearLayout>
         </LinearLayout>
-    </com.handmark.pulltorefresh.library.PullToRefreshScrollView>
+    </com.xzjmyk.pm.activity.view.SuperSwipeRefreshLayout>
 
     <include layout="@layout/erp_empty_view" />
 </LinearLayout>

+ 80 - 0
WeiChat/src/main/res/layout/activity_company.xml

@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:ptr="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <android.support.v4.widget.SwipeRefreshLayout
+        android:id="@+id/refresh_top"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:fillViewport="true"
+        ptr:ptrAnimationStyle="flip">
+
+        <LinearLayout
+            android:id="@+id/ll_content"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+
+            <HorizontalScrollView
+                android:id="@+id/hv_head_view"
+                android:layout_width="fill_parent"
+                android:layout_height="40dip"
+                android:background="#F2F2F2"
+                android:fadingEdge="none"
+                android:scrollbars="none">
+
+                <RelativeLayout
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:layout_gravity="top">
+
+                    <RadioGroup
+                        android:id="@+id/rg_nav_content"
+                        android:layout_width="match_parent"
+                        android:layout_height="40dip"
+                        android:background="#F2F2F2"
+                        android:orientation="horizontal"/>
+                </RelativeLayout>
+            </HorizontalScrollView>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="1dp"
+                android:background="@color/yellow_home" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:orientation="horizontal"
+                android:weightSum="7">
+
+                <com.xzjmyk.pm.activity.ui.erp.view.CustomerListView
+                    android:id="@+id/lv_saff_list"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="2"
+                    android:background="@color/white"
+                    android:clipToPadding="false"
+                    android:fadingEdge="none"
+                    android:scrollbars="none" />
+
+                <View
+                    android:layout_width="1dp"
+                    android:layout_height="match_parent"
+                    android:background="@color/yellow_home" />
+
+                <com.xzjmyk.pm.activity.ui.erp.view.CustomerListView
+                    android:id="@+id/lv_left_list"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="5"
+                    android:scrollbars="none" />
+            </LinearLayout>
+        </LinearLayout>
+    </android.support.v4.widget.SwipeRefreshLayout>
+
+    <include layout="@layout/erp_empty_view" />
+</LinearLayout>

+ 33 - 0
WeiChat/src/main/res/layout/head_view.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/head_container"
+    android:layout_width="match_parent"
+    android:layout_height="60dp" >
+
+    <TextView
+        android:id="@+id/text_view"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerInParent="true"
+        android:gravity="center"
+        android:padding="10dp"
+        android:text="Loading" />
+
+    <ProgressBar
+        android:id="@+id/pb_view"
+        android:layout_width="20dp"
+        android:layout_height="20dp"
+        android:layout_centerVertical="true"
+        android:layout_toLeftOf="@id/text_view"
+        android:layout_toStartOf="@id/text_view" />
+
+    <ImageView
+        android:id="@+id/image_view"
+        android:layout_width="20dp"
+        android:layout_height="20dp"
+        android:layout_centerVertical="true"
+        android:layout_toLeftOf="@id/text_view"
+        android:layout_toStartOf="@id/text_view"
+        android:contentDescription="@null" />
+
+</RelativeLayout>

+ 2 - 2
WeiChat/src/main/res/values/dimens.xml

@@ -24,8 +24,8 @@
     <dimen name="emotion_height">180dp</dimen>
     <dimen name="padding">8dp</dimen>
     <dimen name="pmsg_media_view_height">255dp</dimen>
-<dimen name="list_padding">0dp</dimen>
-	<dimen name="list_item_padding">16dp</dimen>
+    <dimen name="list_padding">0dp</dimen>
+    <dimen name="list_item_padding">16dp</dimen>
     <!-- Default screen margins, per the Android Design guidelines. -->
     <dimen name="activity_horizontal_margin">16dp</dimen>
     <dimen name="activity_vertical_margin">16dp</dimen>

+ 2 - 2
WeiChat/src/main/res/values/strings.xml

@@ -335,9 +335,9 @@
     <string name="failed_to_open_camera_2">相机可能正在被</string>
     <string name="failed_to_open_camera_3">其他应用占用?</string>
 
-    
+
     <string name="chooser_title">选择发送文件</string>
-     <string name="empty_directory">Empty Directory</string>
+    <string name="empty_directory">Empty Directory</string>
     <string name="storage_removed">Storage was removed or unmounted.</string>
     <string name="choose_file">Select a file</string>
     <string name="error_selecting_file">Error selecting File</string>