Browse Source

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

# Conflicts:
#	app_modular/appcontact/src/main/java/com/uas/appcontact/adapter/ContactsAdapter.java
Bitliker 8 years ago
parent
commit
ca38bcb1c4
56 changed files with 1914 additions and 37 deletions
  1. 14 20
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/net/ViewUtil.java
  2. 1 0
      app_core/common/build.gradle
  3. 1 1
      app_core/common/src/main/res/values/styles.xml
  4. 3 2
      app_modular/appmessages/src/main/java/com/modular/appmessages/activity/UUHelperActivity.java
  5. 1 1
      app_modular/appmessages/src/main/java/com/modular/appmessages/adapter/UUHelperAdapter.java
  6. 2 1
      app_modular/appmessages/src/main/res/layout/activity_uuhelper.xml
  7. 1 1
      app_modular/appmessages/src/main/res/layout/activity_uuhelper_details.xml
  8. 9 9
      app_modular/appmessages/src/main/res/layout/item_uuhelper_single.xml
  9. 1 0
      app_third/recyclerlibrary/.gitignore
  10. 24 0
      app_third/recyclerlibrary/build.gradle
  11. 25 0
      app_third/recyclerlibrary/proguard-rules.pro
  12. 10 0
      app_third/recyclerlibrary/src/main/AndroidManifest.xml
  13. 3 0
      app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/REMAIN.md
  14. 65 0
      app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/adapter/BaseRecycAdapter.java
  15. 63 0
      app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/listener/OnRecyclerClickLister.java
  16. 50 0
      app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/listener/OnRecyclerItemClickListener.java
  17. 51 0
      app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/listener/OnRecyclerLongItemClickLister.java
  18. 90 0
      app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/model/BaseModel.java
  19. 521 0
      app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/ui/refresh/BaseRefreshLayout.java
  20. 36 0
      app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/ui/refresh/BaseRefreshView.java
  21. 56 0
      app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/ui/refresh/simlpe/SimpleRefreshFooter.java
  22. 57 0
      app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/ui/refresh/simlpe/SimpleRefreshHeader.java
  23. 30 0
      app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/ui/refresh/simlpe/SimpleRefreshLayout.java
  24. 156 0
      app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/ui/refresh/smart/EatBeanLoadingView.java
  25. 283 0
      app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/ui/refresh/smart/GhostLoadingView.java
  26. 61 0
      app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/ui/refresh/smart/SmartRefreshFooter.java
  27. 61 0
      app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/ui/refresh/smart/SmartRefreshHeader.java
  28. 29 0
      app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/ui/refresh/smart/SmartRefreshLayout.java
  29. BIN
      app_third/recyclerlibrary/src/main/res/drawable-hdpi/loading_01.png
  30. BIN
      app_third/recyclerlibrary/src/main/res/drawable-hdpi/loading_02.png
  31. BIN
      app_third/recyclerlibrary/src/main/res/drawable-hdpi/loading_03.png
  32. BIN
      app_third/recyclerlibrary/src/main/res/drawable-hdpi/loading_04.png
  33. BIN
      app_third/recyclerlibrary/src/main/res/drawable-hdpi/loading_05.png
  34. BIN
      app_third/recyclerlibrary/src/main/res/drawable-hdpi/loading_06.png
  35. BIN
      app_third/recyclerlibrary/src/main/res/drawable-hdpi/loading_07.png
  36. BIN
      app_third/recyclerlibrary/src/main/res/drawable-hdpi/loading_08.png
  37. BIN
      app_third/recyclerlibrary/src/main/res/drawable-hdpi/loading_09.png
  38. BIN
      app_third/recyclerlibrary/src/main/res/drawable-hdpi/loading_10.png
  39. BIN
      app_third/recyclerlibrary/src/main/res/drawable-hdpi/loading_11.png
  40. BIN
      app_third/recyclerlibrary/src/main/res/drawable-hdpi/loading_12.png
  41. BIN
      app_third/recyclerlibrary/src/main/res/drawable-hdpi/pull_down.png
  42. BIN
      app_third/recyclerlibrary/src/main/res/drawable-hdpi/pull_up.png
  43. BIN
      app_third/recyclerlibrary/src/main/res/drawable-xhdpi/pull_down.png
  44. BIN
      app_third/recyclerlibrary/src/main/res/drawable-xhdpi/pull_up.png
  45. BIN
      app_third/recyclerlibrary/src/main/res/drawable-xxhdpi/pull_down.png
  46. BIN
      app_third/recyclerlibrary/src/main/res/drawable-xxhdpi/pull_up.png
  47. 40 0
      app_third/recyclerlibrary/src/main/res/drawable/progress_round.xml
  48. 28 0
      app_third/recyclerlibrary/src/main/res/layout/refresh_footer.xml
  49. 34 0
      app_third/recyclerlibrary/src/main/res/layout/refresh_header.xml
  50. 36 0
      app_third/recyclerlibrary/src/main/res/layout/refresh_smart_footer.xml
  51. 38 0
      app_third/recyclerlibrary/src/main/res/layout/refresh_smart_header.xml
  52. 10 0
      app_third/recyclerlibrary/src/main/res/values/attr.xml
  53. 4 0
      app_third/recyclerlibrary/src/main/res/values/color.xml
  54. 6 0
      app_third/recyclerlibrary/src/main/res/values/dimens.xml
  55. 10 0
      app_third/recyclerlibrary/src/main/res/values/strings.xml
  56. 4 2
      settings.gradle

+ 14 - 20
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/net/ViewUtil.java

@@ -48,7 +48,6 @@ import java.util.List;
 import java.util.Map;
 
 
-
 /**
  * @author :LiuJie 时间: 2015年4月27日 上午11:30:17
  * @注释:UI公共方法类 全局登录
@@ -69,16 +68,12 @@ public class ViewUtil {
     private static List<LoginEntity> erpEntities;
     private static boolean hasErp = true;//是否有erp
 
- 
-
-
     private static String oldMsg;
     private static long time;
     private static String oldMsg2;
     private static long time2;
 
 
-
     public static Crouton crouton;
 
     /**
@@ -307,17 +302,17 @@ public class ViewUtil {
 //                showDialogCompany(CommonUtil.getSharedPreferences(ct, "loginJson"), user_phone, user_password);
 //            }
 //        } else {
-            //登录界面过来,不走缓存
-            String url = Constants.BASE_URL_LOGIN;
-            Map<String, String> params = new HashMap<String, String>();
-            params.put("user", user_phone);
-            params.put("password", user_password);
-            Message message = new Message();
-            Bundle bundle = new Bundle();
-            bundle.putString("phone", user_phone);
-            bundle.putString("password", user_password);
-            startNetThread(url, params, handler, Constants.SUCCESS_LOGIN, message,
-                    bundle, "get");
+        //登录界面过来,不走缓存
+        String url = Constants.BASE_URL_LOGIN;
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("user", user_phone);
+        params.put("password", user_password);
+        Message message = new Message();
+        Bundle bundle = new Bundle();
+        bundle.putString("phone", user_phone);
+        bundle.putString("password", user_password);
+        startNetThread(url, params, handler, Constants.SUCCESS_LOGIN, message,
+                bundle, "get");
 //        }
 
     }
@@ -474,7 +469,7 @@ public class ViewUtil {
         if (ct instanceof Activity) {
 //            if (!StringUtil.isEmpty(CommonUtil.getSharedPreferences(MyApplication.getInstance(),"erp_baseurl"))){
 //            }else{
-                ct.startActivity(new Intent("com.modular.main.DataDownloadActivity"));
+            ct.startActivity(new Intent("com.modular.main.DataDownloadActivity"));
 //            }
         }
         if (isBrodcast)
@@ -512,8 +507,8 @@ public class ViewUtil {
         }, 1500);
         if (!hasErp) {
             if (ct instanceof Activity) {
-                if (!StringUtil.isEmpty(CommonUtil.getSharedPreferences(MyApplication.getInstance(),"erp_baseurl"))){
-                }else{
+                if (!StringUtil.isEmpty(CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_baseurl"))) {
+                } else {
                     ct.startActivity(new Intent("com.modular.main.DataDownloadActivity"));
                 }
             }
@@ -955,7 +950,6 @@ public class ViewUtil {
     }
 
 
-    
     public static void clearAccount(Context ct) {
         CommonUtil.clearSharedPreferences(ct, "erp_baseurl");
         CommonUtil.clearSharedPreferences(ct, "erp_master");

+ 1 - 0
app_core/common/build.gradle

@@ -48,5 +48,6 @@ dependencies {
     compile project(':library-viewpager-indicator')
     compile project(':lib-zxing')
     compile project(':library-refreshlayout')
+    compile project(':recyclerlibrary')
 
 }

+ 1 - 1
app_core/common/src/main/res/values/styles.xml

@@ -1198,7 +1198,7 @@
         <item name="android:lines">1</item>
         <item name="android:gravity">center</item>
         <item name="android:textColor">@color/titleBlue</item>
-        <item name="android:textSize">@dimen/BigTextSize</item>
+        <item name="android:textSize">@dimen/text_main</item>
     </style>
 
     <style name="approvalStyle">

+ 3 - 2
app_modular/appmessages/src/main/java/com/modular/appmessages/activity/UUHelperActivity.java

@@ -31,7 +31,6 @@ public class UUHelperActivity extends BaseActivity implements View.OnClickListen
 
     private RecyclerView contentRV;
     private UUHelperAdapter mAdapter;
-
     private BroadcastReceiver updateReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -107,7 +106,7 @@ public class UUHelperActivity extends BaseActivity implements View.OnClickListen
             IntentUtils.linkCommonWeb(ct, url, "关于优软", null, null);
         } else if (id == R.id.experienceTV) {
             url = "http://113.105.74.140:8080/new/";
-            IntentUtils.linkCommonWeb(ct, url, "功能介绍", null, null);
+            IntentUtils.linkCommonWeb(ct, url, "功能介绍", null, null);
         } else if (id == R.id.serviceTV) {
             CommonUtil.setSharedPreferences(this, Constants.SET_CALL, true);
             Intent intent = new Intent("com.modular.main.FeedbackActivity");
@@ -115,6 +114,8 @@ public class UUHelperActivity extends BaseActivity implements View.OnClickListen
             intent.putExtra(AppConstant.EXTRA_URL, mConfig.help_url);
             intent.putExtra(AppConstant.EXTRA_TITLE, "用户反馈");
             startActivity(intent);
+        } else if (R.id.inputImg == id) {
+
         }
     }
 

+ 1 - 1
app_modular/appmessages/src/main/java/com/modular/appmessages/adapter/UUHelperAdapter.java

@@ -94,7 +94,7 @@ public class UUHelperAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
         holder.timeTV.setText(model.getDate());
         holder.titleTV.setText(model.getTitle());
         holder.contentTV.setText(model.getContent());
-        ImageLoader.getInstance().displayImage(model.getIconUrl(), holder.imageIV);
+        ImageLoader.getInstance().displayImage(model.getImageUrl(), holder.imageIV);
         holder.itemView.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {

+ 2 - 1
app_modular/appmessages/src/main/res/layout/activity_uuhelper.xml

@@ -16,6 +16,7 @@
         android:padding="10dp">
 
         <ImageView
+            android:id="@+id/inputImg"
             android:layout_width="0dp"
             android:layout_height="wrap_content"
             android:layout_weight="2"
@@ -41,7 +42,7 @@
             style="@style/bottomTextStyle"
             android:layout_weight="5"
             android:background="@color/white"
-            android:text="功能介绍"
+            android:text="功能介绍"
             android:textColor="@drawable/bg_bule_yellow_text" />
 
         <View

+ 1 - 1
app_modular/appmessages/src/main/res/layout/activity_uuhelper_details.xml

@@ -51,7 +51,7 @@
         android:layout_marginLeft="10dp"
         android:layout_toRightOf="@id/tagTV"
         android:gravity="center_vertical"
-        android:text="UU 助手,您身边的移动办公小帮手。在这里,您可以查看CRM、OA等消息通知,还可以了解UU互联的最新动态哦,我们还提供人工智能客户,UU助手随时等候主任的吩咐哦!"
+        android:text="UU 助手,您身边的移动办公小帮手。在这里,您可以查看CRM、OA等消息通知,还可以了解UU互联的最新动态哦,我们还提供人工智能客户,UU助手随时等候主任的吩咐哦!"
         android:textColor="@color/text_main"
         android:textSize="16sp" />
 

+ 9 - 9
app_modular/appmessages/src/main/res/layout/item_uuhelper_single.xml

@@ -2,26 +2,26 @@
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:layout_marginLeft="20dp"
-    android:layout_marginRight="20dp">
+    android:layout_marginLeft="25dp"
+    android:layout_marginRight="25dp">
 
     <TextView
         android:id="@+id/timeTV"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_centerHorizontal="true"
-        android:layout_marginBottom="8dp"
-        android:layout_marginTop="10dp"
+        android:layout_marginBottom="10dp"
+        android:layout_marginTop="15dp"
         android:background="@drawable/text_hint_bg"
         android:text="2017-11-11"
         android:textColor="@color/white"
-        android:textSize="@dimen/text_main" />
+        android:textSize="@dimen/text_min" />
 
     <RelativeLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_below="@id/timeTV"
-        android:background="@color/white"
+        android:background="@drawable/rl_circular_bg"
         android:paddingLeft="10dp"
         android:paddingRight="10dp">
 
@@ -34,7 +34,7 @@
             android:paddingBottom="5dp"
             android:paddingTop="5dp"
             android:text="titleTV"
-            android:textColor="@color/text_main"
+            android:textColor="@color/black"
             android:textSize="@dimen/text_main" />
 
         <ImageView
@@ -69,13 +69,13 @@
         <TextView
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
+            android:layout_below="@+id/line"
+            android:drawableRight="@drawable/oa_next"
             android:ellipsize="end"
             android:lines="1"
             android:paddingBottom="8dp"
             android:paddingTop="8dp"
             android:text="阅读全文"
-            android:layout_below="@+id/line"
-            android:drawableRight="@drawable/oa_next"
             android:textColor="@color/text_main"
             android:textSize="@dimen/text_main" />
     </RelativeLayout>

+ 1 - 0
app_third/recyclerlibrary/.gitignore

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

+ 24 - 0
app_third/recyclerlibrary/build.gradle

@@ -0,0 +1,24 @@
+apply plugin: 'com.android.library'
+android {
+    compileSdkVersion rootProject.ext.android.compileSdkVersion
+    buildToolsVersion rootProject.ext.android.buildToolsVersion
+    defaultConfig {
+        minSdkVersion rootProject.ext.android.minSdkVersion
+        targetSdkVersion rootProject.ext.android.targetSdkVersion
+        versionCode rootProject.ext.android.versionCode
+        versionName rootProject.ext.android.versionName
+    }
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+    }
+}
+
+dependencies {
+    compile fileTree(include: ['*.jar'], dir: 'libs')
+    testCompile deps.junit
+    compile deps.appcompatV7
+    compile deps.recyclerviewV7
+}

+ 25 - 0
app_third/recyclerlibrary/proguard-rules.pro

@@ -0,0 +1,25 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in C:\Users\Bitliker\AppData\Local\Android\Sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile

+ 10 - 0
app_third/recyclerlibrary/src/main/AndroidManifest.xml

@@ -0,0 +1,10 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+
+    package="com.module.recyclerlibrary">
+
+    <application android:allowBackup="true" android:label="@string/app_name"
+        android:supportsRtl="true">
+
+    </application>
+
+</manifest>

+ 3 - 0
app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/REMAIN.md

@@ -0,0 +1,3 @@
+## 针对RecyclerView 的封装
+
+### refresh 封装下拉刷新和上拉加载,使用

+ 65 - 0
app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/adapter/BaseRecycAdapter.java

@@ -0,0 +1,65 @@
+package com.module.recyclerlibrary.adapter;
+
+import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.module.recyclerlibrary.model.BaseModel;
+
+import java.util.List;
+
+/**
+ * Created by Bitliker on 2017/9/19.
+ */
+
+public abstract class BaseRecycAdapter<T> extends RecyclerView.Adapter<BaseViewHolder> {
+
+    protected Context ct;
+    protected List<BaseModel<T>> datas;
+
+    public BaseRecycAdapter(Context ct) {
+        this(ct, null);
+    }
+
+    public BaseRecycAdapter(Context ct, List<BaseModel<T>> datas) {
+        if (ct == null) {
+            new NullPointerException("ct cannot be null");
+        }
+        this.ct = ct;
+        this.datas = datas;
+    }
+
+    @Override
+    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        return null;
+    }
+
+
+    @Override
+    public int getItemCount() {
+        return datas == null ? 0 : datas.size();
+    }
+
+    public abstract void onBindViewHolder(BaseViewHolder holder, int position);
+
+    public abstract void onCreateViewHolder(View view, int viewType);
+
+    private LayoutInflater mInflater;
+
+    private LayoutInflater getmInflater() {
+        return mInflater == null ? (mInflater = LayoutInflater.from(ct)) : mInflater;
+    }
+
+
+    protected abstract class ViewHodler extends RecyclerView.ViewHolder {
+        private ViewHodler(View itemView) {
+            super(itemView);
+        }
+
+        public ViewHodler(int layoutId, ViewGroup parent) {
+            this(getmInflater().inflate(layoutId, parent, false));
+        }
+    }
+}

+ 63 - 0
app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/listener/OnRecyclerClickLister.java

@@ -0,0 +1,63 @@
+package com.module.recyclerlibrary.listener;
+
+import android.support.v4.view.GestureDetectorCompat;
+import android.support.v7.widget.RecyclerView;
+import android.view.GestureDetector;
+import android.view.MotionEvent;
+import android.view.View;
+
+/**
+ * Created by Bitliker on 2017/9/18.
+ */
+
+public abstract class OnRecyclerClickLister implements RecyclerView.OnItemTouchListener {
+
+    private GestureDetectorCompat mGestureDetectorCompat;
+    private RecyclerView mRecyclerView;
+
+    public OnRecyclerClickLister(RecyclerView recyclerView) {
+        mRecyclerView = recyclerView;
+        mGestureDetectorCompat = new GestureDetectorCompat(mRecyclerView.getContext(),
+                new GestureListener());
+    }
+
+    @Override
+    public void onTouchEvent(RecyclerView rv, MotionEvent e) {
+        mGestureDetectorCompat.onTouchEvent(e);
+    }
+
+    @Override
+    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
+        mGestureDetectorCompat.onTouchEvent(e);
+        return false;
+    }
+
+    @Override
+    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
+    }
+
+    public abstract void onItemLongClick(RecyclerView.ViewHolder vh);
+
+    public abstract void onItemClick(RecyclerView.ViewHolder vh);
+
+    private class GestureListener extends GestureDetector.SimpleOnGestureListener {
+        @Override
+        public boolean onSingleTapUp(MotionEvent e) {
+            View childe = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
+            if (childe != null) {
+                RecyclerView.ViewHolder VH = mRecyclerView.getChildViewHolder(childe);
+                onItemClick(VH);
+            }
+            return true;
+        }
+
+        @Override
+        public void onLongPress(MotionEvent e) {
+            View childe = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
+            if (childe != null) {
+                RecyclerView.ViewHolder VH = mRecyclerView.getChildViewHolder(childe);
+                onItemLongClick(VH);
+            }
+        }
+    }
+}

+ 50 - 0
app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/listener/OnRecyclerItemClickListener.java

@@ -0,0 +1,50 @@
+package com.module.recyclerlibrary.listener;
+
+import android.support.v4.view.GestureDetectorCompat;
+import android.support.v7.widget.RecyclerView;
+import android.view.GestureDetector;
+import android.view.MotionEvent;
+import android.view.View;
+
+/**
+ * 只接受点击事件,当长按一个item时候,也可以触发itemclick
+ */
+public abstract class OnRecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
+    private GestureDetectorCompat mGestureDetectorCompat;
+    private RecyclerView mRecyclerView;
+
+    public OnRecyclerItemClickListener(RecyclerView recyclerView) {
+        mRecyclerView = recyclerView;
+        mGestureDetectorCompat = new GestureDetectorCompat(mRecyclerView.getContext(),
+                new GestureListener());
+    }
+
+    @Override
+    public void onTouchEvent(RecyclerView rv, MotionEvent e) {
+        mGestureDetectorCompat.onTouchEvent(e);
+    }
+
+    @Override
+    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
+        mGestureDetectorCompat.onTouchEvent(e);
+        return false;
+    }
+
+    @Override
+    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
+    }
+
+    public abstract void onItemClick(RecyclerView.ViewHolder vh);
+
+    private class GestureListener extends GestureDetector.SimpleOnGestureListener {
+        @Override
+        public boolean onSingleTapUp(MotionEvent e) {
+            View childe = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
+            if (childe != null) {
+                RecyclerView.ViewHolder VH = mRecyclerView.getChildViewHolder(childe);
+                onItemClick(VH);
+            }
+            return true;
+        }
+    }
+}

+ 51 - 0
app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/listener/OnRecyclerLongItemClickLister.java

@@ -0,0 +1,51 @@
+package com.module.recyclerlibrary.listener;
+
+import android.support.v4.view.GestureDetectorCompat;
+import android.support.v7.widget.RecyclerView;
+import android.view.GestureDetector;
+import android.view.MotionEvent;
+import android.view.View;
+
+/**
+ * Created by Bitliker on 2017/9/18.
+ */
+
+public abstract class OnRecyclerLongItemClickLister  implements RecyclerView.OnItemTouchListener  {
+
+    private GestureDetectorCompat mGestureDetectorCompat;
+    private RecyclerView mRecyclerView;
+
+    public OnRecyclerLongItemClickLister(RecyclerView recyclerView) {
+        mRecyclerView = recyclerView;
+        mGestureDetectorCompat = new GestureDetectorCompat(mRecyclerView.getContext(),
+                new GestureListener());
+    }
+
+    @Override
+    public void onTouchEvent(RecyclerView rv, MotionEvent e) {
+        mGestureDetectorCompat.onTouchEvent(e);
+    }
+
+    @Override
+    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
+        mGestureDetectorCompat.onTouchEvent(e);
+        return false;
+    }
+
+    @Override
+    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
+    }
+
+    public abstract void onItemLongClick(RecyclerView.ViewHolder vh);
+
+    private class GestureListener extends GestureDetector.SimpleOnGestureListener {
+        @Override
+        public void onLongPress(MotionEvent e) {
+            View childe = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
+            if (childe != null) {
+                RecyclerView.ViewHolder VH = mRecyclerView.getChildViewHolder(childe);
+                onItemLongClick(VH);
+            }
+        }
+    }
+}

+ 90 - 0
app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/model/BaseModel.java

@@ -0,0 +1,90 @@
+package com.module.recyclerlibrary.model;
+
+/**
+ * Created by Bitliker on 2017/7/4.
+ */
+
+public class BaseModel<T> {
+    private boolean select;
+    private float sort;
+    private String name;
+    private String sub;
+    private String tag;
+    private T data;
+
+
+    public BaseModel(boolean select, String name, String sub, String tag) {
+        this.select = select;
+        this.name = name;
+        this.sub = sub;
+        this.tag = tag;
+    }
+
+    public BaseModel(String name, String sub, String tag) {
+        this.name = name;
+        this.sub = sub;
+        this.tag = tag;
+    }
+
+    public BaseModel(String name, String sub) {
+        this.name = name;
+        this.sub = sub;
+    }
+
+    public float getSort() {
+        return sort;
+    }
+
+    public void setSort(float sort) {
+        this.sort = sort;
+    }
+
+    public BaseModel(String name) {
+        this.name = name;
+    }
+
+    public BaseModel() {
+    }
+
+    public boolean isSelect() {
+        return select;
+    }
+
+    public void setSelect(boolean select) {
+        this.select = select;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getSub() {
+        return sub;
+    }
+
+    public void setSub(String sub) {
+        this.sub = sub;
+    }
+
+    public String getTag() {
+        return tag;
+    }
+
+    public void setTag(String tag) {
+        this.tag = tag;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+
+}

+ 521 - 0
app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/ui/refresh/BaseRefreshLayout.java

@@ -0,0 +1,521 @@
+package com.module.recyclerlibrary.ui.refresh;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.support.v7.widget.RecyclerView;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.RelativeLayout;
+import android.widget.ScrollView;
+import android.widget.Scroller;
+
+import com.module.recyclerlibrary.R;
+
+
+public abstract class BaseRefreshLayout extends ViewGroup {
+    private boolean mEnablePullDown;// 是否允许下拉刷新
+    private boolean mEnablePullUp;// 是否允许上拉加载
+
+    private Drawable mPullBgDrawable = null;// 拉动部分背景(color|drawable)
+    private onRefreshListener mListener;// 事件监听接口
+
+    private LayoutInflater mInflater;// 布局填充器对象
+    private Scroller mLayoutScroller;  // 用于平滑滑动的Scroller对象
+    private final int SCROLL_SPEED = 650;  // Scroller的滑动速度
+    private int mReachBottomScroll; // 当滚动到内容最底部时Y轴所需要滑动的举例
+    private int mEffectiveScroll; // 最小有效滑动距离(滑动超过该距离才视作一次有效的滑动刷新/加载操作)
+    private int lastChildIndex;// 最后一个content-child-view的index
+    private int mLayoutContentHeight; // ViewGroup的内容高度(不包括header与footer的高度)
+
+    private BaseRefreshView headerView; //头布局
+    private BaseRefreshView footView; //尾布局
+
+    public BaseRefreshLayout(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        TypedArray array = context.obtainStyledAttributes(attrs,
+                R.styleable.BaseRefreshLayout);
+        try {
+            mEnablePullDown = array.getBoolean(R.styleable.BaseRefreshLayout_enablePullDown, true);
+            mEnablePullUp = array.getBoolean(R.styleable.BaseRefreshLayout_enablePullUp, true);
+            mPullBgDrawable = array.getDrawable(R.styleable.BaseRefreshLayout_pullBackground);
+            mEffectiveScroll = (int) array.getDimension(R.styleable.BaseRefreshLayout_fectiveScroll, dip2px(context, -1));
+            if (mEffectiveScroll <= 0) {
+                mEffectiveScroll = (int) context.getResources().getDimension(R.dimen.refresh_item_height);
+            }
+        } finally {
+            array.recycle();
+        }
+        // 实例化布局填充器
+        mInflater = LayoutInflater.from(context);
+        // 实例化Scroller
+        mLayoutScroller = new Scroller(context);
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+        lastChildIndex = getChildCount() - 1;
+        // 添加上拉刷新部分
+        if (mEnablePullDown)
+            addLayoutHeader();
+        // 添加下拉加载部分
+        if (mEnablePullUp)
+            addLayoutFooter();
+    }
+
+    private void addLayoutHeader() {
+        headerView = getHeader(mInflater);
+        // 通过LayoutInflater获取从布局文件中获取header的view对象
+        if (mPullBgDrawable != null)
+            headerView.setBackgroundDrawable(mPullBgDrawable);
+        // 设置布局参数(宽度为MATCH_PARENT,高度为MATCH_PARENT)
+        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams
+                (RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
+        // 将Header添加进Layout当中
+        addView(headerView, params);
+    }
+
+
+    /**
+     * 添加下拉加载布局作为footer
+     */
+    private void addLayoutFooter() {
+        // 通过LayoutInflater获取从布局文件中获取footer的view对象
+        footView = getFooter(mInflater);
+        if (mPullBgDrawable != null)
+            footView.setBackgroundDrawable(mPullBgDrawable);
+        // 设置布局参数(宽度为MATCH_PARENT,高度为MATCH_PARENT)
+        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams
+                (RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
+        // 将footer添加进Layout当中
+        addView(footView, params);
+    }
+
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        // 遍历进行子视图的测量工作
+        for (int i = 0; i < getChildCount(); i++) {
+            // 通知子视图进行测量
+            View child = getChildAt(i);
+            measureChild(child, widthMeasureSpec, heightMeasureSpec);
+        }
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int l, int t, int r, int b) {
+        // 重置(避免重复累加)
+        mLayoutContentHeight = 0;
+        // 遍历进行子视图的置位工作
+        for (int index = 0; index < getChildCount(); index++) {
+            View child = getChildAt(index);
+            if (child == headerView) { // 头视图隐藏在ViewGroup的顶端
+                child.layout(0, 0 - child.getMeasuredHeight(), child.getMeasuredWidth(), 0);
+            } else if (child == footView) { // 尾视图隐藏在ViewGroup所有内容视图之后
+                child.layout(0, mLayoutContentHeight, child.getMeasuredWidth(), mLayoutContentHeight + child.getMeasuredHeight());
+            } else { // 内容视图根据定义(插入)顺序,按由上到下的顺序在垂直方向进行排列
+                child.layout(0, mLayoutContentHeight, child.getMeasuredWidth(), mLayoutContentHeight + child.getMeasuredHeight());
+                if (index <= lastChildIndex) {
+                    if (child instanceof ScrollView) {
+                        mLayoutContentHeight += getMeasuredHeight();
+                        continue;
+                    }
+                    mLayoutContentHeight += child.getMeasuredHeight();
+                }
+            }
+        }
+        // 计算到达内容最底部时ViewGroup的滑动距离
+        mReachBottomScroll = mLayoutContentHeight - getMeasuredHeight();
+    }
+
+
+    // 普通状态
+    protected final int NORMAL = 0;
+    // 意图刷新
+    protected final int TRY_REFRESH = 1;
+    // 刷新状态
+    protected final int REFRESH = 2;
+    // 意图加载
+    protected final int TRY_LOAD_MORE = 3;
+    // 加载状态
+    protected final int LOAD_MORE = 4;
+    // Layout状态
+    private int status = NORMAL;
+    // 用于计算滑动距离的Y坐标中介
+    private int mLastYMoved;
+    // 用于判断是否拦截触摸事件的Y坐标中介
+    private int mLastYIntercept;
+
+    @Override
+    public boolean onInterceptTouchEvent(MotionEvent event) {
+        boolean intercept = false;
+        // 记录此次触摸事件的y坐标
+        int y = (int) event.getY();
+        // 判断触摸事件类型
+        switch (event.getAction()) {
+            // Down事件
+            case MotionEvent.ACTION_DOWN: {
+                // 记录下本次系列触摸事件的起始点Y坐标
+                mLastYMoved = y;
+                // 不拦截ACTION_DOWN,因为当ACTION_DOWN被拦截,后续所有触摸事件都会被拦截
+                intercept = false;
+                break;
+            }
+            // Move事件
+            case MotionEvent.ACTION_MOVE: {
+                if (y > mLastYIntercept) { // 下滑操作
+                    // 获取最顶部的子视图
+                    View child = getChildAt(0);
+                    if (child instanceof AdapterView) {
+                        intercept = avPullDownIntercept(child);
+                    } else if (child instanceof ScrollView) {
+                        intercept = svPullDownIntercept(child);
+                    } else if (child instanceof RecyclerView) {
+                        intercept = rvPullDownIntercept(child);
+                    }
+                } else if (y < mLastYIntercept) { // 上拉操作
+                    // 获取最底部的子视图
+                    View child = getChildAt(lastChildIndex);
+                    if (child instanceof AdapterView) {
+                        intercept = avPullUpIntercept(child);
+                    } else if (child instanceof ScrollView) {
+                        intercept = svPullUpIntercept(child);
+                    } else if (child instanceof RecyclerView) {
+                        intercept = rvPullUpIntercept(child);
+                    }
+                } else {
+                    intercept = false;
+                }
+                break;
+            }
+            // Up事件
+            case MotionEvent.ACTION_UP: {
+                intercept = false;
+                break;
+            }
+        }
+        mLastYIntercept = y;
+        return intercept;
+    }
+
+    private boolean avPullDownIntercept(View child) {
+        boolean intercept = true;
+        AdapterView adapterChild = (AdapterView) child;
+        // 判断AbsListView是否已经到达内容最顶部
+        if (adapterChild.getFirstVisiblePosition() != 0
+                || adapterChild.getChildAt(0).getTop() != 0) {
+            // 如果没有达到最顶端,则仍然将事件下放
+            intercept = false;
+        }
+        return intercept;
+    }
+
+    private boolean avPullUpIntercept(View child) {
+        boolean intercept = false;
+        AdapterView adapterChild = (AdapterView) child;
+
+        // 判断AbsListView是否已经到达内容最底部
+        if (adapterChild.getLastVisiblePosition() == adapterChild.getCount() - 1
+                && (adapterChild.getChildAt(adapterChild.getChildCount() - 1).getBottom() == getMeasuredHeight())) {
+            // 如果到达底部,则拦截事件
+            intercept = true;
+        }
+        return intercept;
+    }
+
+    private boolean svPullDownIntercept(View child) {
+        boolean intercept = false;
+        if (child.getScrollY() <= 0) {
+            intercept = true;
+        }
+        return intercept;
+    }
+
+    private boolean svPullUpIntercept(View child) {
+        boolean intercept = false;
+        ScrollView scrollView = (ScrollView) child;
+        View scrollChild = scrollView.getChildAt(0);
+
+        if (scrollView.getScrollY() >= (scrollChild.getHeight() - scrollView.getHeight())) {
+            intercept = true;
+        }
+        return intercept;
+    }
+
+    private boolean rvPullDownIntercept(View child) {
+        boolean intercept = false;
+
+        RecyclerView recyclerChild = (RecyclerView) child;
+        if (recyclerChild.computeVerticalScrollOffset() <= 0)
+            intercept = true;
+
+        return intercept;
+    }
+
+    private boolean rvPullUpIntercept(View child) {
+        boolean intercept = false;
+
+        RecyclerView recyclerChild = (RecyclerView) child;
+        if (recyclerChild.computeVerticalScrollExtent() + recyclerChild.computeVerticalScrollOffset()
+                >= recyclerChild.computeVerticalScrollRange())
+            intercept = true;
+
+        return intercept;
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+        int y = (int) event.getY();
+        switch (event.getAction()) {
+            case MotionEvent.ACTION_MOVE: {
+                // 计算本次滑动的Y轴增量(距离)
+                int dy = mLastYMoved - y;
+                // 如果滑动增量小于0,即下拉操作
+                if (dy < 0) {
+                    if (mEnablePullDown) {
+                        // 如果下拉的距离小于mLayoutHeader1/2的高度,则允许滑动
+                        if (getScrollY() > 0 || Math.abs(getScrollY()) <= headerView.getMeasuredHeight() / 2) {
+                            if (status != TRY_LOAD_MORE && status != LOAD_MORE) {
+                                scrollBy(0, dy);
+                                if (status != REFRESH) {
+                                    if (getScrollY() <= 0) {
+                                        if (status != TRY_REFRESH) {
+                                            updateStatus(TRY_REFRESH);
+                                        } else if (Math.abs(getScrollY()) > mEffectiveScroll) {
+                                            updateStatus(REFRESH);
+                                        }
+                                    }
+                                }
+                            } else {
+                                if (getScrollY() > 0) {
+                                    dy = dy > 30 ? 30 : dy;
+                                    scrollBy(0, dy);
+                                    if (getScrollY() < mReachBottomScroll + mEffectiveScroll) {
+                                        updateStatus(TRY_LOAD_MORE);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                } else if (dy > 0) {
+                    if (mEnablePullUp) {
+                        if (getScrollY() <= mReachBottomScroll + footView.getMeasuredHeight() / 2) {
+                            // 进行Y轴上的滑动
+                            if (status != TRY_REFRESH && status != REFRESH) {
+                                scrollBy(0, dy);
+                                if (status != LOAD_MORE) {
+                                    if (getScrollY() >= mReachBottomScroll) {
+                                        if (status != TRY_LOAD_MORE)
+                                            updateStatus(TRY_LOAD_MORE);
+
+                                        if (getScrollY() >= mReachBottomScroll + mEffectiveScroll)
+                                            updateStatus(LOAD_MORE);
+                                    }
+                                }
+                            } else {
+                                if (getScrollY() <= 0) {
+                                    dy = dy > 30 ? 30 : dy;
+                                    scrollBy(0, dy);
+                                    if (Math.abs(getScrollY()) < mEffectiveScroll)
+                                        updateStatus(TRY_REFRESH);
+                                }
+                            }
+                        }
+                    }
+                }
+                // 记录y坐标
+                mLastYMoved = y;
+                break;
+            }
+            case MotionEvent.ACTION_UP: {
+                // 判断本次触摸系列事件结束时,Layout的状态
+                switch (status) {
+                    case NORMAL: {
+                        upWithStatusNormal();
+                        break;
+                    }
+                    case TRY_REFRESH: {
+                        upWithStatusTryRefresh();
+                        break;
+                    }
+
+                    case REFRESH: {
+                        upWithStatusRefresh();
+                        break;
+                    }
+
+                    case TRY_LOAD_MORE: {
+                        upWithStatusTryLoadMore();
+                        break;
+                    }
+
+                    case LOAD_MORE: {
+                        upWithStatusLoadMore();
+                        break;
+                    }
+                }
+            }
+        }
+        mLastYIntercept = 0;
+        postInvalidate();
+        return true;
+    }
+
+    private void updateStatus(int status) {
+        if (footView != null) {
+            footView.upStatus(status);
+        }
+        if (headerView != null) {
+            headerView.upStatus(status);
+        }
+        if (status != NORMAL) {
+            this.status = status;
+        }
+    }
+
+    private void upWithStatusNormal() {
+
+    }
+
+    private void upWithStatusTryRefresh() {
+        // 取消本次的滑动
+        mLayoutScroller.startScroll(0, getScrollY(), 0, -getScrollY(), SCROLL_SPEED);
+        status = NORMAL;
+        if (headerView != null) {
+            headerView.stopAnim();
+        }
+    }
+
+
+    private void upWithStatusRefresh() {
+        mLayoutScroller.startScroll(0, getScrollY(), 0, -(getScrollY() - (-mEffectiveScroll)), SCROLL_SPEED);
+        if (headerView != null) {
+            headerView.startAnim();
+        }
+        // 通过Listener接口执行刷新时的监听事件
+        if (mListener != null) {
+            mListener.onRefresh();
+        }
+    }
+
+    private void upWithStatusTryLoadMore() {
+        //取消加载
+        mLayoutScroller.startScroll(0, getScrollY(), 0, -(getScrollY() - mReachBottomScroll), SCROLL_SPEED);
+        status = NORMAL;
+        if (footView != null) {
+            footView.stopAnim();
+        }
+    }
+
+
+    private void upWithStatusLoadMore() {
+        //加载
+        mLayoutScroller.startScroll(0, getScrollY(), 0, -((getScrollY() - mEffectiveScroll) - mReachBottomScroll), SCROLL_SPEED);
+        if (footView != null) {
+            footView.startAnim();
+        }
+        // 通过Listener接口执行加载时的监听事件
+        if (mListener != null) {
+            mListener.onLoadMore();
+        }
+    }
+
+
+    @Override
+    public void computeScroll() {
+        super.computeScroll();
+        if (mLayoutScroller.computeScrollOffset()) {
+            scrollTo(0, mLayoutScroller.getCurrY());
+        }
+        postInvalidate();
+    }
+
+    private final int STOP_REFRESH = 1;
+    private final int STOP_LOAD_MORE = 2;
+
+    private Handler mUIHandler = new Handler(Looper.getMainLooper()) {
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case STOP_REFRESH: {
+                    mLayoutScroller.startScroll(0, getScrollY(), 0, -getScrollY(), SCROLL_SPEED);
+                    status = NORMAL;
+                    if (headerView != null) {
+                        headerView.stopAnim();
+                    }
+                    break;
+                }
+                case STOP_LOAD_MORE: {
+                    mLayoutScroller.startScroll(0, getScrollY(), 0, -(getScrollY() - mReachBottomScroll), SCROLL_SPEED);
+                    status = NORMAL;
+                    if (footView != null) {
+                        footView.stopAnim();
+                    }
+                    break;
+                }
+            }
+        }
+    };
+
+    private int dip2px(Context context, float dpValue) {
+        final float scale = context.getResources().getDisplayMetrics().density;
+        return (int) (dpValue * scale + 0.5f);
+    }
+
+    private void stopTryRefresh() {
+        Message msg = mUIHandler.obtainMessage(STOP_REFRESH);
+        mUIHandler.sendMessage(msg);
+    }
+
+    private void stopTryLoadMore() {
+        Message msg = mUIHandler.obtainMessage(STOP_LOAD_MORE);
+        mUIHandler.sendMessage(msg);
+    }
+
+    public void stopRefresh() {
+        if (status == LOAD_MORE) {
+            stopTryLoadMore();
+        } else if (status == REFRESH) {
+            stopTryRefresh();
+        }
+        status = NORMAL;
+    }
+
+    public boolean isRefreshing() {
+        return status == LOAD_MORE || status == REFRESH;
+    }
+
+    public void setEnabledPullUp(boolean enabledPullUp) {
+        this.mEnablePullUp = enabledPullUp;
+        if (!mEnablePullUp) {
+            if (footView != null && footView.isShown())
+                footView.setVisibility(View.GONE);
+        }
+    }
+
+    public void setOnRefreshListener(onRefreshListener listener) {
+        mListener = listener;
+    }
+
+    public interface onRefreshListener {
+        void onRefresh();
+
+        void onLoadMore();
+    }
+
+
+    protected abstract BaseRefreshView getHeader(LayoutInflater mInflater);
+
+    protected abstract BaseRefreshView getFooter(LayoutInflater mInflater);
+
+
+}

+ 36 - 0
app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/ui/refresh/BaseRefreshView.java

@@ -0,0 +1,36 @@
+package com.module.recyclerlibrary.ui.refresh;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.widget.RelativeLayout;
+
+/**
+ * Created by Bitliker on 2017/9/18.
+ */
+
+public abstract class BaseRefreshView extends RelativeLayout {
+    // 普通状态
+    protected final int NORMAL = 0;
+    // 意图刷新
+    protected final int TRY_REFRESH = 1;
+    // 刷新状态
+    protected final int REFRESH = 2;
+    // 意图加载
+    protected final int TRY_LOAD_MORE = 3;
+    // 加载状态
+    protected final int LOAD_MORE = 4;
+
+
+    public BaseRefreshView(Context context, LayoutInflater mInflater) {
+        super(context);
+    }
+
+
+    public abstract void startAnim();
+
+    public abstract void stopAnim();
+
+    public abstract void upStatus(int status);
+
+
+}

+ 56 - 0
app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/ui/refresh/simlpe/SimpleRefreshFooter.java

@@ -0,0 +1,56 @@
+package com.module.recyclerlibrary.ui.refresh.simlpe;
+
+import android.content.Context;
+import android.graphics.drawable.AnimationDrawable;
+import android.view.LayoutInflater;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.module.recyclerlibrary.R;
+import com.module.recyclerlibrary.ui.refresh.BaseRefreshView;
+
+
+/**
+ * Created by Bitliker on 2017/9/18.
+ */
+
+public class SimpleRefreshFooter extends BaseRefreshView {
+    private TextView statusTV;
+    private ImageView statusImg;
+
+    public SimpleRefreshFooter(Context context, LayoutInflater mInflater) {
+        super(context, mInflater);
+        mInflater.inflate(R.layout.refresh_footer, this);
+        statusImg = (ImageView) findViewById(R.id.statusImg);
+        statusTV = (TextView) findViewById(R.id.statusTV);
+    }
+
+
+    @Override
+    public void startAnim() {
+        statusTV.setText(R.string.refreshing);
+        statusImg.setImageResource(R.drawable.progress_round);
+        AnimationDrawable animationDrawable = (AnimationDrawable) statusImg.getDrawable();
+        animationDrawable.start();
+    }
+
+    @Override
+    public void stopAnim() {
+        statusImg.setImageResource(R.drawable.pull_up);
+        statusTV.setText(R.string.pull_up_to_load);
+    }
+
+    @Override
+    public void upStatus(int status) {
+        switch (status) {
+            case TRY_LOAD_MORE:
+                statusTV.setText(R.string.pull_up_to_load);
+                statusImg.setImageResource(R.drawable.pull_up);
+                break;
+            case LOAD_MORE:
+                statusTV.setText(R.string.up_to_load);
+                statusImg.setImageResource(R.drawable.pull_down);
+                break;
+        }
+    }
+}

+ 57 - 0
app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/ui/refresh/simlpe/SimpleRefreshHeader.java

@@ -0,0 +1,57 @@
+package com.module.recyclerlibrary.ui.refresh.simlpe;
+
+import android.content.Context;
+import android.graphics.drawable.AnimationDrawable;
+import android.view.LayoutInflater;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.module.recyclerlibrary.R;
+import com.module.recyclerlibrary.ui.refresh.BaseRefreshView;
+
+
+/**
+ * Created by Bitliker on 2017/9/18.
+ */
+
+public class SimpleRefreshHeader extends BaseRefreshView {
+    private TextView statusTV;
+    private ImageView statusImg;
+
+    public SimpleRefreshHeader(Context context, LayoutInflater mInflater) {
+        super(context, mInflater);
+        mInflater.inflate(R.layout.refresh_header, this);
+        statusImg = (ImageView) findViewById(R.id.statusImg);
+        statusTV = (TextView) findViewById(R.id.statusTV);
+
+    }
+
+
+    @Override
+    public void startAnim() {
+        statusTV.setText(R.string.refreshing);
+        statusImg.setImageResource(R.drawable.progress_round);
+        AnimationDrawable animationDrawable = (AnimationDrawable) statusImg.getDrawable();
+        animationDrawable.start();
+    }
+
+    @Override
+    public void stopAnim() {
+        statusImg.setImageResource(R.drawable.pull_down);
+        statusTV.setText(R.string.pull_down_to_refresh);
+    }
+
+    @Override
+    public void upStatus(int status) {
+        switch (status) {
+            case TRY_REFRESH:
+                statusTV.setText(R.string.pull_down_to_refresh);
+                statusImg.setImageResource(R.drawable.pull_down);
+                break;
+            case REFRESH:
+                statusTV.setText(R.string.up_to_refresh);
+                statusImg.setImageResource(R.drawable.pull_up);
+                break;
+        }
+    }
+}

+ 30 - 0
app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/ui/refresh/simlpe/SimpleRefreshLayout.java

@@ -0,0 +1,30 @@
+package com.module.recyclerlibrary.ui.refresh.simlpe;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+
+import com.module.recyclerlibrary.ui.refresh.BaseRefreshLayout;
+import com.module.recyclerlibrary.ui.refresh.BaseRefreshView;
+
+
+/**
+ * Created by Bitliker on 2017/9/18.
+ */
+
+public class SimpleRefreshLayout extends BaseRefreshLayout {
+
+    public SimpleRefreshLayout(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    protected BaseRefreshView getHeader(LayoutInflater mInflater) {
+        return new SimpleRefreshHeader(getContext(),mInflater);
+    }
+
+    @Override
+    protected BaseRefreshView getFooter(LayoutInflater mInflater) {
+        return new SimpleRefreshFooter(getContext(),mInflater);
+    }
+}

+ 156 - 0
app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/ui/refresh/smart/EatBeanLoadingView.java

@@ -0,0 +1,156 @@
+package com.module.recyclerlibrary.ui.refresh.smart;
+        
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ValueAnimator;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.RectF;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.animation.LinearInterpolator;
+
+public class EatBeanLoadingView extends View {
+
+    private Paint mPaint, mPaintEye;
+
+    private float mWidth = 0f;
+    private float mHigh = 0f;
+    private float mPadding = 5f;
+
+    private float eatErWidth = 60f;
+    private float eatErPositonX = 0f;
+    int eatSpeed = 5;
+    private float beansWidth = 10f;
+
+
+    private float mAngle = 34;
+    private float eatErStrtAngle = mAngle;
+    private float eatErEndAngle = 360 - 2 * eatErStrtAngle;
+
+
+    public EatBeanLoadingView(Context context) {
+        this(context, null);
+    }
+
+    public EatBeanLoadingView(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public EatBeanLoadingView(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        initPaint();
+
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+        mWidth = getMeasuredWidth();
+        mHigh = getMeasuredHeight();
+    }
+
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        super.onDraw(canvas);
+        float eatRightX = mPadding + eatErWidth + eatErPositonX;
+        RectF rectF = new RectF(mPadding + eatErPositonX, mHigh / 2 - eatErWidth / 2, eatRightX, mHigh / 2 + eatErWidth / 2);
+        canvas.drawArc(rectF, eatErStrtAngle, eatErEndAngle
+                , true, mPaint);
+        canvas.drawCircle(mPadding + eatErPositonX + eatErWidth / 2,
+                mHigh / 2 - eatErWidth / 4,
+                beansWidth / 2, mPaintEye);
+
+        int beansCount = (int) ((mWidth - mPadding * 2 - eatErWidth) / beansWidth / 2);
+        for (int i = 0; i < beansCount; i++) {
+
+            float x = beansCount * i + beansWidth / 2 + mPadding + eatErWidth;
+            if (x > eatRightX) {
+                canvas.drawCircle(x,
+                        mHigh / 2, beansWidth / 2, mPaint);
+            }
+        }
+
+
+    }
+
+    private void initPaint() {
+        mPaint = new Paint();
+        mPaint.setAntiAlias(true);
+        mPaint.setStyle(Paint.Style.FILL);
+        mPaint.setColor(Color.GRAY);
+
+        mPaintEye = new Paint();
+        mPaintEye.setAntiAlias(true);
+        mPaintEye.setStyle(Paint.Style.FILL);
+        mPaintEye.setColor(Color.BLACK);
+
+    }
+
+    public void startAnim() {
+        stopAnim();
+        startViewAnim(0f, 1f, 3500);
+    }
+
+    public void stopAnim() {
+        if (valueAnimator != null) {
+            clearAnimation();
+            valueAnimator.setRepeatCount(0);
+            valueAnimator.cancel();
+            valueAnimator.end();
+            eatErPositonX = 0;
+            postInvalidate();
+        }
+    }
+
+    ValueAnimator valueAnimator = null;
+
+    private ValueAnimator startViewAnim(float startF, final float endF, long time) {
+        valueAnimator = ValueAnimator.ofFloat(startF, endF);
+        valueAnimator.setDuration(time);
+        valueAnimator.setInterpolator(new LinearInterpolator());
+        valueAnimator.setRepeatCount(ValueAnimator.INFINITE);//无限循环
+        valueAnimator.setRepeatMode(ValueAnimator.RESTART);
+        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+            @Override
+            public void onAnimationUpdate(ValueAnimator valueAnimator) {
+
+                float mAnimatedValue = (float) valueAnimator.getAnimatedValue();
+                eatErPositonX = (mWidth - 2 * mPadding - eatErWidth) * mAnimatedValue;
+                eatErStrtAngle = mAngle * (1 - (mAnimatedValue * eatSpeed - (int) (mAnimatedValue * eatSpeed)));
+                eatErEndAngle = 360 - eatErStrtAngle * 2;
+                invalidate();
+            }
+        });
+        valueAnimator.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                super.onAnimationEnd(animation);
+
+            }
+
+            @Override
+            public void onAnimationStart(Animator animation) {
+                super.onAnimationStart(animation);
+            }
+
+            @Override
+            public void onAnimationRepeat(Animator animation) {
+                super.onAnimationRepeat(animation);
+            }
+        });
+        if (!valueAnimator.isRunning()) {
+            valueAnimator.start();
+
+        }
+
+        return valueAnimator;
+    }
+
+
+}
+

+ 283 - 0
app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/ui/refresh/smart/GhostLoadingView.java

@@ -0,0 +1,283 @@
+package com.module.recyclerlibrary.ui.refresh.smart;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ValueAnimator;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.RectF;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.animation.LinearInterpolator;
+
+public class GhostLoadingView extends View {
+
+    float mWidth = 0f;
+    float mHeight = 0f;
+    Paint mPaint, mPaintHand, mPaintShadow, mPaintArms;
+    RectF rectFGhost = new RectF();
+    RectF rectFGhostShadow = new RectF();
+    float mPadding = 0f;
+    int mskirtH = 0;
+    Path path = new Path();
+
+    public GhostLoadingView(Context context) {
+        this(context, null);
+    }
+
+    public GhostLoadingView(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public GhostLoadingView(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        initPaint();
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        mWidth = getMeasuredWidth();
+        mHeight = getMeasuredHeight();
+        mPadding = 10;
+        mskirtH = (int) (mWidth / 40);
+    }
+
+    private void initPaint() {
+        mPaint = new Paint();
+        mPaint.setAntiAlias(true);
+        mPaint.setStyle(Paint.Style.FILL);
+        mPaint.setColor(Color.GRAY);
+        mPaintHand = new Paint();
+        mPaintHand.setAntiAlias(true);
+        mPaintHand.setStyle(Paint.Style.FILL);
+        mPaintHand.setColor(Color.argb(220, 0, 0, 0));
+
+        mPaintShadow = new Paint();
+        mPaintShadow.setAntiAlias(true);
+        mPaintShadow.setStyle(Paint.Style.FILL);
+        mPaintShadow.setColor(Color.argb(60, 0, 0, 0));
+
+
+        mPaintArms = new Paint();
+        mPaintArms.setAntiAlias(true);
+        mPaintArms.setStrokeWidth(8);
+        mPaintArms.setStyle(Paint.Style.FILL);
+        mPaintArms.setColor(Color.argb(150, 0, 0, 0));
+    }
+
+
+    private void drawShadow(Canvas canvas) {
+        canvas.drawArc(rectFGhostShadow, 0, 360, false, mPaintShadow);
+
+    }
+
+
+    private void drawHead(Canvas canvas) {
+        canvas.drawCircle(rectFGhost.left + rectFGhost.width() / 2
+                , rectFGhost.width() / 2 + rectFGhost.top
+                , rectFGhost.width() / 2 - 15
+                , mPaint
+        );
+    }
+
+    private void drawHand(Canvas canvas) {
+        canvas.drawCircle(rectFGhost.left + rectFGhost.width() / 2 - mskirtH * 3 / 2 + mskirtH * onAnimationRepeatFlag
+                , rectFGhost.width() / 2 + mskirtH + rectFGhost.top,
+                mskirtH * 0.9f, mPaintHand
+        );
+        canvas.drawCircle(rectFGhost.left + rectFGhost.width() / 2 + mskirtH * 3 / 2 + mskirtH * onAnimationRepeatFlag
+                , rectFGhost.width() / 2 + mskirtH + rectFGhost.top,
+                mskirtH * 0.9f, mPaintHand
+        );
+
+
+    }
+
+
+    float wSpace = 10f;
+    float hSpace = 10f;
+
+    private void drawBody(Canvas canvas) {
+        path.reset();
+
+        float x = (float) ((rectFGhost.width() / 2 - 15) * Math.cos(5 * Math.PI / 180f));
+        float y = (float) ((rectFGhost.width() / 2 - 15) * Math.sin(5 * Math.PI / 180f));
+
+        float x2 = (float) ((rectFGhost.width() / 2 - 15) * Math.cos(175 * Math.PI / 180f));
+        float y2 = (float) ((rectFGhost.width() / 2 - 15) * Math.sin(175 * Math.PI / 180f));
+
+
+        path.moveTo(rectFGhost.left + rectFGhost.width() / 2 - x, rectFGhost.width() / 2 - y + rectFGhost.top);
+        path.lineTo(rectFGhost.left + rectFGhost.width() / 2 - x2, rectFGhost.width() / 2 - y2 + rectFGhost.top);
+        path.quadTo(rectFGhost.right + wSpace / 2, rectFGhost.bottom
+                , rectFGhost.right - wSpace, rectFGhost.bottom - hSpace);
+
+
+        float a = mskirtH;
+
+        float m = (rectFGhost.width() - 2 * wSpace) / 7f;
+
+        for (int i = 0; i < 7; i++) {
+            if (i % 2 == 0) {
+                path.quadTo(rectFGhost.right - wSpace - m * i - (m / 2), rectFGhost.bottom - hSpace - a
+                        , rectFGhost.right - wSpace - (m * (i + 1)), rectFGhost.bottom - hSpace);
+            } else {
+                path.quadTo(rectFGhost.right - wSpace - m * i - (m / 2), rectFGhost.bottom - hSpace + a
+                        , rectFGhost.right - wSpace - (m * (i + 1)), rectFGhost.bottom - hSpace);
+
+            }
+        }
+
+        path.quadTo(rectFGhost.left - 5, rectFGhost.bottom
+                , rectFGhost.left + rectFGhost.width() / 2 - x, rectFGhost.width() / 2 - y + rectFGhost.top);
+
+
+        path.close();
+        canvas.drawPath(path, mPaint);
+
+
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        super.onDraw(canvas);
+        canvas.save();
+
+        float distance = (mWidth - 2 * mPadding) / 3 * 2 * mAnimatedValue;
+
+        rectFGhost.left = mPadding + distance;
+        rectFGhost.right = (mWidth - 2 * mPadding) / 3 + distance;
+        float moveY = 0f;
+        float moveYMax = mHeight / 4f / 2f;
+        float shadowHighMax = 5f;
+        float shadowHigh = 0f;
+
+        if (mAnimatedValue <= 0.25) {
+            moveY = (float) (moveYMax / 0.25 * mAnimatedValue);
+            rectFGhost.top = moveY;
+
+            rectFGhost.bottom = mHeight / 4 * 3 + moveY;
+
+            shadowHigh = shadowHighMax / 0.25f * mAnimatedValue;
+
+
+        } else if (mAnimatedValue > 0.25 && mAnimatedValue <= 0.5f) {
+
+            moveY = (float) (moveYMax / 0.25 * (mAnimatedValue - 0.25f));
+            rectFGhost.top = moveYMax - moveY;
+            rectFGhost.bottom = mHeight / 4 * 3 + moveYMax - moveY;
+
+            shadowHigh = shadowHighMax - shadowHighMax / 0.25f * (mAnimatedValue - 0.25f);
+
+        } else if (mAnimatedValue > 0.5 && mAnimatedValue <= 0.75f) {
+            moveY = (float) (moveYMax / 0.25 * (mAnimatedValue - 0.5f));
+            rectFGhost.top = moveY;
+            rectFGhost.bottom = mHeight / 4 * 3 + moveY;
+            shadowHigh = shadowHighMax / 0.25f * (mAnimatedValue - 0.5f);
+
+
+        } else if (mAnimatedValue > 0.75 && mAnimatedValue <= 1f) {
+            moveY = (float) (moveYMax / 0.25 * (mAnimatedValue - 0.75f));
+            rectFGhost.top = moveYMax - moveY;
+            rectFGhost.bottom = mHeight / 4 * 3 + moveYMax - moveY;
+            shadowHigh = shadowHighMax - shadowHighMax / 0.25f * (mAnimatedValue - 0.75f);
+
+        }
+
+
+        rectFGhostShadow.top = mHeight - 25 + shadowHigh;
+        rectFGhostShadow.bottom = mHeight - 5 - shadowHigh;
+        rectFGhostShadow.left = rectFGhost.left + 5 + shadowHigh * 3;
+        rectFGhostShadow.right = rectFGhost.right - 5 - shadowHigh * 3;
+        drawShadow(canvas);
+        drawHead(canvas);
+        drawBody(canvas);
+        drawHand(canvas);
+        canvas.restore();
+
+    }
+
+
+    public void startAnim() {
+        stopAnim();
+        startViewAnim(0f, 1f, 2500);
+    }
+
+    private ValueAnimator valueAnimator;
+    private float mAnimatedValue = 0.f;
+
+    public void stopAnim() {
+        if (valueAnimator != null) {
+            clearAnimation();
+            valueAnimator.setRepeatCount(0);
+            valueAnimator.cancel();
+            valueAnimator.end();
+            mAnimatedValue = 0f;
+            wSpace = 10;
+            onAnimationRepeatFlag = 1;
+            postInvalidate();
+        }
+    }
+
+    int onAnimationRepeatFlag = 1;
+
+    private ValueAnimator startViewAnim(float startF, final float endF, long time) {
+        valueAnimator = ValueAnimator.ofFloat(startF, endF);
+        valueAnimator.setDuration(time);
+        valueAnimator.setInterpolator(new LinearInterpolator());
+        valueAnimator.setRepeatCount(ValueAnimator.INFINITE);//无限循环
+        valueAnimator.setRepeatMode(ValueAnimator.REVERSE);
+        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+            @Override
+            public void onAnimationUpdate(ValueAnimator valueAnimator) {
+
+                mAnimatedValue = (float) valueAnimator.getAnimatedValue();
+
+                invalidate();
+            }
+        });
+        valueAnimator.addListener(new AnimatorListenerAdapter() {
+
+
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                super.onAnimationEnd(animation);
+            }
+
+            @Override
+            public void onAnimationStart(Animator animation) {
+                super.onAnimationStart(animation);
+
+            }
+
+            @Override
+            public void onAnimationRepeat(Animator animation) {
+                super.onAnimationRepeat(animation);
+                onAnimationRepeatFlag = onAnimationRepeatFlag * -1;
+
+                if (onAnimationRepeatFlag == -1) {
+                    wSpace = 22;
+                } else {
+                    wSpace = -2;
+                }
+
+
+            }
+
+        });
+        if (!valueAnimator.isRunning()) {
+            wSpace = -2;
+            valueAnimator.start();
+
+        }
+
+        return valueAnimator;
+    }
+
+
+}
+

+ 61 - 0
app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/ui/refresh/smart/SmartRefreshFooter.java

@@ -0,0 +1,61 @@
+package com.module.recyclerlibrary.ui.refresh.smart;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.module.recyclerlibrary.R;
+import com.module.recyclerlibrary.ui.refresh.BaseRefreshView;
+
+/**
+ * Created by Bitliker on 2017/9/18.
+ */
+
+public class SmartRefreshFooter extends BaseRefreshView {
+    EatBeanLoadingView ghostLoadingView;
+    TextView statusTV;
+    private final ImageView statusImg;
+
+    public SmartRefreshFooter(Context context, LayoutInflater mInflater) {
+        super(context, mInflater);
+        mInflater.inflate(R.layout.refresh_smart_footer, this);
+        ghostLoadingView = (EatBeanLoadingView) findViewById(R.id.srl_elv_pull_up);
+        statusTV = (TextView) findViewById(R.id.statusTV);
+        statusImg = (ImageView) findViewById(R.id.statusImg);
+    }
+
+    @Override
+    public void startAnim() {
+        statusTV.setVisibility(GONE);
+        statusTV.setText(R.string.pull_up_to_load);
+        statusImg.setImageResource(R.drawable.pull_up);
+        statusImg.setVisibility(GONE);
+        ghostLoadingView.setVisibility(VISIBLE);
+        ghostLoadingView.startAnim();
+    }
+
+    @Override
+    public void stopAnim() {
+        ghostLoadingView.stopAnim();
+        statusTV.setVisibility(VISIBLE);
+        statusImg.setVisibility(VISIBLE);
+        ghostLoadingView.setVisibility(GONE);
+
+    }
+
+
+    @Override
+    public void upStatus(int status) {
+        switch (status) {
+            case TRY_LOAD_MORE:
+                statusTV.setText(R.string.pull_up_to_load);
+                statusImg.setImageResource(R.drawable.pull_up);
+                break;
+            case LOAD_MORE:
+                statusTV.setText(R.string.up_to_load);
+                statusImg.setImageResource(R.drawable.pull_down);
+                break;
+        }
+    }
+}

+ 61 - 0
app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/ui/refresh/smart/SmartRefreshHeader.java

@@ -0,0 +1,61 @@
+package com.module.recyclerlibrary.ui.refresh.smart;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.module.recyclerlibrary.R;
+import com.module.recyclerlibrary.ui.refresh.BaseRefreshView;
+
+/**
+ * Created by Bitliker on 2017/9/18.
+ */
+
+public class SmartRefreshHeader extends BaseRefreshView {
+    GhostLoadingView ghostLoadingView;
+    TextView statusTV;
+    private final ImageView statusImg;
+
+    public SmartRefreshHeader(Context context, LayoutInflater mInflater) {
+        super(context, mInflater);
+        mInflater.inflate(R.layout.refresh_smart_header, this);
+        ghostLoadingView = (GhostLoadingView) findViewById(R.id.srl_glv_pull_down);
+        statusTV = (TextView) findViewById(R.id.statusTV);
+        statusImg = (ImageView) findViewById(R.id.statusImg);
+
+    }
+
+    @Override
+    public void startAnim() {
+        statusTV.setVisibility(GONE);
+        statusImg.setVisibility(GONE);
+        statusTV.setText(R.string.pull_down_to_refresh);
+        statusImg.setImageResource(R.drawable.pull_down);
+        ghostLoadingView.setVisibility(VISIBLE);
+        ghostLoadingView.startAnim();
+    }
+
+    @Override
+    public void stopAnim() {
+        ghostLoadingView.stopAnim();
+        statusTV.setVisibility(VISIBLE);
+        statusImg.setVisibility(VISIBLE);
+        ghostLoadingView.setVisibility(GONE);
+
+    }
+
+    @Override
+    public void upStatus(int status) {
+        switch (status) {
+            case TRY_REFRESH:
+                statusTV.setText(R.string.pull_down_to_refresh);
+                statusImg.setImageResource(R.drawable.pull_down);
+                break;
+            case REFRESH:
+                statusTV.setText(R.string.up_to_refresh);
+                statusImg.setImageResource(R.drawable.pull_up);
+                break;
+        }
+    }
+}

+ 29 - 0
app_third/recyclerlibrary/src/main/java/com/module/recyclerlibrary/ui/refresh/smart/SmartRefreshLayout.java

@@ -0,0 +1,29 @@
+package com.module.recyclerlibrary.ui.refresh.smart;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+
+import com.module.recyclerlibrary.ui.refresh.BaseRefreshLayout;
+import com.module.recyclerlibrary.ui.refresh.BaseRefreshView;
+
+/**
+ * Created by Bitliker on 2017/9/18.
+ */
+
+public class SmartRefreshLayout extends BaseRefreshLayout {
+
+    public SmartRefreshLayout(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    protected BaseRefreshView getHeader(LayoutInflater mInflater) {
+        return new SmartRefreshHeader(getContext(), mInflater);
+    }
+
+    @Override
+    protected BaseRefreshView getFooter(LayoutInflater mInflater) {
+        return new SmartRefreshFooter(getContext(), mInflater);
+    }
+}

BIN
app_third/recyclerlibrary/src/main/res/drawable-hdpi/loading_01.png


BIN
app_third/recyclerlibrary/src/main/res/drawable-hdpi/loading_02.png


BIN
app_third/recyclerlibrary/src/main/res/drawable-hdpi/loading_03.png


BIN
app_third/recyclerlibrary/src/main/res/drawable-hdpi/loading_04.png


BIN
app_third/recyclerlibrary/src/main/res/drawable-hdpi/loading_05.png


BIN
app_third/recyclerlibrary/src/main/res/drawable-hdpi/loading_06.png


BIN
app_third/recyclerlibrary/src/main/res/drawable-hdpi/loading_07.png


BIN
app_third/recyclerlibrary/src/main/res/drawable-hdpi/loading_08.png


BIN
app_third/recyclerlibrary/src/main/res/drawable-hdpi/loading_09.png


BIN
app_third/recyclerlibrary/src/main/res/drawable-hdpi/loading_10.png


BIN
app_third/recyclerlibrary/src/main/res/drawable-hdpi/loading_11.png


BIN
app_third/recyclerlibrary/src/main/res/drawable-hdpi/loading_12.png


BIN
app_third/recyclerlibrary/src/main/res/drawable-hdpi/pull_down.png


BIN
app_third/recyclerlibrary/src/main/res/drawable-hdpi/pull_up.png


BIN
app_third/recyclerlibrary/src/main/res/drawable-xhdpi/pull_down.png


BIN
app_third/recyclerlibrary/src/main/res/drawable-xhdpi/pull_up.png


BIN
app_third/recyclerlibrary/src/main/res/drawable-xxhdpi/pull_down.png


BIN
app_third/recyclerlibrary/src/main/res/drawable-xxhdpi/pull_up.png


+ 40 - 0
app_third/recyclerlibrary/src/main/res/drawable/progress_round.xml

@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
+    android:oneshot="false" >
+    <item
+        android:drawable="@drawable/loading_01"
+        android:duration="30"/>
+    <item
+        android:drawable="@drawable/loading_02"
+        android:duration="30"/>
+    <item
+        android:drawable="@drawable/loading_03"
+        android:duration="30"/>
+    <item
+        android:drawable="@drawable/loading_04"
+        android:duration="30"/>
+    <item
+        android:drawable="@drawable/loading_05"
+        android:duration="30"/>
+    <item
+        android:drawable="@drawable/loading_06"
+        android:duration="30"/>
+    <item
+        android:drawable="@drawable/loading_07"
+        android:duration="30"/>
+    <item
+        android:drawable="@drawable/loading_08"
+        android:duration="30"/>
+    <item
+        android:drawable="@drawable/loading_09"
+        android:duration="30"/>
+    <item
+        android:drawable="@drawable/loading_10"
+        android:duration="30"/>
+    <item
+        android:drawable="@drawable/loading_11"
+        android:duration="30"/>
+    <item
+        android:drawable="@drawable/loading_12"
+        android:duration="30"/>
+</animation-list>

+ 28 - 0
app_third/recyclerlibrary/src/main/res/layout/refresh_footer.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_gravity="center_horizontal"
+    android:gravity="center_horizontal"
+    android:paddingBottom="8dp"
+    android:paddingTop="8dp">
+
+    <ImageView
+        android:id="@+id/statusImg"
+        android:layout_width="25dp"
+        android:layout_height="25dp"
+        android:src="@drawable/pull_up" />
+
+    <TextView
+        android:id="@+id/statusTV"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="5dp"
+        android:layout_marginTop="4dp"
+        android:layout_toRightOf="@+id/statusImg"
+        android:gravity="center"
+        android:text="@string/pull_up_to_load"
+        android:textSize="16sp" />
+
+
+</LinearLayout>

+ 34 - 0
app_third/recyclerlibrary/src/main/res/layout/refresh_header.xml

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:paddingBottom="8dp"
+    android:paddingTop="8dp">
+
+    <RelativeLayout
+        android:id="@+id/statusRL"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        android:layout_centerHorizontal="true">
+
+        <ImageView
+            android:id="@+id/statusImg"
+            android:layout_width="25dp"
+            android:layout_height="25dp"
+            android:src="@drawable/pull_down" />
+
+        <TextView
+            android:id="@+id/statusTV"
+            android:layout_marginLeft="5dp"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="4dp"
+            android:layout_toRightOf="@+id/statusImg"
+            android:gravity="center"
+            android:text="@string/pull_down_to_refresh"
+            android:textSize="16sp" />
+
+    </RelativeLayout>
+
+</RelativeLayout>

+ 36 - 0
app_third/recyclerlibrary/src/main/res/layout/refresh_smart_footer.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@color/refresh_background"
+    android:paddingBottom="@dimen/refresh_padding_bottom"
+    android:paddingTop="@dimen/refresh_padding_top">
+
+
+    <TextView
+        android:id="@+id/statusTV"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerHorizontal="true"
+        android:layout_marginLeft="5dp"
+        android:layout_marginTop="4dp"
+        android:gravity="center"
+        android:text="@string/pull_up_to_load"
+        android:textSize="16sp" />
+
+    <ImageView
+        android:id="@+id/statusImg"
+        android:layout_width="25dp"
+        android:layout_height="25dp"
+        android:layout_toLeftOf="@id/statusTV"
+        android:src="@drawable/pull_up" />
+
+    <com.module.recyclerlibrary.ui.refresh.smart.EatBeanLoadingView
+        android:id="@+id/srl_elv_pull_up"
+        android:layout_width="match_parent"
+        android:layout_height="50dp"
+        android:layout_centerHorizontal="true"
+        android:layout_marginLeft="10dp"
+        android:layout_marginRight="10dp"
+        android:visibility="gone" />
+</RelativeLayout>

+ 38 - 0
app_third/recyclerlibrary/src/main/res/layout/refresh_smart_header.xml

@@ -0,0 +1,38 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/refresh_background"
+    android:paddingBottom="@dimen/refresh_padding_bottom"
+    android:paddingTop="@dimen/refresh_padding_top">
+
+
+    <TextView
+        android:id="@+id/statusTV"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        android:layout_centerHorizontal="true"
+        android:layout_marginLeft="5dp"
+        android:layout_marginTop="4dp"
+        android:gravity="center"
+        android:text="@string/pull_down_to_refresh"
+        android:textSize="16sp" />
+
+    <ImageView
+        android:id="@+id/statusImg"
+        android:layout_width="25dp"
+        android:layout_toLeftOf="@id/statusTV"
+        android:layout_height="25dp"
+        android:layout_alignParentBottom="true"
+        android:src="@drawable/pull_down" />
+
+    <com.module.recyclerlibrary.ui.refresh.smart.GhostLoadingView
+        android:id="@+id/srl_glv_pull_down"
+        android:layout_width="100dp"
+        android:layout_height="50dp"
+        android:layout_marginLeft="10dp"
+        android:layout_marginRight="10dp"
+        android:layout_alignParentBottom="true"
+        android:layout_centerHorizontal="true"
+        android:visibility="gone" />
+</RelativeLayout>

+ 10 - 0
app_third/recyclerlibrary/src/main/res/values/attr.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <declare-styleable name="BaseRefreshLayout">
+        <attr name="enablePullUp" format="boolean" />
+        <attr name="enablePullDown" format="boolean" />
+        <attr name="pullBackground" format="color|reference" />
+        <attr name="fectiveScroll" format="dimension" />
+    </declare-styleable>
+
+</resources>

+ 4 - 0
app_third/recyclerlibrary/src/main/res/values/color.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="refresh_background">#FFFFFF</color>
+</resources>

+ 6 - 0
app_third/recyclerlibrary/src/main/res/values/dimens.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <dimen name="refresh_padding_top">10dp</dimen>
+    <dimen name="refresh_padding_bottom">10dp</dimen>
+    <dimen name="refresh_item_height">60dp</dimen>
+</resources>

+ 10 - 0
app_third/recyclerlibrary/src/main/res/values/strings.xml

@@ -0,0 +1,10 @@
+<resources>
+    <string name="app_name">RecyclerLibrary</string>
+    <string name="pull_down_to_refresh">继续下拉刷新</string>
+    <string name="up_to_refresh">松开刷新</string>
+    <string name="pull_up_to_load">继续上拉加载</string>
+    <string name="up_to_load">松开加载</string>
+    <string name="refreshing">正在刷新</string>
+    <string name="loading">正在加载</string>
+
+</resources>

+ 4 - 2
settings.gradle

@@ -8,10 +8,10 @@ include ':common'
 include ':message'
 
 //业务模块
-include  ':appmessages'
+include ':appmessages'
 include ':applogin'
 include ':appcontact'
-include  ':appbooking'
+include ':appbooking'
 include ':appme'
 include ':appworks'
 include ':appmoments'
@@ -28,6 +28,7 @@ include ':materialdialogs'
 include ':MPAndroidChart'
 include ':pullToRefershLibraryMy'
 include ':android-pdf-viewer'
+include ':recyclerlibrary'
 
 //核心模块
 project(':network').projectDir = new File('app_core/network')
@@ -56,3 +57,4 @@ project(':MPAndroidChart').projectDir = new File('app_third/MPAndroidChart')
 project(':libfloatingactionbutton').projectDir = new File('app_third/libfloatingactionbutton')
 project(':library-swipemenu_lv').projectDir = new File('app_third/library-swipemenu_lv')
 project(':android-pdf-viewer').projectDir = new File('app_third/android-pdf-viewer')
+project(':recyclerlibrary').projectDir = new File('app_third/recyclerlibrary')