[
  {
    "path": ".gitignore",
    "content": "# Android generated\nbin/\ngen/\n.DS_Store\n# Ant\nbuild.xml\nlocal.properties\n\n# Maven\ntarget/\npom.xml.*\nrelease.properties\n\n# Eclipse\n.classpath\n.project\n.externalToolBuilders/\n.apt_generated/\n\n# IntelliJ\n*.iml\n*.ipr\n*.iws\n.idea/\nout/\noutput/\n.gitignore.orig\n.project.bak\n.settings/org.eclipse.core.resources.prefs\n.settings/org.eclipse.core.runtime.prefs\n.settings/org.eclipse.jdt.apt.core.prefs\n.settings/org.eclipse.jdt.core.prefs\n.settings/org.eclipse.jdt.launching.prefs\n.settings/\n.properties\n**/*.iml\n**/*/.idea\n**/.idea\n.gradle\nbuild/\n**/.gradle\n**/*/build\n**/build\n# key info:\nultimateandroid.jks\nkeystore.properties\ngradleinfo.properties\n\n\n# Ignore Gradle GUI config\ngradle-app.setting\nmanifest-merger-release-report.txt\n*.apk\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: android\njdk:\n  - oraclejdk8\n\n# Turning off caching to avoid caching Issues\n# cache: false\n# Using the new Container-Based Infrastructure\nsudo: false\n\nenv:\n  global:\n    # Initiating clean Gradle output\n    - TERM=dumb\n    # Amount of memory granted to Gradle JVM\n    - GRADLE_OPTS=\"-Xmx512m -XX:MaxPermSize=512m\"\n    # General Android settings used in builds\n    - ANDROID_TARGET=android-30\n\nbefore_install:\n    # Making sure gradlew has executable permissions\n    - cd UltimateRecyclerView\n    - chmod a+x gradlew\n    - yes | sdkmanager \"platforms;android-30\"\n\n\nandroid:\n  components:\n    # We are using the latest revision of Android SDK Tools\n    - tools\n    - platform-tools\n    - android-30\n    # The BuildTools version we are using for our project\n    - build-tools-29.0.2\n    # Additional components\n    - extra-google-google_play_services\n    - extra-google-m2repository\n    - extra-android-m2repository\n\n  licenses:\n     - 'android-sdk-license-.+'\n\nscript:\n\n  #./gradlew build\n  ./gradlew assembleDebug\n"
  },
  {
    "path": "LICENSE",
    "content": "Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright {yyyy} {name of copyright owner}\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n"
  },
  {
    "path": "README.md",
    "content": "# UltimateRecyclerView\n\n [ ![Download](https://api.bintray.com/packages/marshalchen/UltimateRecyclerview/UltimateRecyclerview/images/download.svg) ](https://bintray.com/marshalchen/UltimateRecyclerview/UltimateRecyclerview/_latestVersion)[![License](https://img.shields.io/badge/license-Apache%202-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)[![Stories in Ready](https://badge.waffle.io/cymcsg/UltimateRecyclerView.svg?label=ready&title=Ready)](http://waffle.io/cymcsg/UltimateRecyclerView)\n\n\n\n\n#### Master branch:[![Build Status](https://travis-ci.org/cymcsg/UltimateRecyclerView.svg?branch=master)](https://travis-ci.org/cymcsg/UltimateRecyclerView)\n\n#### Dev branch:[![Build Status](https://travis-ci.org/cymcsg/UltimateRecyclerView.svg?branch=dev)](https://travis-ci.org/cymcsg/UltimateRecyclerView)\n\n##### Project website:[https://github.com/cymcsg/UltimateRecyclerView](https://github.com/cymcsg/UltimateRecyclerView)\n\n\n\n### Description\n\nUltimateRecyclerView is a RecyclerView(advanced and flexible version of ListView) with pulling to refresh, loading more, swiping to dismiss, draging and drop, animations ,sticky header,show or hide toolbar and FAB when scrolling and many other features.You can use it ```just like RecyclerView```. Support AndroidX now.\n\nNotice that UltimateRecyclerView is a project under development.\n\n[Your donations is highly appreciated. Thank you!](#donations)\n\n### Features:\n\n* Swipe to refresh(using AndroidX SwipeRefreshLayout)\n* Many kinds of animations\n* Swipe to dismiss\n* Parallax or normal head view\n* Drag and drop items\n* Loading more when reach the last item(infinite scrolling)\n* Custom views in loading more\n* Showing or hiding toolbar and floating button when scrolling\n* Scrollbars\n* Colorful styles of ``swipe to refresh``\n* Sticky header like instagram\n* Support different layout in adapter\n* Loading adapter with animation\n* Expandable view in recyclerview\n\n\n#### Quick Setup (Basic Usage)\n##### 1.Using Gradle:\n```groovy\nrepositories {\n    mavenCentral()\n    google()\n}\ndependencies {\n    ...\n    implementation 'com.marshalchen.ultimaterecyclerview:library:0.9.0'\n}\n```\n\nor grab via Maven\n\n```xml\n<dependency>\n  <groupId>com.marshalchen.ultimaterecyclerview</groupId>\n  <artifactId>library</artifactId>\n  <version>0.9.0</version>\n</dependency>\n```\n\n##### 2.Usage:\n\n``` xml\n<com.marshalchen.ultimaterecyclerview.UltimateRecyclerView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:id=\"@+id/ultimate_recycler_view\"\n/>\n```\nFor more details, you can read the Wiki and the demo of the project.\n\n\n\n\n### Version Log\n* ***v0.8.0*** Migrate to AndroidX\n* ***v0.7.0*** Support most features in Recyclerview 24.0.0. Improve the UltimateAdapter. Reduce the size of the library. Fix some bugs.\n\n* ***v0.5.8*** In this version we are now based on support library 23.4.0. We have fixed the load more and disable load more function from early triggers. There is no need to change anything from their implementations. Please read up on the example code if you have any questions from the implementations.\n\n* ***v0.5.6*** In this version we now have 23.3.0 support library and the min version is supported all the ways to v13. New added feature that allow us to adding have node connector on each item on `linearlayoutmanager`. By extending `TimeLineView` you will now have unlimited builds from the things that connected to each dot.\n* ***v0.5.0*** this library will be based on v23.2.1 from now on. if you need have the v23.1.1 please go back to the previous release. detail of this upgrade please see [#342](https://github.com/cymcsg/UltimateRecyclerView/issues/342)\n* ***v0.4.9*** This is the last version that will be based on V23.1.1. and this library will not be supported on this version. For further supports please refer to the latest release.\n* ***v0.3.11*** There are still version that is based on 22.+\n\n\n\n### Upcoming features:\n* Refer to discussion for headers [#299](https://github.com/cymcsg/UltimateRecyclerView/issues/299)\n* Refer to discussion for the loading more [#276](https://github.com/cymcsg/UltimateRecyclerView/issues/276)\n* Swipe issue and discussion [#296](https://github.com/cymcsg/UltimateRecyclerView/issues/296)\n* Wishlist for [UltiamteRecyclerview 0.4.2](UpcomingChanges.md)\n* and more.\n\n> Notice that it might not be the latest version\n\n### Demo App / Sample Code:\n* Due to rapid updates and developments we have decided to host the demo APK on github\n* Check out this link for [latest demonstration for the code](https://github.com/cymcsg/UltimateRecyclerView/releases)\n* Video demo for [grid layout demo](https://www.youtube.com/watch?v=iTnIf-N8m1Y)\n* or you can check it out already compiled at [Google Play](https://play.google.com/store/apps/details?id=com.marshalchen.ultimaterecyclerview.demo)\n* You can clone the project and compile it yourself (it includes a sample), or you can check it out already compiled at Google Play\n* You can read more usage in [wiki](https://github.com/cymcsg/UltimateRecyclerView/wiki) and welcome to make your own tutorials in here.\n\n#### Welcome to fork and PR (pull request)\nIf you have some good ideas, please tell us. My email is cymcsg # gmail.com.And it is a good idea to put your idea on the issue. If you want to use a rapid development framework for developing apps, you can try [UltimateAndroid Framework](https://github.com/cymcsg/UltimateAndroid).\n\n### Screenshot\n![ultimate_recyclerview](https://bytebucket.org/marshalchen/images/raw/44beb162121c719ea4094bd7ea1c9f0cd7de4c04/ultimaterecyclerview/ultimate_recyclerview11.gif)\n![ultimate_recyclerview](https://bytebucket.org/marshalchen/images/raw/44beb162121c719ea4094bd7ea1c9f0cd7de4c04/ultimaterecyclerview/ultimate_recyclerview12.gif)\n![ultimate_recyclerview](https://bytebucket.org/marshalchen/images/raw/44beb162121c719ea4094bd7ea1c9f0cd7de4c04/ultimaterecyclerview/ultimate_recyclerview7.gif)\n![ultimate_recyclerview](https://bytebucket.org/marshalchen/images/raw/f4794974d8de71ab1d0f0efddda556df7e792df2/ultimaterecyclerview/ultimate_recyclerview3.gif)\n![ultimate_recyclerview](https://bytebucket.org/marshalchen/images/raw/44beb162121c719ea4094bd7ea1c9f0cd7de4c04/ultimaterecyclerview/ultimate_recyclerview9.gif)\n![grid_layout](http://i.giphy.com/UVKEWEGu64z60.gif)\n![grid_layout](http://i.giphy.com/UKxCkkUHVH8Fq.gif)\n![admob](http://i.giphy.com/bExwitMhjtUqI.gif)\n![expandable](http://i.giphy.com/pLWHKsEdVlsKA.gif)\n![node](http://i.giphy.com/Xjf7Y8pZ84OxW.gif)\n![multitype](http://i.giphy.com/bvU4HcWvMhejm.gif)\n\n\n\n### Thanks\n* Use animators from  [recyclerview-animators](https://github.com/wasabeef/recyclerview-animators)\n* Deal with different types of LayoutManager from[SuperRecyclerView](https://github.com/Malinskiy/SuperRecyclerView)\n* Divider of recyclerview[RecyclerView-FlexibleDivider](https://github.com/yqritc/RecyclerView-FlexibleDivider)\n* Parallax header of the recyclerview[android-parallax-recyclerview](https://github.com/kanytu/android-parallax-recyclerview)\n* Floating action button [FloatingActionButton](https://github.com/futuresimple/android-floating-action-button)\n* Colorful pull to refresh [Ultra Pull To Refresh](https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh)\n* Sticky section headers in  RecyclerView [StickHeader](https://github.com/eowise/recyclerview-stickyheaders)\n* Swipe[AndroidSwipeLayout](https://github.com/daimajia/AndroidSwipeLayout)\n* Thanks [jjhesk](https://github.com/jjhesk) for doing so many work on the project\n\nIf there are someone who I do not mention here,please accept my sincerely appologies and tell me.\n\n<h2 ><a name=\"donations\"></a>Donations:</h2>\nDonate $9.99: [![$9.99](https://bytebucket.org/marshalchen/images/raw/9c442645492ddc10474416debf511a57a0367397/others/donate.jpg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=5GYRYZVNAK2G2)\n\nAlipay:![donate](https://bytebucket.org/marshalchen/images/raw/9c442645492ddc10474416debf511a57a0367397/others/alipay.png)\n\nBitcoin Donation Accepted\n![wallet](http://s32.postimg.org/sdd1oio1t/qrwallet.jpg)\n\n## License\n\n``` \nCopyright 2014-present Marshal Chen\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n```\n"
  },
  {
    "path": "UltimateRecyclerView/app/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion project.ANDROID_BUILD_SDK_VERSION as int\n\n    defaultConfig {\n        applicationId \"com.marshalchen.ultimaterecyclerview.demo\"\n        minSdkVersion project.ANDROID_BUILD_MIN_SDK_VERSION as int\n        targetSdkVersion project.ANDROID_BUILD_TARGET_SDK_VERSION as int\n        versionCode app_demo_versionCode\n        versionName app_demo_versionName\n        multiDexEnabled true\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n    lintOptions {\n        abortOnError false\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    namespace 'com.marshalchen.ultimaterecyclerview.demo'\n}\nrepositories {\n    flatDir {\n        dirs 'libs'\n    }\n    maven { url \"http://dl.bintray.com/jjhesk/maven\" }\n}\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    debugImplementation \"com.squareup.leakcanary:leakcanary-android:${LEAKCANARY}\"\n    implementation 'com.google.android.gms:play-services-ads:22.6.0'\n    implementation 'androidx.multidex:multidex:2.0.1'\n    implementation 'com.hkm.loyalslider:library:1.6.2'\n    implementation 'jp.wasabeef:recyclerview-animators:4.0.2'\n    //compile 'com.marshalchen.ultimaterecyclerview:library:0.8.0'\n    api project(':ultimaterecyclerview')\n    //used in the gridlayout\n    // compile 'com.hkm.loyalslider:library:1.4.5' exclude group: 'android.support.v13'\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/proguard-rules.pro",
    "content": "\n#-dontwarn com.squareup.haha.guava.**\n#-dontwarn com.squareup.haha.perflib.**\n#-dontwarn com.squareup.haha.trove.**\n-dontwarn com.squareup.leakcanary.**\n#-keep class com.squareup.haha.** { *; }\n-keep class com.squareup.leakcanary.** { *; }"
  },
  {
    "path": "UltimateRecyclerView/app/src/androidTest/java/com/marshalchen/ultimaterecyclerview/demo/ApplicationTest.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo;\n\nimport android.app.Application;\nimport android.test.ApplicationTestCase;\n\n/**\n * <a href=\"http://d.android.com/tools/testing/testing_android.html\">Testing Fundamentals</a>\n */\npublic class ApplicationTest extends ApplicationTestCase<Application> {\n    public ApplicationTest() {\n        super(Application.class);\n    }\n}"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    package=\"com.marshalchen.ultimaterecyclerview.demo\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />\n    <!-- Used to adjust the work load depending on the type of network the device is using. -->\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n    <!-- Used to load images from the gallery content provider. -->\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\" />\n\n    <application\n        android:name=\".modules.MainWatcher\"\n        android:allowBackup=\"true\"\n        android:icon=\"@drawable/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:theme=\"@style/AppTheme\"\n        tools:replace=\"android:icon,android:theme\">\n        <activity\n            android:name=\".MainList\"\n            android:label=\"@string/app_name\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n        <activity android:name=\".LauncherActivity\"></activity>\n        <activity\n            android:name=\".multiitemdemo.MultiViewTypesActivity\"\n            android:label=\"MultiViewTypesActivity\" />\n        <activity\n            android:name=\".griddemo.GridLayoutRVTest\"\n            android:label=\"GridLayoutRVTest\" />\n        <activity\n            android:name=\".griddemo.GridTestOnlyOnePage\"\n            android:label=\"GridLayoutRVTest\" />\n        <activity\n            android:name=\".loadmoredemo.PullToRefreshActivity\"\n            android:label=\"CustomSwipeToRefreshRefreshActivity\" />\n        <activity\n            android:name=\".loadmoredemo.DebugNoHeaderLoadMoreActivity\"\n            android:label=\"NO Header Load More\" />\n        <activity\n            android:name=\".loadmoredemo.FirstPageCancelLoadMore\"\n            android:label=\"Stop Loading loadmore\" />\n        <activity\n            android:name=\".loadmoredemo.LineNodeActivity\"\n            android:label=\"LineNodeActivity\" />\n        <activity\n            android:name=\".loadmoredemo.SliderHeader\"\n            android:label=\"Slider Header\" />\n        <activity\n            android:name=\".admobdemo.TestAdMobClassicActivity\"\n            android:label=\"TestAdMob\" />\n        <activity\n            android:name=\".expandemo.TestExpandableRV\"\n            android:label=\"TestExpandableRV\" />\n        <activity\n            android:name=\".loadmoredemo.DebugLoadMoreActivity\"\n            android:label=\"DebugLoadMoreActivity\" />\n        <activity\n            android:name=\".loadmoredemo.StaggerLoadMoreActivity\"\n            android:label=\"StaggerLoadMoreActivity\" />\n        <activity\n            android:name=\".loadmoredemo.FinalEmptyViewDisplayActivity\"\n            android:label=\"Display Final View\" />\n        <activity\n            android:name=\".scrollableobservable.ScrollObservablesActivity\"\n            android:label=\"ScrollObservablesActivity\" />\n        <activity\n            android:name=\".dragdemo.DragActivity\"\n            android:label=\"DragActivity\" />\n        <activity\n            android:name=\".loadmoredemo.SwipeListViewExampleActivity\"\n            android:label=\"SwipeListViewExampleActivity\" />\n        <activity\n            android:name=\".admobdemo.TestAdvancedAdmobActivity\"\n            android:label=\"TestAdvancedAdmobActivity\" />\n\n        <activity\n            android:name=\"com.google.android.gms.ads.AdActivity\"\n            android:configChanges=\"keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize\"\n            android:theme=\"@android:style/Theme.Translucent\" />\n        <!--This meta-data tag is required to use Google Play Services.-->\n        <meta-data\n            android:name=\"com.google.android.gms.version\"\n            android:value=\"@integer/google_play_services_version\" />\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/LauncherActivity.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo;\n\nimport android.graphics.Color;\nimport android.graphics.drawable.Drawable;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.appcompat.view.ActionMode;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\nimport androidx.appcompat.widget.Toolbar;\nimport androidx.recyclerview.widget.ItemTouchHelper;\nimport android.view.LayoutInflater;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.view.animation.OvershootInterpolator;\nimport android.widget.AdapterView;\nimport android.widget.ArrayAdapter;\nimport android.widget.Spinner;\n\nimport com.marshalchen.ultimaterecyclerview.URLogs;\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\nimport com.marshalchen.ultimaterecyclerview.demo.modules.FastBinding;\nimport com.marshalchen.ultimaterecyclerview.itemTouchHelper.SimpleItemTouchHelperCallback;\nimport com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.StickyRecyclerHeadersDecoration;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport jp.wasabeef.recyclerview.animators.*;\n\n/**\n * Created by Marshal Chen on 3/8/2016.\n */\npublic class LauncherActivity extends AppCompatActivity implements ActionMode.Callback {\n    UltimateRecyclerView ultimateRecyclerView;\n    SimpleAdapter simpleRecyclerViewAdapter = null;\n    LinearLayoutManager linearLayoutManager;\n    int moreNum = 2;\n    private ActionMode actionMode;\n\n    Toolbar toolbar;\n    boolean isDrag = true;\n\n    private ItemTouchHelper mItemTouchHelper;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_launcher);\n\n        toolbar = (Toolbar) findViewById(R.id.tool_bar);\n        setSupportActionBar(toolbar);\n        getSupportActionBar().setDisplayShowTitleEnabled(false);\n\n\n        ultimateRecyclerView = (UltimateRecyclerView) findViewById(R.id.ultimate_recycler_view);\n        ultimateRecyclerView.setHasFixedSize(false);\n        final List<String> stringList = new ArrayList<>();\n\n        stringList.add(\"111\");\n        stringList.add(\"aaa\");\n        stringList.add(\"222\");\n        stringList.add(\"33\");\n        stringList.add(\"44\");\n        stringList.add(\"55\");\n        stringList.add(\"66\");\n        stringList.add(\"11771\");\n        simpleRecyclerViewAdapter = new SimpleAdapter(stringList);\n\n        linearLayoutManager = new LinearLayoutManager(this);\n        ultimateRecyclerView.setLayoutManager(linearLayoutManager);\n\n        StickyRecyclerHeadersDecoration headersDecor = new StickyRecyclerHeadersDecoration(simpleRecyclerViewAdapter);\n        ultimateRecyclerView.addItemDecoration(headersDecor);\n////        ultimateRecyclerView.setEmptyView(getResources().getIdentifier(\"empty_view\",\"layout\",getPackageName()));\n//        ultimateRecyclerView.showEmptyView();\n        //  ultimateRecyclerView.enableLoadmore();\n        //simpleRecyclerViewAdapter.setCustomLoadMoreView(LayoutInflater.from(this)\n        //        .inflate(R.layout.custom_bottom_progressbar, null));\n\n        ultimateRecyclerView.setLoadMoreView(LayoutInflater.from(this)\n                .inflate(R.layout.custom_bottom_progressbar, null));\n        ultimateRecyclerView.setParallaxHeader(getLayoutInflater().inflate(R.layout.parallax_recyclerview_header, ultimateRecyclerView.mRecyclerView, false));\n//        //   ultimateRecyclerView.setNormalHeader(getLayoutInflater().inflate(R.layout.parallax_recyclerview_header, ultimateRecyclerView.mRecyclerView, false));\n        ultimateRecyclerView.setOnParallaxScroll(new UltimateRecyclerView.OnParallaxScroll() {\n            @Override\n            public void onParallaxScroll(float percentage, float offset, View parallax) {\n                Drawable c = toolbar.getBackground();\n                c.setAlpha(Math.round(127 + percentage * 128));\n                toolbar.setBackgroundDrawable(c);\n            }\n        });\n        ultimateRecyclerView.setRecylerViewBackgroundColor(Color.parseColor(\"#ffffff\"));\n        ultimateRecyclerView.setDefaultOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {\n            @Override\n            public void onRefresh() {\n                new Handler().postDelayed(new Runnable() {\n                    @Override\n                    public void run() {\n                        simpleRecyclerViewAdapter.insert(moreNum++ + \"  Refresh things\", 0);\n                        ultimateRecyclerView.setRefreshing(false);\n                        //   ultimateRecyclerView.scrollBy(0, -50);\n                        linearLayoutManager.scrollToPosition(0);\n//                        ultimateRecyclerView.setAdapter(simpleRecyclerViewAdapter);\n//                        simpleRecyclerViewAdapter.notifyDataSetChanged();\n                    }\n                }, 1000);\n            }\n        });\n\n        ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallback(simpleRecyclerViewAdapter);\n        mItemTouchHelper = new ItemTouchHelper(callback);\n        mItemTouchHelper.attachToRecyclerView(ultimateRecyclerView.mRecyclerView);\n        simpleRecyclerViewAdapter.setOnDragStartListener(new SimpleAdapter.OnStartDragListener() {\n            @Override\n            public void onStartDrag(RecyclerView.ViewHolder viewHolder) {\n                mItemTouchHelper.startDrag(viewHolder);\n            }\n        });\n        ultimateRecyclerView.reenableLoadmore();\n        ultimateRecyclerView.setAdapter(simpleRecyclerViewAdapter);\n\n        ultimateRecyclerView.setOnLoadMoreListener(new UltimateRecyclerView.OnLoadMoreListener() {\n            @Override\n            public void loadMore(int itemsCount, final int maxLastVisiblePosition) {\n                Handler handler = new Handler();\n                handler.postDelayed(new Runnable() {\n                    public void run() {\n                        simpleRecyclerViewAdapter.insert(\"More \" + moreNum++, simpleRecyclerViewAdapter.getAdapterItemCount());\n                        simpleRecyclerViewAdapter.insert(\"More \" + moreNum++, simpleRecyclerViewAdapter.getAdapterItemCount());\n                        simpleRecyclerViewAdapter.insert(\"More \" + moreNum++, simpleRecyclerViewAdapter.getAdapterItemCount());\n                        // linearLayoutManager.scrollToPositionWithOffset(maxLastVisiblePosition,-1);\n                        //   linearLayoutManager.scrollToPosition(maxLastVisiblePosition);\n\n                    }\n                }, 1000);\n            }\n        });\n\n//        ultimateRecyclerView.setDefaultSwipeToRefreshColorScheme(getResources().getColor(android.R.color.holo_blue_bright),\n//                getResources().getColor(android.R.color.holo_green_light),\n//                getResources().getColor(android.R.color.holo_orange_light),\n//                getResources().getColor(android.R.color.holo_red_light));\n\n//        ultimateRecyclerView.setScrollViewCallbacks(new ObservableScrollViewCallbacks() {\n//            @Override\n//            public void onScrollChanged(int scrollY, boolean firstScroll, boolean dragging) {\n//\n//            }\n//\n//            @Override\n//            public void onDownMotionEvent() {\n//\n//            }\n//\n//            @Override\n//            public void onUpOrCancelMotionEvent(ObservableScrollState observableScrollState) {\n////                if (observableScrollState == ObservableScrollState.DOWN) {\n////                    ultimateRecyclerView.showToolbar(toolbar, ultimateRecyclerView, getScreenHeight());\n////                    ultimateRecyclerView.showFloatingActionMenu();\n////                } else if (observableScrollState == ObservableScrollState.UP) {\n////                    ultimateRecyclerView.hideToolbar(toolbar, ultimateRecyclerView, getScreenHeight());\n////                    ultimateRecyclerView.hideFloatingActionMenu();\n////                } else if (observableScrollState == ObservableScrollState.STOP) {\n////                }\n//                URLogs.d(\"onUpOrCancelMotionEvent\");\n//                if (observableScrollState == ObservableScrollState.UP) {\n//                    ultimateRecyclerView.hideToolbar(toolbar, ultimateRecyclerView, getScreenHeight());\n//                    ultimateRecyclerView.hideFloatingActionMenu();\n//                } else if (observableScrollState == ObservableScrollState.DOWN) {\n//                    ultimateRecyclerView.showToolbar(toolbar, ultimateRecyclerView, getScreenHeight());\n//                    ultimateRecyclerView.showFloatingActionMenu();\n//                }\n//            }\n//        });\n\n        ultimateRecyclerView.showFloatingButtonView();\n//\n        Spinner spinner = (Spinner) findViewById(R.id.spinner);\n        ArrayAdapter<String> spinnerAdapter =\n                new ArrayAdapter<>(this, android.R.layout.simple_list_item_1);\n        for (Type type : Type.values()) {\n            spinnerAdapter.add(type.name());\n        }\n        spinner.setAdapter(spinnerAdapter);\n        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {\n            @Override\n            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {\n                ultimateRecyclerView.setItemAnimator(Type.values()[position].getAnimator());\n                ultimateRecyclerView.getItemAnimator().setAddDuration(500);\n                ultimateRecyclerView.getItemAnimator().setRemoveDuration(500);\n            }\n\n            @Override public void onNothingSelected(AdapterView<?> parent) {\n\n            }\n        });\n\n\n\n        findViewById(R.id.add).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                simpleRecyclerViewAdapter.insert(\"newly added item\", 1);\n            }\n        });\n\n        findViewById(R.id.del).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                simpleRecyclerViewAdapter.remove(1);\n            }\n        });\n\n//\n    }\n\n    private void toggleSelection(int position) {\n        simpleRecyclerViewAdapter.toggleSelection(position);\n        actionMode.setTitle(\"Selected \" + \"1\");\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n\n\n    }\n\n    public int getScreenHeight() {\n        return findViewById(android.R.id.content).getHeight();\n    }\n\n    @Override\n    public boolean onCreateActionMode(ActionMode mode, Menu menu) {\n        URLogs.d(\"actionmode---\" + (mode == null));\n        mode.getMenuInflater().inflate(R.menu.menu_main, menu);\n        return true;\n        //  return false;\n    }\n\n    /**\n     * Called to refresh an action mode's action menu whenever it is invalidated.\n     *\n     * @param mode ActionMode being prepared\n     * @param menu Menu used to populate action buttons\n     * @return true if the menu or action mode was updated, false otherwise.\n     */\n    @Override\n    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {\n        // swipeToDismissTouchListener.setEnabled(false);\n        this.actionMode = mode;\n        return false;\n    }\n\n\n    @Override\n    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {\n        return false;\n    }\n\n\n    @Override\n    public void onDestroyActionMode(ActionMode mode) {\n        this.actionMode = null;\n    }\n\n\n    //\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        // Inflate the menu; this adds items to the action bar if it is present.\n        getMenuInflater().inflate(R.menu.menu_main, menu);\n        return true;\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        FastBinding.startactivity(this, item.getItemId());\n        return super.onOptionsItemSelected(item);\n    }\n\n    enum Type {\n        FadeIn(new FadeInAnimator(new OvershootInterpolator(1f))),\n        FadeInDown(new FadeInDownAnimator(new OvershootInterpolator(1f))),\n        FadeInUp(new FadeInUpAnimator(new OvershootInterpolator(1f))),\n        FadeInLeft(new FadeInLeftAnimator(new OvershootInterpolator(1f))),\n        FadeInRight(new FadeInRightAnimator(new OvershootInterpolator(1f))),\n        Landing(new LandingAnimator(new OvershootInterpolator(1f))),\n        ScaleIn(new ScaleInAnimator(new OvershootInterpolator(1f))),\n        ScaleInTop(new ScaleInTopAnimator(new OvershootInterpolator(1f))),\n        ScaleInBottom(new ScaleInBottomAnimator(new OvershootInterpolator(1f))),\n        ScaleInLeft(new ScaleInLeftAnimator(new OvershootInterpolator(1f))),\n        ScaleInRight(new ScaleInRightAnimator(new OvershootInterpolator(1f))),\n        FlipInTopX(new FlipInTopXAnimator(new OvershootInterpolator(1f))),\n        FlipInBottomX(new FlipInBottomXAnimator(new OvershootInterpolator(1f))),\n        FlipInLeftY(new FlipInLeftYAnimator(new OvershootInterpolator(1f))),\n        FlipInRightY(new FlipInRightYAnimator(new OvershootInterpolator(1f))),\n        SlideInLeft(new SlideInLeftAnimator(new OvershootInterpolator(1f))),\n        SlideInRight(new SlideInRightAnimator(new OvershootInterpolator(1f))),\n        SlideInDown(new SlideInDownAnimator(new OvershootInterpolator(1f))),\n        SlideInUp(new SlideInUpAnimator(new OvershootInterpolator(1f))),\n        OvershootInRight(new OvershootInRightAnimator(1.0f)),\n        OvershootInLeft(new OvershootInLeftAnimator(1.0f));\n\n        private BaseItemAnimator mAnimator;\n\n        Type(BaseItemAnimator animator) {\n            mAnimator = animator;\n        }\n\n        public BaseItemAnimator getAnimator() {\n            return mAnimator;\n        }\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/MainList.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport androidx.appcompat.app.AppCompatActivity;\nimport android.view.View;\nimport android.widget.AdapterView;\nimport android.widget.ArrayAdapter;\nimport android.widget.ListView;\n\nimport com.marshalchen.ultimaterecyclerview.demo.admobdemo.TestAdMobClassicActivity;\nimport com.marshalchen.ultimaterecyclerview.demo.admobdemo.TestAdvancedAdmobActivity;\nimport com.marshalchen.ultimaterecyclerview.demo.expandemo.TestExpandableRV;\nimport com.marshalchen.ultimaterecyclerview.demo.griddemo.GridLayoutRVTest;\nimport com.marshalchen.ultimaterecyclerview.demo.griddemo.GridTestOnlyOnePage;\nimport com.marshalchen.ultimaterecyclerview.demo.loadmoredemo.DebugLoadMoreActivity;\nimport com.marshalchen.ultimaterecyclerview.demo.loadmoredemo.DebugNoHeaderLoadMoreActivity;\nimport com.marshalchen.ultimaterecyclerview.demo.loadmoredemo.FinalEmptyViewDisplayActivity;\nimport com.marshalchen.ultimaterecyclerview.demo.loadmoredemo.FirstPageCancelLoadMore;\nimport com.marshalchen.ultimaterecyclerview.demo.loadmoredemo.LineNodeActivity;\nimport com.marshalchen.ultimaterecyclerview.demo.loadmoredemo.PullToRefreshActivity;\nimport com.marshalchen.ultimaterecyclerview.demo.loadmoredemo.SliderHeader;\nimport com.marshalchen.ultimaterecyclerview.demo.loadmoredemo.StaggerLoadMoreActivity;\nimport com.marshalchen.ultimaterecyclerview.demo.loadmoredemo.SwipeListViewExampleActivity;\nimport com.marshalchen.ultimaterecyclerview.demo.multiitemdemo.MultiViewTypesActivity;\n\nimport java.util.ArrayList;\nimport java.util.LinkedHashMap;\nimport java.util.Map;\n\n/**\n * Created by hesk on 23/5/16.\n */\npublic class MainList extends AppCompatActivity implements AdapterView.OnItemClickListener {\n    ListView mList;\n    LinkedHashMap<String, Class> data = new LinkedHashMap<>();\n    ArrayList<Class> o = new ArrayList<>();\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n        mList = (ListView) findViewById(android.R.id.list);\n        ArrayList<String> items = new ArrayList<>();\n        initList();\n        for (Map.Entry<String, Class> entry : data.entrySet()) {\n            String key = entry.getKey();\n            items.add(key);\n            o.add(entry.getValue());\n        }\n        mList.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, items));\n        mList.setOnItemClickListener(this);\n    }\n\n    public void initList() {\n        data.put(\"LauncherActivity\", LauncherActivity.class);\n        data.put(\"Debug Grid Test\", GridLayoutRVTest.class);\n        data.put(\"Issue #374, #363 enabled and disable load more off screen\", GridTestOnlyOnePage.class);\n        data.put(\"Debug load more\", DebugLoadMoreActivity.class);\n        data.put(\"Debug no header\", DebugNoHeaderLoadMoreActivity.class);\n        data.put(\"Debug Final Empty\", FinalEmptyViewDisplayActivity.class);\n        data.put(\"Debug First Page Cancel Load More\", FirstPageCancelLoadMore.class);\n        data.put(\"Debug Line Node\", LineNodeActivity.class);\n        data.put(\"Debug Pull to refresh\", PullToRefreshActivity.class);\n        data.put(\"Debug Admob classic\", TestAdMobClassicActivity.class);\n        data.put(\"Debug Admob advanced\", TestAdvancedAdmobActivity.class);\n        data.put(\"Debug Slider Header\", SliderHeader.class);\n        data.put(\"Debug Stagger Load More\", StaggerLoadMoreActivity.class);\n        data.put(\"Debug Swipe List\", SwipeListViewExampleActivity.class);\n        data.put(\"Debug expandable\", TestExpandableRV.class);\n        data.put(\"Debug multi view types\", MultiViewTypesActivity.class);\n    }\n\n    @Override\n    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {\n        Intent intent = new Intent(this, o.get(position));\n        startActivity(intent);\n    }\n\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/SimpleAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo;\n\n/**\n * Created by Marshal Chen on 3/8/2016.\n */\n\nimport android.graphics.Color;\nimport androidx.core.view.MotionEventCompat;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\nimport android.widget.TextView;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder;\nimport com.marshalchen.ultimaterecyclerview.UltimateViewAdapter;\n\nimport java.security.SecureRandom;\nimport java.util.List;\n\n\npublic class SimpleAdapter extends UltimateViewAdapter {\n    private List<String> stringList;\n\n    public SimpleAdapter(List<String> stringList) {\n        this.stringList = stringList;\n    }\n\n\n    @Override\n    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {\n        if (position < getItemCount() && (customHeaderView != null ? position <= stringList.size() : position < stringList.size()) && (customHeaderView != null ? position > 0 : true)) {\n\n            ((ViewHolder) holder).textViewSample.setText(stringList.get(customHeaderView != null ? position - 1 : position));\n            // ((ViewHolder) holder).itemView.setActivated(selectedItems.get(position, false));\n            if (mDragStartListener != null) {\n//                ((ViewHolder) holder).imageViewSample.setOnTouchListener(new View.OnTouchListener() {\n//                    @Override\n//                    public boolean onTouch(View v, MotionEvent event) {\n//                        if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {\n//                            mDragStartListener.onStartDrag(holder);\n//                        }\n//                        return false;\n//                    }\n//                });\n\n                ((ViewHolder) holder).item_view.setOnTouchListener(new View.OnTouchListener() {\n                    @Override\n                    public boolean onTouch(View v, MotionEvent event) {\n                        return false;\n                    }\n                });\n            }\n        }\n\n    }\n\n    @Override\n    public int getAdapterItemCount() {\n        return stringList.size();\n    }\n\n    @Override\n    public RecyclerView.ViewHolder newFooterHolder(View view) {\n        // return new itemCommonBinder(view, false);\n        return new UltimateRecyclerviewViewHolder<>(view);\n    }\n\n    @Override\n    public RecyclerView.ViewHolder newHeaderHolder(View view) {\n        return new UltimateRecyclerviewViewHolder<>(view);\n    }\n\n    @Override\n    public UltimateRecyclerviewViewHolder onCreateViewHolder(ViewGroup parent) {\n        View v = LayoutInflater.from(parent.getContext())\n                .inflate(R.layout.recycler_view_adapter, parent, false);\n        ViewHolder vh = new ViewHolder(v);\n        return vh;\n    }\n\n\n    public void insert(String string, int position) {\n        insertInternal(stringList, string, position);\n    }\n\n    public void remove(int position) {\n        removeInternal(stringList, position);\n    }\n\n    public void clear() {\n        clearInternal(stringList);\n    }\n\n\n    public void swapPositions(int from, int to) {\n        swapPositions(stringList, from, to);\n    }\n\n\n    @Override\n    public long generateHeaderId(int position) {\n        // URLogs.d(\"position--\" + position + \"   \" + getItem(position));\n        if (getItem(position).length() > 0)\n            return getItem(position).charAt(0);\n        else return -1;\n    }\n\n    @Override\n    public RecyclerView.ViewHolder onCreateHeaderViewHolder(ViewGroup viewGroup) {\n        View view = LayoutInflater.from(viewGroup.getContext())\n                .inflate(R.layout.stick_header_item, viewGroup, false);\n        return new RecyclerView.ViewHolder(view) {\n        };\n    }\n\n    @Override\n    public void onBindHeaderViewHolder(RecyclerView.ViewHolder viewHolder, int position) {\n\n        TextView textView = (TextView) viewHolder.itemView.findViewById(R.id.stick_text);\n        textView.setText(String.valueOf(getItem(position).charAt(0)));\n//        viewHolder.itemView.setBackgroundColor(Color.parseColor(\"#AA70DB93\"));\n        viewHolder.itemView.setBackgroundColor(Color.parseColor(\"#AAffffff\"));\n        ImageView imageView = (ImageView) viewHolder.itemView.findViewById(R.id.stick_img);\n\n        SecureRandom imgGen = new SecureRandom();\n        switch (imgGen.nextInt(3)) {\n            case 0:\n                imageView.setImageResource(R.drawable.jr1);\n                break;\n            case 1:\n                imageView.setImageResource(R.drawable.jr2);\n                break;\n            case 2:\n                imageView.setImageResource(R.drawable.jr3);\n                break;\n        }\n\n    }\n\n    @Override\n    public void onItemMove(int fromPosition, int toPosition) {\n        if (fromPosition > 0 && toPosition > 0) {\n            swapPositions(fromPosition, toPosition);\n//        notifyItemMoved(fromPosition, toPosition);\n            super.onItemMove(fromPosition, toPosition);\n        }\n\n    }\n\n    @Override\n    public void onItemDismiss(int position) {\n        if (position > 0) {\n            remove(position);\n            // notifyItemRemoved(position);\n//        notifyDataSetChanged();\n            super.onItemDismiss(position);\n        }\n\n    }\n//\n//    private int getRandomColor() {\n//        SecureRandom rgen = new SecureRandom();\n//        return Color.HSVToColor(150, new float[]{\n//                rgen.nextInt(359), 1, 1\n//        });\n//    }\n\n    public void setOnDragStartListener(OnStartDragListener dragStartListener) {\n        mDragStartListener = dragStartListener;\n\n    }\n\n    class ViewHolder extends UltimateRecyclerviewViewHolder {\n\n        TextView textViewSample;\n        ImageView imageViewSample;\n        ProgressBar progressBarSample;\n        View item_view;\n\n        public ViewHolder(View itemView) {\n            super(itemView);\n//            itemView.setOnTouchListener(new SwipeDismissTouchListener(itemView, null, new SwipeDismissTouchListener.DismissCallbacks() {\n//                @Override\n//                public boolean canDismiss(Object token) {\n//                    Logs.d(\"can dismiss\");\n//                    return true;\n//                }\n//\n//                @Override\n//                public void onDismiss(View view, Object token) {\n//                   // Logs.d(\"dismiss\");\n//                    remove(getPosition());\n//\n//                }\n//            }));\n            textViewSample = (TextView) itemView.findViewById(\n                    R.id.textview);\n            imageViewSample = (ImageView) itemView.findViewById(R.id.imageview);\n            progressBarSample = (ProgressBar) itemView.findViewById(R.id.progressbar);\n            progressBarSample.setVisibility(View.GONE);\n            item_view = itemView.findViewById(R.id.itemview);\n        }\n\n        @Override\n        public void onItemSelected() {\n            itemView.setBackgroundColor(Color.LTGRAY);\n        }\n\n        @Override\n        public void onItemClear() {\n            itemView.setBackgroundColor(0);\n        }\n    }\n\n    public String getItem(int position) {\n        if (customHeaderView != null)\n            position--;\n        // URLogs.d(\"position----\"+position);\n        if (position >= 0 && position < stringList.size())\n            return stringList.get(position);\n        else return \"\";\n    }\n\n}"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/admobdemo/SingleItemCommonLayout.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.admobdemo;\n\nimport android.graphics.Color;\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\n\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.AdItemHolder;\n\n/**\n * Created by hesk on 24/2/16.\n */\npublic class SingleItemCommonLayout extends AdItemHolder {\n    public static final int layout = R.layout.rv_item_linear;\n    public TextView textViewSample;\n    public ImageView imageViewSample;\n    public ProgressBar progressBarSample;\n    public RelativeLayout item_view;\n    public SingleItemCommonLayout(View itemView, int type) {\n        super(itemView, type);\n    }\n\n    @Override\n    protected void bindNormal(View view) {\n        textViewSample = (TextView) itemView.findViewById(R.id.str_textview_holder);\n        imageViewSample = (ImageView) itemView.findViewById(R.id.str_image_holder);\n        progressBarSample = (ProgressBar) itemView.findViewById(R.id.str_progress_holder);\n        item_view = (RelativeLayout) itemView.findViewById(R.id.str_item_view);\n\n    }\n\n    @Override\n    protected void bindAd(View view) {\n\n    }\n\n\n    @Override\n    public void onItemSelected() {\n        itemView.setBackgroundColor(Color.LTGRAY);\n    }\n\n    @Override\n    public void onItemClear() {\n        itemView.setBackgroundColor(0);\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/admobdemo/SingleItemHolder.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.admobdemo;\n\nimport androidx.annotation.NonNull;\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\nimport android.widget.TextView;\n\nimport com.marshalchen.ultimaterecyclerview.URLogs;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.AdItemHolder;\n\n/**\n * Created by hesk on 24/2/16.\n */\npublic class SingleItemHolder extends AdItemHolder implements\n        View.OnClickListener, View.OnLongClickListener {\n    public TextView textViewSample, num;\n    public ImageView imageViewSample;\n    public ProgressBar progressBarSample;\n\n    public SingleItemHolder(View itemView, int type) {\n        super(itemView, type);\n    }\n\n    @Override\n    protected void bindNormal(View view) {\n        textViewSample = (TextView) itemView.findViewById(R.id.textview);\n        num = (TextView) itemView.findViewById(R.id.numb_coun);\n        imageViewSample = (ImageView) itemView.findViewById(R.id.imageview);\n        progressBarSample = (ProgressBar) itemView.findViewById(R.id.progressbar);\n        progressBarSample.setVisibility(View.GONE);\n    }\n\n    @Override\n    protected void bindAd(View view) {\n\n    }\n\n    @Override\n    public void onClick(@NonNull View v) {\n        URLogs.d(textViewSample.getText() + \" clicked!\");\n    }\n\n    @Override\n    public boolean onLongClick(@NonNull View v) {\n        URLogs.d(textViewSample.getText() + \" long clicked!\");\n        return true;\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/admobdemo/TestAdMobClassicActivity.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.admobdemo;\n\nimport android.graphics.Color;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.appcompat.widget.Toolbar;\nimport android.view.ActionMode;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.google.android.gms.ads.AdRequest;\nimport com.google.android.gms.ads.AdSize;\nimport com.google.android.gms.ads.AdView;\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.demo.modules.FastBinding;\nimport com.marshalchen.ultimaterecyclerview.demo.modules.SampleDataboxset;\n\nimport java.util.ArrayList;\n\n/**\n * Created by hesk on 20/5/15.\n */\npublic class TestAdMobClassicActivity extends AppCompatActivity {\n\n    private UltimateRecyclerView ultimateRecyclerView;\n    private ZeroStickyAdvertistmentAdapter simpleRecyclerViewAdapter = null;\n    private LinearLayoutManager linearLayoutManager;\n    private int moreNum = 2;\n    private ActionMode actionMode;\n\n    private Toolbar toolbar;\n    private boolean isDrag = true;\n\n    private boolean admob_test_mode = false;\n\n    private AdView createadmob() {\n        AdView mAdView = new AdView(this);\n        mAdView.setAdSize(AdSize.MEDIUM_RECTANGLE);\n        mAdView.setAdUnitId(\"ca-app-pub-3940256099942544/6300978111\");\n        mAdView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));\n        // Create an ad request.\n        AdRequest.Builder adRequestBuilder = new AdRequest.Builder();\n        if (admob_test_mode)\n            // Optionally populate the ad request builder.\n            adRequestBuilder.addTestDevice(AdRequest.DEVICE_ID_EMULATOR);\n        // Start loading the ad.\n        mAdView.loadAd(adRequestBuilder.build());\n        return mAdView;\n    }\n\n    private void enableSwipe() {\n\n\n    }\n\n    private void enableRefresh() {\n        ultimateRecyclerView.setDefaultOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {\n            @Override\n            public void onRefresh() {\n                new Handler().postDelayed(new Runnable() {\n                    @Override\n                    public void run() {\n                        simpleRecyclerViewAdapter.removeAll();\n                        ultimateRecyclerView.setRefreshing(false);\n                    }\n                }, 1000);\n            }\n        });\n\n    }\n\n    private void enableLoadMore() {\n        ultimateRecyclerView.setLoadMoreView(R.layout.custom_bottom_progressbar);\n        ultimateRecyclerView.setOnLoadMoreListener(new UltimateRecyclerView.OnLoadMoreListener() {\n            @Override\n            public void loadMore(final int itemsCount, final int maxLastVisiblePosition) {\n                Handler handler = new Handler();\n                handler.postDelayed(new Runnable() {\n                    public void run() {\n                        ArrayList<String> li = new ArrayList<String>();\n                        li.add(\"No. ====\" + itemsCount + \"=======\");\n                        SampleDataboxset.genItems(10, li);\n                        simpleRecyclerViewAdapter.insert(li);\n                    }\n                }, 1000);\n            }\n        });\n    }\n\n    private void enableEmptyView() {\n        ultimateRecyclerView.setEmptyView(\n                R.layout.empty_view,\n                UltimateRecyclerView.EMPTY_CLEAR_ALL,\n                UltimateRecyclerView.STARTWITH_ONLINE_ITEMS);\n    }\n\n    private void enableClick() {\n\n\n    }\n\n    private void impleAddDrop() {\n        findViewById(R.id.add).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                simpleRecyclerViewAdapter.insert(SampleDataboxset.newListFromGen(2));\n            }\n        });\n        findViewById(R.id.del).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                simpleRecyclerViewAdapter.removeAt(3);\n            }\n        });\n        findViewById(R.id.toggle).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                simpleRecyclerViewAdapter.removeAll();\n                ultimateRecyclerView.showEmptyView();\n            }\n        });\n    }\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_loadmore);\n        toolbar = (Toolbar) findViewById(R.id.tool_bar);\n        setSupportActionBar(toolbar);\n        getSupportActionBar().setDisplayShowTitleEnabled(false);\n        ultimateRecyclerView = (UltimateRecyclerView) findViewById(R.id.ultimate_recycler_view);\n        ultimateRecyclerView.setHasFixedSize(false);\n\n        /**\n         * wokring example 1 implementation of Admob banner with static Adview\n         */\n        //  simpleRecyclerViewAdapter = new admobdfpadapter(createadmob(), 5, stringList);\n        /**\n         * working example 2 with multiple called Adviews\n         */\n        simpleRecyclerViewAdapter = new ZeroStickyAdvertistmentAdapter(createadmob(), SampleDataboxset.newListFromGen());\n        linearLayoutManager = new LinearLayoutManager(this);\n        ultimateRecyclerView.setLayoutManager(linearLayoutManager);\n        ultimateRecyclerView.setAdapter(simpleRecyclerViewAdapter);\n        ultimateRecyclerView.setItemViewCacheSize(3);\n        ultimateRecyclerView.setRecylerViewBackgroundColor(Color.parseColor(\"#f5f5ff\"));\n        enableEmptyView();\n        enableRefresh();\n        enableLoadMore();\n        enableClick();\n        impleAddDrop();\n    }\n\n    private void toggleSelection(int position) {\n        simpleRecyclerViewAdapter.toggleSelection(position);\n        actionMode.setTitle(\"Selected \" + \"1\");\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n    }\n\n    public int getScreenHeight() {\n        return findViewById(android.R.id.content).getHeight();\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        // Inflate the menu; this adds items to the action bar if it is present.\n        getMenuInflater().inflate(R.menu.menu_main, menu);\n        return true;\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        FastBinding.startactivity(this, item.getItemId());\n        return super.onOptionsItemSelected(item);\n    }\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/admobdemo/TestAdvancedAdmobActivity.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.admobdemo;\n\nimport android.graphics.Color;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.appcompat.widget.Toolbar;\nimport android.util.DisplayMetrics;\nimport android.view.View;\nimport android.widget.AdapterView;\nimport android.widget.ArrayAdapter;\nimport android.widget.RelativeLayout;\nimport android.widget.Spinner;\nimport android.widget.TextView;\n\nimport com.google.android.gms.ads.AdListener;\nimport com.google.android.gms.ads.AdRequest;\nimport com.google.android.gms.ads.AdSize;\nimport com.google.android.gms.ads.AdView;\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.AdmobAdapter;\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.demo.modules.SampleDataboxset;\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.easyRegularAdapter;\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.BiAdAdapterSwitcher;\nimport com.marshalchen.ultimaterecyclerview.ui.AdGoogleDisplaySupport;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by hesk on 4/8/15.\n */\npublic class TestAdvancedAdmobActivity extends AppCompatActivity {\n    private UltimateRecyclerView ultimateRecyclerView;\n    private boolean admob_test_mode = false;\n    private LinearLayoutManager linearLayoutManager;\n    private Toolbar toolbar;\n    private BiAdAdapterSwitcher bi_sw;\n\n    public static class adap extends AdmobAdapter<RelativeLayout, String, SingleItemHolder> {\n\n        public adap(RelativeLayout v, List<String> L) {\n            super(v, false, 13, L, null);\n        }\n\n\n        @Override\n        protected int getNormalLayoutResId() {\n            return getIdRV();\n        }\n\n\n        @Override\n        protected SingleItemHolder newViewHolder(View mview) {\n            return new SingleItemHolder(mview, VIEW_TYPES.NORMAL);\n        }\n\n        /**\n         * binding normal view holder\n         *\n         * @param holder   holder class\n         * @param data     data\n         * @param position position\n         */\n        @Override\n        protected void withBindHolder(SingleItemHolder holder, String data, int position) {\n            bindthisInhere(holder, data, position);\n        }\n\n    }\n\n    public static class regular extends easyRegularAdapter<String, SingleItemHolder> {\n\n        public regular(List list) {\n            super(list);\n        }\n\n        @Override\n        protected int getNormalLayoutResId() {\n            return getIdRV();\n        }\n\n        @Override\n        protected SingleItemHolder newViewHolder(View view) {\n            return new SingleItemHolder(view, VIEW_TYPES.NORMAL);\n        }\n\n        @Override\n        protected void withBindHolder(SingleItemHolder holderm, String data, int position) {\n            bindthisInhere(holderm, data, position);\n        }\n    }\n\n    private static void bindthisInhere(SingleItemHolder d, String data, int pos) {\n        d.textViewSample.setText(data);\n        d.num.setText(\"@:\" + pos);\n    }\n\n    private static int getIdRV() {\n        return R.layout.countable_rv_adp;\n    }\n\n    private RelativeLayout createadmob() {\n\n        AdSize adSize = AdSize.SMART_BANNER;\n\n        DisplayMetrics dm = getResources().getDisplayMetrics();\n\n        double density = dm.density * 160;\n        double x = Math.pow(dm.widthPixels / density, 2);\n        double y = Math.pow(dm.heightPixels / density, 2);\n        double screenInches = Math.sqrt(x + y);\n\n        if (screenInches > 8) { // > 728 X 90\n            adSize = AdSize.LEADERBOARD;\n        } else if (screenInches > 6) { // > 468 X 60\n            adSize = AdSize.MEDIUM_RECTANGLE;\n        } else { // > 320 X 50\n            adSize = AdSize.BANNER;\n        }\n\n        adSize = AdSize.MEDIUM_RECTANGLE;\n        final AdView mAdView = new AdView(this);\n        mAdView.setAdSize(adSize);\n        mAdView.setAdUnitId(\"ca-app-pub-3940256099942544/6300978111\");\n        // Create an ad request.\n        AdRequest.Builder adRequestBuilder = new AdRequest.Builder();\n        if (admob_test_mode)\n            // Optionally populate the ad request builder.\n            adRequestBuilder.addTestDevice(AdRequest.DEVICE_ID_EMULATOR);\n        // Start loading the ad.\n        mAdView.loadAd(adRequestBuilder.build());\n        DisplayMetrics displaymetrics = new DisplayMetrics();\n        final RelativeLayout layout = AdGoogleDisplaySupport.initialSupport(this, displaymetrics);\n        final double ratio = AdGoogleDisplaySupport.ratioMatching(displaymetrics);\n        final int ad_height = AdGoogleDisplaySupport.defaultHeight(displaymetrics);\n        AdGoogleDisplaySupport.panelAdjust(mAdView, (int) (ad_height * ratio));\n        // get display info\n        /*  G.display_w = displayMetrics.widthPixels;\n        G.display_h = displayMetrics.heightPixels;\n        G.scale = Math.max(G.display_w/1280.0f, G.display_h/800.0f);*/\n        mAdView.setAdListener(new AdListener() {\n            @Override\n            public void onAdLoaded() {\n                super.onAdLoaded();\n                int h = mAdView.getLayoutParams().height;\n                AdGoogleDisplaySupport.scale(mAdView, ratio);\n                AdGoogleDisplaySupport.panelAdjust(mAdView, (int) (h * ratio));\n                //  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)\n            }\n        });\n        layout.addView(mAdView);\n        return layout;\n    }\n\n\n    /**\n     * example 1 implementation of the switch view\n     */\n    private BiAdAdapterSwitcher imple_switch_view(final UltimateRecyclerView rv) {\n        final adap adp1 = new adap(createadmob(), new ArrayList<String>());\n        final regular adp2 = new regular(new ArrayList<String>());\n        final BiAdAdapterSwitcher switchable = new BiAdAdapterSwitcher(rv, adp2, adp1);\n        return switchable;\n    }\n\n    private Handler osh = new Handler();\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_loadmore);\n        toolbar = (Toolbar) findViewById(R.id.tool_bar);\n        setSupportActionBar(toolbar);\n        getSupportActionBar().setDisplayShowTitleEnabled(false);\n        ultimateRecyclerView = (UltimateRecyclerView) findViewById(R.id.ultimate_recycler_view);\n        ultimateRecyclerView.setHasFixedSize(false);\n        linearLayoutManager = new LinearLayoutManager(this);\n        ultimateRecyclerView.setLayoutManager(linearLayoutManager);\n        ultimateRecyclerView.setRecylerViewBackgroundColor(Color.parseColor(\"#ffffff\"));\n\n\n        /**\n         *  example 2 implementation enhancement of list view\n         */\n        bi_sw = imple_switch_view(ultimateRecyclerView)\n                .onEnableRefresh(100)\n                .EnableAutoDisableLoadMoreByMaxPages()\n                .onEnableLoadmore(R.layout.custom_bottom_progressbar, 2000, new BiAdAdapterSwitcher.onLoadMore() {\n                    @Override\n                    public boolean request_start(int current_page_no, int itemsCount, int maxLastVisiblePosition, final BiAdAdapterSwitcher bi, boolean refresh) {\n\n\n                        osh.postDelayed(new Runnable() {\n                            @Override\n                            public void run() {\n                                bi.load_more_data(SampleDataboxset.newList(5));\n                                //test the max pages\n                                bi.setMaxPages(10);\n                            }\n                        }, 2000);\n\n                        return true;\n                    }\n                });\n\n        TextView b = (TextView) findViewById(R.id.del);\n        b.setText(\"with Ad\");\n        TextView a = (TextView) findViewById(R.id.add);\n        a.setText(\"with out Ad\");\n        a.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                /**\n                 *  example 2 implementation enhancement of list view\n                 *  without advertisement configurations\n                 */\n                bi_sw.init(false);\n            }\n\n        });\n        b.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                /**\n                 *  example 2 implementation enhancement of list view\n                 *  with advertisement configuration\n                 */\n                bi_sw.init(true);\n            }\n        });\n        setup_spinner();\n    }\n\n    private void remove_all_items() {\n        bi_sw.removeALL();\n    }\n\n    private void setup_spinner() {\n        final Spinner spinner = (Spinner) findViewById(R.id.spinner);\n        spinner.setPrompt(\"test functions\");\n        ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1);\n        spinnerAdapter.add(\"noth\");\n        spinnerAdapter.add(\"remove all\");\n        spinner.setAdapter(spinnerAdapter);\n        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {\n            @Override\n            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {\n                //  ultimateRecyclerView.setItemAnimator(Type.values()[position].getAnimator());\n                //   ultimateRecyclerView.getItemAnimator().setAddDuration(300);\n                //   ultimateRecyclerView.getItemAnimator().setRemoveDuration(300);\n                if (position == 1) {\n                    remove_all_items();\n                    spinner.setSelection(0, true);\n                }\n            }\n\n            @Override\n            public void onNothingSelected(AdapterView<?> parent) {\n\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/admobdemo/ZeroStickyAdvertistmentAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.admobdemo;\n\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.View;\n\nimport com.google.android.gms.ads.AdView;\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.AdmobAdapter;\n\nimport java.util.List;\n\n/**\n * Created by hesk on 20/5/15.\n */\npublic class ZeroStickyAdvertistmentAdapter extends AdmobAdapter<AdView, String, SingleItemCommonLayout> {\n\n\n    public ZeroStickyAdvertistmentAdapter(AdView v, List<String> f) {\n        super(v, false, 12, f);\n    }\n\n    public ZeroStickyAdvertistmentAdapter(AdView v, int e, List<String> f, AdviewListener listener) {\n        super(v, false, e, f, listener);\n    }\n\n    @Override\n    protected int getNormalLayoutResId() {\n        return SingleItemCommonLayout.layout;\n    }\n\n    @Override\n    protected SingleItemCommonLayout newViewHolder(View mview) {\n        return new SingleItemCommonLayout(mview, VIEW_TYPES.NORMAL);\n    }\n\n\n    /**\n     * binding normal view holder\n     *\n     * @param holder   holder class\n     * @param data     data\n     * @param position position\n     */\n    @Override\n    protected void withBindHolder(SingleItemCommonLayout holder, String data, int position) {\n        holder.textViewSample.setText(data);\n    }\n\n    @Override\n    public void onBindHeaderViewHolder(RecyclerView.ViewHolder viewHolder, int i) {\n        // TextView textView = (TextView) viewHolder.itemView;\n        // textView.setText(String.valueOf(getItem(i).charAt(0)));\n        //  viewHolder.itemView.setBackgroundColor(Color.parseColor(\"#AA70DB93\"));\n    }\n\n/*\n\n    @Override\n    public long getHeaderId(int position) {\n        if (position == 0) {\n            return -1;\n        } else {\n            return getItem(position).charAt(0);\n        }\n    }\n*/\n\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/dragdemo/DragActivity.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.dragdemo;\n\nimport android.os.Bundle;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\nimport androidx.appcompat.widget.Toolbar;\nimport android.view.Menu;\nimport android.view.MenuItem;\n\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.demo.modules.FastBinding;\n\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n\npublic class DragActivity extends AppCompatActivity {\n\n    RecyclerView ultimateRecyclerView;\n    DragAdatper simpleRecyclerViewAdapter = null;\n    LinearLayoutManager linearLayoutManager;\n    Toolbar toolbar;\n\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_drag);\n\n        toolbar = (Toolbar) findViewById(R.id.tool_bar);\n        setSupportActionBar(toolbar);\n        getSupportActionBar().setDisplayShowTitleEnabled(false);\n\n\n        ultimateRecyclerView = (RecyclerView) findViewById(R.id.ultimate_recycler_view);\n        ultimateRecyclerView.setHasFixedSize(false);\n        List<String> stringList = new ArrayList<>();\n\n        stringList.add(\"aa\");\n        stringList.add(\"bb\");\n        stringList.add(\"cc\");\n        stringList.add(\"dd\");\n\n        List<Integer> data = new ArrayList<>();\n\n        data.add(1);\n        data.add(2);\n        data.add(3);\n        data.add(4);\n        data.add(15);\n\n        simpleRecyclerViewAdapter = new DragAdatper(ultimateRecyclerView, data);\n        linearLayoutManager = new LinearLayoutManager(this);\n        ultimateRecyclerView.setLayoutManager(linearLayoutManager);\n        ultimateRecyclerView.setAdapter(simpleRecyclerViewAdapter);\n/*\n\n        Spinner spinner = (Spinner) findViewById(R.id.spinner);\n        ArrayAdapter<String> spinnerAdapter =\n                new ArrayAdapter<>(this, android.R.layout.simple_list_item_1);\n        for (Type type : Type.values()) {\n            spinnerAdapter.add(type.name());\n        }\n        spinner.setAdapter(spinnerAdapter);\n        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {\n            @Override\n            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {\n                ultimateRecyclerView.setItemAnimator(Type.values()[position].getAnimator());\n                ultimateRecyclerView.getItemAnimator().setAddDuration(300);\n                ultimateRecyclerView.getItemAnimator().setRemoveDuration(300);\n            }\n\n            @Override\n            public void onNothingSelected(AdapterView<?> parent) {\n\n            }\n        });\n*/\n\n\n    }\n\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n\n\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        // Inflate the menu; this adds items to the action bar if it is present.\n        getMenuInflater().inflate(R.menu.menu_main, menu);\n        return true;\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        FastBinding.startactivity(this, item.getItemId());\n        return super.onOptionsItemSelected(item);\n    }\n\n  /*  enum Type {\n        FadeIn(new FadeInAnimator()),\n        FadeInDown(new FadeInDownAnimator()),\n        FadeInUp(new FadeInUpAnimator()),\n        FadeInLeft(new FadeInLeftAnimator()),\n        FadeInRight(new FadeInRightAnimator()),\n        Landing(new LandingAnimator()),\n        ScaleIn(new ScaleInAnimator()),\n        ScaleInTop(new ScaleInTopAnimator()),\n        ScaleInBottom(new ScaleInBottomAnimator()),\n        ScaleInLeft(new ScaleInLeftAnimator()),\n        ScaleInRight(new ScaleInRightAnimator()),\n        FlipInTopX(new FlipInTopXAnimator()),\n        FlipInBottomX(new FlipInBottomXAnimator()),\n        FlipInLeftY(new FlipInLeftYAnimator()),\n        FlipInRightY(new FlipInRightYAnimator()),\n        SlideInLeft(new SlideInLeftAnimator()),\n        SlideInRight(new SlideInRightAnimator()),\n        SlideInDown(new SlideInDownAnimator()),\n        SlideInUp(new SlideInUpAnimator()),\n        OvershootInRight(new OvershootInRightAnimator()),\n        OvershootInLeft(new OvershootInLeftAnimator());\n\n        private BaseItemAnimator mAnimator;\n\n        Type(BaseItemAnimator animator) {\n            mAnimator = animator;\n        }\n\n        public BaseItemAnimator getAnimator() {\n            return mAnimator;\n        }\n    }\n*/\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/dragdemo/DragAdatper.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.dragdemo;\n\nimport android.graphics.Point;\nimport androidx.annotation.NonNull;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\nimport android.widget.TextView;\n\nimport com.marshalchen.ultimaterecyclerview.URLogs;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.dragsortadapter.DragSortAdapter;\nimport com.marshalchen.ultimaterecyclerview.dragsortadapter.NoForegroundShadowBuilder;\n\nimport java.util.List;\n\n\npublic class DragAdatper extends DragSortAdapter<DragAdatper.MainViewHolder> {\n    private List<Integer> stringList;\n\n    public DragAdatper(RecyclerView recyclerView, List<Integer> data) {\n        super(recyclerView);\n        this.stringList = data;\n    }\n\n    @Override public MainViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        LayoutInflater inflater = LayoutInflater.from(parent.getContext());\n        View view = inflater.inflate(R.layout.rv_item_linear, parent, false);\n        MainViewHolder holder = new MainViewHolder(this, view);\n        view.setOnClickListener(holder);\n        view.setOnLongClickListener(holder);\n        return holder;\n    }\n\n    @Override public void onBindViewHolder(final MainViewHolder holder, final int position) {\n        Integer itemId = stringList.get(position);\n        holder.textViewSample.setText(itemId + \"  \");\n        // NOTE: check for getDraggingId() match to set an \"invisible space\" while dragging\n//        holder.container.setVisibility(getDraggingId() == itemId ? View.INVISIBLE : View.VISIBLE);\n//        holder.container.postInvalidate();\n    }\n\n    @Override public long getItemId(int position) {\n       // URLogs.d(\"hashcode---\"+stringList.get(position).hashCode()+\"    \"+position);\n        return stringList.get(position).hashCode();\n    }\n    protected static int convertToOriginalPosition(int position, int dragInitial, int dragCurrent) {\n        if (dragInitial < 0 || dragCurrent < 0) {\n            // not dragging\n            return position;\n        } else {\n            if ((dragInitial == dragCurrent) ||\n                    ((position < dragInitial) && (position < dragCurrent)) ||\n                    (position > dragInitial) && (position > dragCurrent)) {\n                return position;\n            } else if (dragCurrent < dragInitial) {\n                if (position == dragCurrent) {\n                    return dragInitial;\n                } else {\n                    return position - 1;\n                }\n            } else { // if (dragCurrent > dragInitial)\n                if (position == dragCurrent) {\n                    return dragInitial;\n                } else {\n                    return position + 1;\n                }\n            }\n        }\n    }\n    @Override public int getItemCount() {\n        return stringList.size();\n    }\n\n    @Override public int getPositionForId(long id) {\n        return stringList.indexOf((int) id);\n    }\n\n    @Override public boolean move(int fromPosition, int toPosition) {\n        stringList.add(toPosition, stringList.remove(fromPosition));\n        return true;\n    }\n\n    static class MainViewHolder extends DragSortAdapter.ViewHolder implements\n            View.OnClickListener, View.OnLongClickListener {\n\n\n        TextView textViewSample;\n        ImageView imageViewSample;\n        ProgressBar progressBarSample;\n\n        public MainViewHolder(DragSortAdapter adapter, View itemView) {\n            super(adapter, itemView);\n            textViewSample = (TextView) itemView.findViewById(\n                    R.id.textview);\n            imageViewSample = (ImageView) itemView.findViewById(R.id.imageview);\n            progressBarSample = (ProgressBar) itemView.findViewById(R.id.progressbar);\n            progressBarSample.setVisibility(View.GONE);\n        }\n\n        @Override public void onClick(@NonNull View v) {\n            URLogs.d(textViewSample.getText() + \" clicked!\");\n        }\n\n        @Override public boolean onLongClick(@NonNull View v) {\n            startDrag();\n            return true;\n        }\n\n        @Override public View.DragShadowBuilder getShadowBuilder(View itemView, Point touchPoint) {\n            return new NoForegroundShadowBuilder(itemView, touchPoint);\n        }\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/expandemo/Category.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.expandemo;\n\nimport android.view.View;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\n\nimport com.marshalchen.ultimaterecyclerview.expanx.SmartItem;\nimport com.marshalchen.ultimaterecyclerview.expanx.Util.easyTemplateParent;\n\n/**\n * Created by hesk on 16/7/15.\n */\npublic class Category extends easyTemplateParent<SmartItem, RelativeLayout, TextView> {\n    public Category(View itemView) {\n        super(itemView);\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/expandemo/ExpCustomAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.expandemo;\n\nimport android.content.Context;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.View;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.expanx.SmartItem;\nimport com.marshalchen.ultimaterecyclerview.expanx.Util.DataUtil;\nimport com.marshalchen.ultimaterecyclerview.expanx.customizedAdapter;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by hesk on 16/7/15.\n */\npublic class ExpCustomAdapter extends customizedAdapter<Category, SubCategory> {\n    public ExpCustomAdapter(Context context) {\n        super(context);\n    }\n\n\n    public static List<SmartItem> getPreCodeMenu(String[] a, String[] b, String[] c) {\n        List<SmartItem> e = new ArrayList<>();\n        e.add(SmartItem.parent(\"hones\", \"open\", DataUtil.getSmallList(a)));\n        e.add(SmartItem.parent(\"XXX\", \"open\", DataUtil.getSmallList(b)));\n        e.add(SmartItem.parent(\"RIVER\", \"open\", DataUtil.getSmallList(c)));\n        return e;\n    }\n\n\n    /**\n     * please do work on this id the custom object is true\n     *\n     * @param parentview the inflated view\n     * @return the actual parent holder\n     */\n    @Override\n    protected Category iniCustomParentHolder(View parentview) {\n        return new Category(parentview);\n    }\n\n    /**\n     * please do work on this if the custom object is true\n     *\n     * @param childview the inflated view\n     * @return the actual child holder\n     */\n    @Override\n    protected SubCategory iniCustomChildHolder(View childview) {\n        return new SubCategory(childview);\n    }\n\n    @Override\n    protected int getLayoutResParent() {\n        return R.layout.exp_parent;\n    }\n\n    @Override\n    protected int getLayoutResChild() {\n        return R.layout.exp_child;\n    }\n\n    @Override\n    protected List<SmartItem> getChildrenByPath(String path, int depth, int position) {\n        return null;\n    }\n\n\n    @Override\n    public RecyclerView.ViewHolder newFooterHolder(View view) {\n        return new UltimateRecyclerviewViewHolder(view);\n    }\n\n    @Override\n    public RecyclerView.ViewHolder newHeaderHolder(View view) {\n        return new UltimateRecyclerviewViewHolder(view);\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/expandemo/SubCategory.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.expandemo;\n\nimport android.view.View;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\n\nimport com.marshalchen.ultimaterecyclerview.expanx.SmartItem;\nimport com.marshalchen.ultimaterecyclerview.expanx.Util.easyTemplateChild;\n\n/**\n * Created by hesk on 16/7/15.\n */\npublic class SubCategory extends easyTemplateChild<SmartItem, TextView, RelativeLayout> {\n    public SubCategory(View itemView) {\n        super(itemView);\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/expandemo/TestExpandableRV.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.expandemo;\n\nimport android.graphics.Color;\nimport android.os.Bundle;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.appcompat.widget.Toolbar;\nimport android.view.ActionMode;\nimport android.view.Menu;\nimport android.view.MenuItem;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.demo.modules.FastBinding;\n\n/**\n * Created by hesk on 16/7/15.\n */\npublic class TestExpandableRV extends AppCompatActivity {\n\n    private static String[] sampledatagroup1 = {\n            \"peter\", \"http://google\",\n            \"billy\", \"http://google\",\n            \"lisa\", \"http://google\",\n            \"visa\", \"http://google\"\n    };\n    private static String[] sampledatagroup2 = {\n            \"mother\", \"http://google\",\n            \"father\", \"http://google\",\n            \"son\", \"http://google\",\n            \"holy spirit\", \"http://google\",\n            \"god the son\", \"http://google\"\n    };\n    private static String[] sampledatagroup3 = {\n            \"SONY\", \"http://google\",\n            \"LG\", \"http://google\",\n            \"SAMSUNG\", \"http://google\",\n            \"XIAOMI\", \"http://google\",\n            \"HTC\", \"http://google\"\n    };\n\n\n    private UltimateRecyclerView ultimateRecyclerView;\n    private ExpCustomAdapter simpleRecyclerViewAdapter = null;\n    private LinearLayoutManager linearLayoutManager;\n    private int moreNum = 2;\n    private ActionMode actionMode;\n\n    private Toolbar toolbar;\n    boolean isDrag = true;\n\n    private boolean admob_test_mode = false;\n\n\n    private void enableSwipe() {\n\n\n    }\n\n\n    private void addExpandableFeatures() {\n        ultimateRecyclerView.getItemAnimator().setAddDuration(100);\n        ultimateRecyclerView.getItemAnimator().setRemoveDuration(100);\n        ultimateRecyclerView.getItemAnimator().setMoveDuration(200);\n        ultimateRecyclerView.getItemAnimator().setChangeDuration(100);\n    }\n\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_loadmore);\n        toolbar = (Toolbar) findViewById(R.id.tool_bar);\n        setSupportActionBar(toolbar);\n        getSupportActionBar().setDisplayShowTitleEnabled(false);\n        ultimateRecyclerView = (UltimateRecyclerView) findViewById(R.id.ultimate_recycler_view);\n        ultimateRecyclerView.setHasFixedSize(false);\n        /**\n         * this is the adapter for the expanx\n         */\n        simpleRecyclerViewAdapter = new ExpCustomAdapter(this);\n        simpleRecyclerViewAdapter.addAll(ExpCustomAdapter.getPreCodeMenu(sampledatagroup1, sampledatagroup2, sampledatagroup3), 0);\n\n        linearLayoutManager = new LinearLayoutManager(this);\n        ultimateRecyclerView.setLayoutManager(linearLayoutManager);\n        ultimateRecyclerView.setAdapter(simpleRecyclerViewAdapter);\n        ultimateRecyclerView.setRecylerViewBackgroundColor(Color.parseColor(\"#ffffff\"));\n        addExpandableFeatures();\n    }\n\n    private void toggleSelection(int position) {\n        simpleRecyclerViewAdapter.toggleSelection(position);\n        actionMode.setTitle(\"Selected \" + \"1\");\n    }\n\n    public int getScreenHeight() {\n        return findViewById(android.R.id.content).getHeight();\n    }\n\n    //\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        // Inflate the menu; this adds items to the action bar if it is present.\n        getMenuInflater().inflate(R.menu.menu_main, menu);\n        return true;\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        FastBinding.startactivity(this, item.getItemId());\n        return super.onOptionsItemSelected(item);\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/griddemo/GridJRAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.griddemo;\n\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateGridLayoutAdapter;\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.demo.modules.JRitem;\nimport com.marshalchen.ultimaterecyclerview.demo.rvComponents.itemGridCellBinder;\n\nimport java.util.List;\n\n/**\n * Created by hesk on 3/2/16.\n */\npublic class GridJRAdapter extends UltimateGridLayoutAdapter<JRitem, itemGridCellBinder> {\n\n    public GridJRAdapter(List<JRitem> hand) {\n        super(hand);\n    }\n\n    /**\n     * the layout id for the normal data\n     *\n     * @return the ID\n     */\n    @Override\n    protected int getNormalLayoutResId() {\n        return itemGridCellBinder.layout;\n    }\n\n    /**\n     * this is the Normal View Holder initiation\n     *\n     * @param view view\n     * @return holder\n     */\n    @Override\n    protected itemGridCellBinder newViewHolder(View view) {\n        return new itemGridCellBinder(view, true);\n    }\n\n\n    @Override\n    public long generateHeaderId(int position) {\n        return 0;\n    }\n\n    /**\n     * binding normal view holder\n     *\n     * @param holder   holder class\n     * @param data     data\n     * @param position position\n     */\n    @Override\n    protected void withBindHolder(itemGridCellBinder holder, JRitem data, int position) {\n\n    }\n\n    @Override\n    protected void bindNormal(itemGridCellBinder b, JRitem jRitem, int position) {\n        b.textViewSample.setText(jRitem.train_name);\n        b.imageViewSample.setImageResource(jRitem.photo_id);\n    }\n\n\n    @Override\n    public UltimateRecyclerviewViewHolder onCreateHeaderViewHolder(ViewGroup parent) {\n        return new UltimateRecyclerviewViewHolder(parent);\n    }\n\n    @Override\n    public itemGridCellBinder newFooterHolder(View view) {\n        return new itemGridCellBinder(view, false);\n    }\n\n    @Override\n    public itemGridCellBinder newHeaderHolder(View view) {\n        return new itemGridCellBinder(view, false);\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/griddemo/GridLayoutRVTest.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.griddemo;\n\nimport android.os.Bundle;\nimport android.os.Handler;\nimport androidx.annotation.LayoutRes;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.recyclerview.widget.DefaultItemAnimator;\nimport androidx.appcompat.widget.Toolbar;\nimport androidx.recyclerview.widget.ItemTouchHelper;\nimport android.util.DisplayMetrics;\nimport android.view.ActionMode;\nimport android.view.Display;\nimport android.view.LayoutInflater;\nimport android.view.View;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.demo.modules.JRitem;\nimport com.marshalchen.ultimaterecyclerview.demo.modules.SampleDataboxset;\nimport com.marshalchen.ultimaterecyclerview.grid.BasicGridLayoutManager;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by hesk on 24/8/15.\n */\npublic class GridLayoutRVTest extends AppCompatActivity {\n    protected UltimateRecyclerView listuv;\n    protected GridJRAdapter mGridAdapter = null;\n    private BasicGridLayoutManager mGridLayoutManager;\n    private int moreNum = 2, columns = 2;\n    private ActionMode actionMode;\n    private Toolbar mToolbar;\n    boolean isDrag = true;\n    private ItemTouchHelper mItemTouchHelper;\n    public static final String TAG = \"GLV\";\n\n    @LayoutRes\n    protected int getMainLayout() {\n        return R.layout.floatingbutton_grid_layout;\n    }\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(getMainLayout());\n        mToolbar = (Toolbar) findViewById(R.id.tool_bar);\n        setSupportActionBar(mToolbar);\n        getSupportActionBar().setDisplayShowTitleEnabled(true);\n        listuv = (UltimateRecyclerView) findViewById(R.id.ultimate_recycler_view);\n        mGridAdapter = new GridJRAdapter(getJRList());\n        mGridAdapter.setSpanColumns(columns);\n        mGridLayoutManager = new BasicGridLayoutManager(this, columns, mGridAdapter);\n        listuv.setLayoutManager(mGridLayoutManager);\n        listuv.setHasFixedSize(true);\n        listuv.setSaveEnabled(true);\n        listuv.setClipToPadding(false);\n\n\n        // mGridAdapter.setCustomLoadMoreView(LayoutInflater.from(this).inflate(R.layout.custom_bottom_progressbar, null));\n        listuv.setNormalHeader(setupHeaderView());\n        final Handler f = new Handler();\n        listuv.setOnLoadMoreListener(new UltimateRecyclerView.OnLoadMoreListener() {\n            @Override\n            public void loadMore(int itemsCount, int maxLastVisiblePosition) {\n                //   Log.d(TAG, itemsCount + \" :: \" + itemsCount);\n                f.postDelayed(new Runnable() {\n                    @Override\n                    public void run() {\n                        mGridAdapter.insert(SampleDataboxset.genJRList(5));\n                        afterAdd();\n                    }\n                }, 2000);\n            }\n        });\n\n        // listuv.enableLoadmore();\n        //    listuv.disableLoadmore();\n        listuv.setLoadMoreView(R.layout.custom_bottom_progressbar);\n\n        listuv.setAdapter(mGridAdapter);\n        listuv.setItemAnimator(new DefaultItemAnimator());\n\n        harness_control();\n    }\n\n    protected void afterAdd() {\n\n    }\n\n    private List<JRitem> getJRList() {\n        List<JRitem> team = new ArrayList<>();\n        //you can make your own test for starting-zero-data\n        //   team = SampleDataboxset.genJRList(2);\n        return team;\n    }\n\n    private void dimension_columns() {\n        Display display = getWindowManager().getDefaultDisplay();\n        DisplayMetrics outMetrics = new DisplayMetrics();\n        display.getMetrics(outMetrics);\n        float density = getResources().getDisplayMetrics().density;\n        float dpWidth = outMetrics.widthPixels / density;\n        columns = Math.round(dpWidth / 300);\n    }\n\n\n    private View setupHeaderView() {\n        View custom_header = LayoutInflater.from(this).inflate(R.layout.header_love, null, false);\n\n\n        return custom_header;\n    }\n\n    private void harness_control() {\n        findViewById(R.id.add).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                mGridAdapter.insert(SampleDataboxset.genJRList(4));\n            }\n        });\n\n        findViewById(R.id.del).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                mGridAdapter.removeLast();\n            }\n        });\n\n        findViewById(R.id.delall).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                mGridAdapter.removeAll();\n            }\n        });\n        findViewById(R.id.add_one).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                mGridAdapter.insertFirst(SampleDataboxset.genJRSingle());\n            }\n        });\n\n        findViewById(R.id.refresh).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                listuv.reenableLoadmore();\n            }\n        });\n\n\n    }\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/griddemo/GridStringAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.griddemo;\n\nimport androidx.recyclerview.widget.GridLayoutManager;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder;\nimport com.marshalchen.ultimaterecyclerview.UltimateGridLayoutAdapter;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.demo.modules.SampleDataboxset;\nimport com.marshalchen.ultimaterecyclerview.demo.rvComponents.itemGridCellBinder;\n\nimport java.util.List;\n\n/**\n * Created by hesk on 24/8/15.\n */\npublic class GridStringAdapter extends UltimateGridLayoutAdapter<String, itemGridCellBinder> {\n\n    public GridStringAdapter(List<String> hand) {\n        super(hand);\n    }\n\n    /**\n     * the layout id for the normal data\n     *\n     * @return the ID\n     */\n    @Override\n    protected int getNormalLayoutResId() {\n        return R.layout.grid_item;\n    }\n\n    /**\n     * this is the Normal View Holder initiation\n     *\n     * @param view view\n     * @return holder\n     */\n    @Override\n    protected itemGridCellBinder newViewHolder(View view) {\n        return new itemGridCellBinder(view, true);\n    }\n\n\n    @Override\n    public itemGridCellBinder newFooterHolder(View view) {\n        return new itemGridCellBinder(view, false);\n    }\n\n    @Override\n    public itemGridCellBinder newHeaderHolder(View view) {\n        return new itemGridCellBinder(view, false);\n    }\n\n\n    @Override\n    public long generateHeaderId(int position) {\n        return 0;\n    }\n\n    /**\n     * binding normal view holder\n     *\n     * @param holder   holder class\n     * @param data     data\n     * @param position position\n     */\n    @Override\n    protected void withBindHolder(itemGridCellBinder holder, String data, int position) {\n\n    }\n\n    @Override\n    public UltimateRecyclerviewViewHolder onCreateHeaderViewHolder(ViewGroup parent) {\n        return new UltimateRecyclerviewViewHolder(parent);\n    }\n\n    @Override\n    protected void bindNormal(itemGridCellBinder b, String s, int position) {\n        b.textViewSample.setText(s);\n        b.imageViewSample.setImageResource(SampleDataboxset.getGirlImageRandom());\n    }\n\n\n    //https://gist.github.com/yqritc/ccca77dc42f2364777e1\n    public static class GridSpan extends GridLayoutManager.SpanSizeLookup {\n        final private int columns;\n        final private int intervalRow;\n        final private GridStringAdapter mGridAdapter;\n\n        public GridSpan(int col, int intervalRow, GridStringAdapter mGridAdapter) {\n            this.columns = col;\n            this.intervalRow = intervalRow;\n            this.mGridAdapter = mGridAdapter;\n        }\n\n        /**\n         * Returns the number of span occupied by the item at <code>position</code>.\n         *\n         * @param position The adapter position of the item\n         * @return The number of spans occupied by the item at the provided position\n         */\n        @Override\n        public int getSpanSize(int position) {\n            if (position == mGridAdapter.getAdapterItemCount()) {\n                return columns;\n            } else {\n                int mIntervalHeader = columns * intervalRow;\n                int h = position % mIntervalHeader == 0 ? columns : 1;\n                return h;\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/griddemo/GridTestOnlyOnePage.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.griddemo;\n\nimport android.os.Bundle;\nimport android.os.Handler;\n\nimport com.marshalchen.ultimaterecyclerview.demo.modules.SampleDataboxset;\n\n/**\n * This is the fix the off screen detection issue\n * Created by hesk on 23/5/16.\n */\npublic class GridTestOnlyOnePage extends GridLayoutRVTest {\n\n    Handler poster = new Handler();\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        poster.postDelayed(new Runnable() {\n            @Override\n            public void run() {\n                listuv.reenableLoadmore();\n                mGridAdapter.insert(SampleDataboxset.genJRList(5));\n            }\n        }, 1000);\n    }\n\n    @Override\n    protected void afterAdd() {\n        listuv.disableLoadmore();\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/loadmoredemo/BasicFunctions.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.loadmoredemo;\n\nimport android.graphics.drawable.Drawable;\nimport android.os.Bundle;\nimport android.os.Handler;\n\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\nimport androidx.recyclerview.widget.StaggeredGridLayoutManager;\nimport androidx.appcompat.widget.Toolbar;\nimport android.view.ActionMode;\nimport android.view.View;\nimport android.widget.AdapterView;\nimport android.widget.ArrayAdapter;\nimport android.widget.Spinner;\n\nimport com.marshalchen.ultimaterecyclerview.DragDropTouchListener;\nimport com.marshalchen.ultimaterecyclerview.ItemTouchListenerAdapter;\nimport com.marshalchen.ultimaterecyclerview.ObservableScrollState;\nimport com.marshalchen.ultimaterecyclerview.ObservableScrollViewCallbacks;\nimport com.marshalchen.ultimaterecyclerview.URLogs;\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.layoutmanagers.ClassicSpanGridLayoutManager;\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.easyRegularAdapter;\nimport com.marshalchen.ultimaterecyclerview.ui.AnimationType;\nimport com.marshalchen.ultimaterecyclerview.layoutmanagers.ScrollSmoothLineaerLayoutManager;\n\n/**\n * Created by hesk on 19/2/16.\n */\npublic abstract class BasicFunctions extends AppCompatActivity {\n\n    protected UltimateRecyclerView ultimateRecyclerView;\n\n    protected void enableParallaxHeader() {\n        ultimateRecyclerView.setParallaxHeader(getLayoutInflater().inflate(R.layout.parallax_recyclerview_header, ultimateRecyclerView.mRecyclerView, false));\n        ultimateRecyclerView.setOnParallaxScroll(new UltimateRecyclerView.OnParallaxScroll() {\n            @Override\n            public void onParallaxScroll(float percentage, float offset, View parallax) {\n                Drawable c = toolbar.getBackground();\n                c.setAlpha(Math.round(127 + percentage * 128));\n                toolbar.setBackgroundDrawable(c);\n            }\n        });\n    }\n\n    protected void enableLoadMore() {\n        // StickyRecyclerHeadersDecoration headersDecor = new StickyRecyclerHeadersDecoration(simpleRecyclerViewAdapter);\n        // ultimateRecyclerView.addItemDecoration(headersDecor);\n        ultimateRecyclerView.setLoadMoreView(R.layout.custom_bottom_progressbar);\n\n        ultimateRecyclerView.setOnLoadMoreListener(new UltimateRecyclerView.OnLoadMoreListener() {\n            @Override\n            public void loadMore(int itemsCount, final int maxLastVisiblePosition) {\n                status_progress = true;\n                Handler handler = new Handler();\n                handler.postDelayed(new Runnable() {\n                    public void run() {\n\n                        onLoadmore();\n                        status_progress = false;\n                    }\n                }, 500);\n            }\n        });\n\n    }\n\n    protected abstract void onLoadmore();\n\n    protected abstract void onFireRefresh();\n\n    protected void enableRefresh() {\n//        ultimateRecyclerView.setDefaultOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {\n//            @Override\n//            public void onRefresh() {\n//                new Handler().postDelayed(new Runnable() {\n//                    @Override\n//                    public void run() {\n//                        onFireRefresh();\n//                    }\n//                }, 1000);\n//            }\n//        });\n        //        ultimateRecyclerView.setDefaultSwipeToRefreshColorScheme(getResources().getColor(android.R.color.holo_blue_bright),\n//                getResources().getColor(android.R.color.holo_green_light),\n//                getResources().getColor(android.R.color.holo_orange_light),\n//                getResources().getColor(android.R.color.holo_red_light));\n\n    }\n\n    protected final void configStaggerLayoutManager(UltimateRecyclerView rv, easyRegularAdapter ad) {\n        StaggeredGridLayoutManager gaggeredGridLayoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);\n        rv.setLayoutManager(gaggeredGridLayoutManager);\n    }\n\n    protected final void configGridLayoutManager(UltimateRecyclerView rv, easyRegularAdapter ad) {\n        final ClassicSpanGridLayoutManager mgm = new ClassicSpanGridLayoutManager(this, 2, ad);\n        rv.setLayoutManager(mgm);\n    }\n\n    protected final void configLinearLayoutManager(UltimateRecyclerView rv) {\n        final ScrollSmoothLineaerLayoutManager mgm = new ScrollSmoothLineaerLayoutManager(this, LinearLayoutManager.VERTICAL, false, 300);\n        rv.setLayoutManager(mgm);\n    }\n\n\n    protected final void enableScrollControl() {\n        ultimateRecyclerView.setScrollViewCallbacks(new ObservableScrollViewCallbacks() {\n            @Override\n            public void onScrollChanged(int scrollY, boolean firstScroll, boolean dragging) {\n                URLogs.d(\"onScrollChanged: \" + dragging);\n            }\n\n            @Override\n            public void onDownMotionEvent() {\n\n            }\n\n            @Override\n            public void onUpOrCancelMotionEvent(ObservableScrollState observableScrollState) {\n                URLogs.d(\"onUpOrCancelMotionEvent\");\n                if (observableScrollState == ObservableScrollState.UP) {\n                    ultimateRecyclerView.hideToolbar(toolbar, ultimateRecyclerView, getScreenHeight());\n                    ultimateRecyclerView.hideFloatingActionMenu();\n                } else if (observableScrollState == ObservableScrollState.DOWN) {\n                    ultimateRecyclerView.showToolbar(toolbar, ultimateRecyclerView, getScreenHeight());\n                    ultimateRecyclerView.showFloatingActionMenu();\n                }\n            }\n        });\n\n        ultimateRecyclerView.showFloatingButtonView();\n    }\n\n    protected void enableEmptyViewPolicy() {\n        //  ultimateRecyclerView.setEmptyView(R.layout.empty_view, UltimateRecyclerView.EMPTY_KEEP_HEADER_AND_LOARMORE);\n        //    ultimateRecyclerView.setEmptyView(R.layout.empty_view, UltimateRecyclerView.EMPTY_KEEP_HEADER);\n        //  ultimateRecyclerView.setEmptyView(R.layout.empty_view, UltimateRecyclerView.EMPTY_SHOW_LOADMORE_ONLY);\n        ultimateRecyclerView.setEmptyView(R.layout.empty_view, UltimateRecyclerView.EMPTY_CLEAR_ALL);\n    }\n\n    protected void enableSwipe() {\n\n    }\n\n    protected void enableItemClick() {\n        ItemTouchListenerAdapter itemTouchListenerAdapter = new ItemTouchListenerAdapter(ultimateRecyclerView.mRecyclerView,\n                new ItemTouchListenerAdapter.RecyclerViewOnItemClickListener() {\n                    @Override\n                    public void onItemClick(RecyclerView parent, View clickedView, int position) {\n                    }\n\n                    @Override\n                    public void onItemLongClick(RecyclerView parent, View clickedView, int position) {\n                        URLogs.d(\"onItemLongClick()\" + isDrag);\n                        if (isDrag) {\n                            URLogs.d(\"onItemLongClick()\" + isDrag);\n                            //   dragDropTouchListener.startDrag();\n                            //   ultimateRecyclerView.enableDefaultSwipeRefresh(false);\n                        }\n\n                    }\n                });\n        ultimateRecyclerView.mRecyclerView.addOnItemTouchListener(itemTouchListenerAdapter);\n    }\n\n    protected abstract void addButtonTrigger();\n\n    protected abstract void removeButtonTrigger();\n\n    protected void setupSpinnerSelection(Spinner sp, ArrayAdapter<String> adapter) {\n        adapter.add(\"- select -\");\n        /**\n         * a list of selection for other tests\n         */\n        for (Route type : Route.values()) {\n            adapter.add(type.getNameDisplay());\n        }\n        sp.setAdapter(adapter);\n        sp.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {\n            @Override\n            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {\n                if (position > 0) {\n                    Route.values()[position - 1].start(getApplication());\n                }\n            }\n\n            @Override\n            public void onNothingSelected(AdapterView<?> parent) {\n\n            }\n        });\n    }\n\n    protected void setupSpinnerAnimationSelection(Spinner spinner, ArrayAdapter<String> adapter) {\n        adapter.add(\"- animator -\");\n        for (AnimationType type : AnimationType.values()) {\n            adapter.add(type.name());\n        }\n        spinner.setAdapter(adapter);\n        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {\n            @Override\n            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {\n                if (position > 0) {\n                    ultimateRecyclerView.setItemAnimator(AnimationType.values()[position - 1].getAnimator());\n                    ultimateRecyclerView.getItemAnimator().setAddDuration(300);\n                    ultimateRecyclerView.getItemAnimator().setRemoveDuration(300);\n                }\n            }\n\n            @Override\n            public void onNothingSelected(AdapterView<?> parent) {\n\n            }\n        });\n\n    }\n\n    private void bButtons() {\n        findViewById(R.id.add).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                addButtonTrigger();\n            }\n        });\n\n        findViewById(R.id.del).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                removeButtonTrigger();\n            }\n        });\n\n        findViewById(R.id.toggle).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                toggleButtonTrigger();\n            }\n        });\n    }\n\n    protected void toggleButtonTrigger() {\n        if (!status_progress) {\n            isEnableAutoLoadMore = !isEnableAutoLoadMore;\n            if (isEnableAutoLoadMore) {\n                ultimateRecyclerView.reenableLoadmore();\n            }\n        }\n    }\n\n    protected ActionMode actionMode;\n    protected Toolbar toolbar;\n    protected LinearLayoutManager linearLayoutManager;\n    private int moreNum = 2;\n    protected boolean isDrag = true, isEnableAutoLoadMore = true, status_progress = false;\n    private DragDropTouchListener dragDropTouchListener;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_loadmore);\n        toolbar = (Toolbar) findViewById(R.id.tool_bar);\n        setSupportActionBar(toolbar);\n        getSupportActionBar().setDisplayShowTitleEnabled(false);\n        ultimateRecyclerView = (UltimateRecyclerView) findViewById(R.id.ultimate_recycler_view);\n        doURV(ultimateRecyclerView);\n        bButtons();\n        ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1);\n        setupSpinnerSelection((Spinner) findViewById(R.id.spinner), spinnerAdapter);\n    }\n\n    public int getScreenHeight() {\n        return findViewById(android.R.id.content).getHeight();\n    }\n\n\n    protected abstract void doURV(UltimateRecyclerView urv);\n\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/loadmoredemo/DebugLoadMoreActivity.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.loadmoredemo;\n\nimport android.graphics.Color;\n\nimport com.marshalchen.ultimaterecyclerview.ui.swipe.SwipeableRecyclerViewTouchListener;\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.demo.rvComponents.sectionZeroAdapter;\nimport com.marshalchen.ultimaterecyclerview.demo.modules.SampleDataboxset;\nimport com.marshalchen.ultimaterecyclerview.ui.swipe.defaultRegularSwipe;\n\nimport java.util.ArrayList;\n\n/**\n * Created by hesk on 7/1/2015.\n */\npublic class DebugLoadMoreActivity extends BasicFunctions {\n\n    private sectionZeroAdapter simpleRecyclerViewAdapter = null;\n\n    @Override\n    protected void enableEmptyViewPolicy() {\n        //  ultimateRecyclerView.setEmptyView(R.layout.empty_view, UltimateRecyclerView.EMPTY_KEEP_HEADER_AND_LOARMORE);\n        //    ultimateRecyclerView.setEmptyView(R.layout.empty_view, UltimateRecyclerView.EMPTY_KEEP_HEADER);\n        ultimateRecyclerView.setEmptyView(R.layout.empty_view, UltimateRecyclerView.EMPTY_SHOW_LOADMORE_ONLY);\n    }\n\n\n    @Override\n    protected void onLoadmore() {\n\n        //    SampleDataboxset.insertMore(simpleRecyclerViewAdapter, 2);\n\n        SampleDataboxset.insertMoreWhole(simpleRecyclerViewAdapter, 2);\n\n        //  linearLayoutManager.scrollToPositionWithOffset(maxLastVisiblePosition, -1);\n\n        //  linearLayoutManager.scrollToPosition(maxLastVisiblePosition);\n        /**\n         * this is the example for making the function test for loading more and disable loading more\n         */\n                        /* if (isEnableAutoLoadMore) {\n                            ultimateRecyclerView.enableLoadmore();\n                        } else {\n                            ultimateRecyclerView.disableLoadmore();\n                        }*/\n    }\n\n    @Override\n    protected void enableSwipe() {\n        super.enableSwipe();\n        ultimateRecyclerView.addOnItemTouchListener(new SwipeableRecyclerViewTouchListener(ultimateRecyclerView.mRecyclerView, new defaultRegularSwipe<>(simpleRecyclerViewAdapter)));\n    }\n\n    @Override\n    protected void addButtonTrigger() {\n        simpleRecyclerViewAdapter.insertFirst(\"rand added item\");\n        ultimateRecyclerView.reenableLoadmore();\n    }\n\n    @Override\n    protected void removeButtonTrigger() {\n        simpleRecyclerViewAdapter.removeLast();\n    }\n\n    @Override\n    protected void onFireRefresh() {\n        // simpleRecyclerViewAdapter.insertLast(moreNum++ + \"  Refresh things\");\n        ultimateRecyclerView.setRefreshing(false);\n        //   ultimateRecyclerView.scrollBy(0, -50);\n        linearLayoutManager.scrollToPosition(0);\n        //ultimateRecyclerView.setAdapter(simpleRecyclerViewAdapter);\n        //simpleRecyclerViewAdapter.notifyDataSetChanged();\n        simpleRecyclerViewAdapter.removeAll();\n        ultimateRecyclerView.disableLoadmore();\n        //ultimateRecyclerView.showEmptyView();\n    }\n\n    @Override\n    protected void doURV(UltimateRecyclerView ultimateRecyclerView) {\n        ultimateRecyclerView.setHasFixedSize(false);\n        simpleRecyclerViewAdapter = new sectionZeroAdapter(new ArrayList<String>());\n        configLinearLayoutManager(ultimateRecyclerView);\n        enableParallaxHeader();\n        enableEmptyViewPolicy();\n        enableLoadMore();\n        ultimateRecyclerView.setRecylerViewBackgroundColor(Color.parseColor(\"#ffff66ff\"));\n        enableRefresh();\n        // enableScrollControl();\n        // enableSwipe();\n        // enableItemClick();\n        //ultimateRecyclerView.setItemViewCacheSize(simpleRecyclerViewAdapter.getAdditionalItems());\n        ultimateRecyclerView.setAdapter(simpleRecyclerViewAdapter);\n    }\n\n\n    private void toggleSelection(int position) {\n        simpleRecyclerViewAdapter.toggleSelection(position);\n        actionMode.setTitle(\"Selected \" + \"1\");\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n\n\n    }\n\n    //\n/*    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        // Inflate the menu; this adds items to the action bar if it is present.\n        getMenuInflater().inflate(R.menu.menu_main, menu);\n        return true;\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        FastBinding.startactivity(this, item.getItemId());\n        return super.onOptionsItemSelected(item);\n    }*/\n\n  /*  enum Type {\n        FadeIn(new FadeInAnimator()),\n        FadeInDown(new FadeInDownAnimator()),\n        FadeInUp(new FadeInUpAnimator()),\n        FadeInLeft(new FadeInLeftAnimator()),\n        FadeInRight(new FadeInRightAnimator()),\n        Landing(new LandingAnimator()),\n        ScaleIn(new ScaleInAnimator()),\n        ScaleInTop(new ScaleInTopAnimator()),\n        ScaleInBottom(new ScaleInBottomAnimator()),\n        ScaleInLeft(new ScaleInLeftAnimator()),\n        ScaleInRight(new ScaleInRightAnimator()),\n        FlipInTopX(new FlipInTopXAnimator()),\n        FlipInBottomX(new FlipInBottomXAnimator()),\n        FlipInLeftY(new FlipInLeftYAnimator()),\n        FlipInRightY(new FlipInRightYAnimator()),\n        SlideInLeft(new SlideInLeftAnimator()),\n        SlideInRight(new SlideInRightAnimator()),\n        SlideInDown(new SlideInDownAnimator()),\n        SlideInUp(new SlideInUpAnimator()),\n        OvershootInRight(new OvershootInRightAnimator()),\n        OvershootInLeft(new OvershootInLeftAnimator());\n\n        private BaseItemAnimator mAnimator;\n\n        Type(BaseItemAnimator animator) {\n            mAnimator = animator;\n        }\n\n        public BaseItemAnimator getAnimator() {\n            return mAnimator;\n        }\n    }*/\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/loadmoredemo/DebugNoHeaderLoadMoreActivity.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.loadmoredemo;\n\nimport android.graphics.Color;\nimport android.view.LayoutInflater;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.demo.rvComponents.sectionZeroAdapter;\nimport com.marshalchen.ultimaterecyclerview.demo.modules.SampleDataboxset;\n\nimport java.util.ArrayList;\n\n/**\n * Created by hesk on 19/2/16.\n */\npublic class DebugNoHeaderLoadMoreActivity extends BasicFunctions {\n    private sectionZeroAdapter simpleRecyclerViewAdapter = null;\n\n    @Override\n    protected void enableEmptyViewPolicy() {\n        ultimateRecyclerView.setEmptyView(R.layout.empty_view, UltimateRecyclerView.EMPTY_KEEP_HEADER_AND_LOARMORE);\n        //    ultimateRecyclerView.setEmptyView(R.layout.empty_view, UltimateRecyclerView.EMPTY_KEEP_HEADER);\n        //   ultimateRecyclerView.setEmptyView(R.layout.empty_view, UltimateRecyclerView.EMPTY_KEEP_HEADER_AND_LOARMORE);\n\n\n    }\n\n    @Override\n    protected void onLoadmore() {\n        SampleDataboxset.insertMoreWhole(simpleRecyclerViewAdapter, 2);\n    }\n\n    @Override\n    protected void onFireRefresh() {\n        // simpleRecyclerViewAdapter.insertLast(moreNum++ + \"  Refresh things\");\n        ultimateRecyclerView.setRefreshing(false);\n        //   ultimateRecyclerView.scrollBy(0, -50);\n        //  linearLayoutManager.scrollToPosition(0);\n        ultimateRecyclerView.scrollVerticallyTo(0);\n        //ultimateRecyclerView.setAdapter(simpleRecyclerViewAdapter);\n        //simpleRecyclerViewAdapter.notifyDataSetChanged();\n        simpleRecyclerViewAdapter.removeAll();\n        ultimateRecyclerView.disableLoadmore();\n        ultimateRecyclerView.showEmptyView();\n    }\n\n    @Override\n    protected void doURV(UltimateRecyclerView ultimateRecyclerView) {\n        //  ultimateRecyclerView.setInflater(LayoutInflater.from(getApplicationContext()));\n        ultimateRecyclerView.setHasFixedSize(false);\n        ArrayList<String> list = new ArrayList<>();\n        list.add(\"o2fn31\");\n        list.add(\"of2n32\");\n        list.add(\"of3n36\");\n        simpleRecyclerViewAdapter = new sectionZeroAdapter(list);\n        configLinearLayoutManager(ultimateRecyclerView);\n        //enableParallaxHeader();\n        enableEmptyViewPolicy();\n        enableLoadMore();\n        ultimateRecyclerView.setRecylerViewBackgroundColor(Color.parseColor(\"#ff4fcccf\"));\n        enableRefresh();\n        // enableScrollControl();\n        // enableSwipe();\n        // enableItemClick();\n        ultimateRecyclerView.setItemViewCacheSize(simpleRecyclerViewAdapter.getAdditionalItems());\n\n\n        ultimateRecyclerView.setAdapter(simpleRecyclerViewAdapter);\n    }\n\n    @Override\n    protected void addButtonTrigger() {\n        simpleRecyclerViewAdapter.insertLast(\"++ new Item\");\n        ultimateRecyclerView.reenableLoadmore();\n    }\n\n    @Override\n    protected void removeButtonTrigger() {\n        simpleRecyclerViewAdapter.removeLast();\n    }\n\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/loadmoredemo/FinalEmptyViewDisplayActivity.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.loadmoredemo;\n\nimport android.graphics.Color;\nimport android.os.Handler;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.demo.rvComponents.sectionZeroAdapter;\nimport com.marshalchen.ultimaterecyclerview.demo.modules.SampleDataboxset;\nimport com.marshalchen.ultimaterecyclerview.ui.emptyview.emptyViewOnShownListener;\n\nimport java.util.ArrayList;\n\n/**\n * Created by hesk on 25/2/16.\n */\npublic class FinalEmptyViewDisplayActivity extends BasicFunctions implements emptyViewOnShownListener {\n    private sectionZeroAdapter simpleRecyclerViewAdapter = null;\n    private Handler time_count = new Handler();\n    private int time = 0;\n\n    @Override\n    protected void onLoadmore() {\n        time_count.postDelayed(new Runnable() {\n            @Override\n            public void run() {\n                SampleDataboxset.insertMoreWhole(simpleRecyclerViewAdapter, 5);\n            }\n        }, 1000);\n    }\n\n    @Override\n    protected void onFireRefresh() {\n        time_count.postDelayed(new Runnable() {\n            @Override\n            public void run() {\n                ultimateRecyclerView.setRefreshing(false);\n            }\n        }, 1000);\n    }\n\n    @Override\n    protected void enableEmptyViewPolicy() {\n        //  ultimateRecyclerView.setEmptyView(R.layout.empty_view, UltimateRecyclerView.EMPTY_KEEP_HEADER_AND_LOARMORE);\n        //    ultimateRecyclerView.setEmptyView(R.layout.empty_view, UltimateRecyclerView.EMPTY_KEEP_HEADER);\n        ultimateRecyclerView.setEmptyView(R.layout.empty_view_v2, UltimateRecyclerView.EMPTY_CLEAR_ALL, this);\n    }\n\n\n    @Override\n    protected void doURV(UltimateRecyclerView urv) {\n        ultimateRecyclerView.setHasFixedSize(false);\n        simpleRecyclerViewAdapter = new sectionZeroAdapter(new ArrayList<String>());\n        configLinearLayoutManager(ultimateRecyclerView);\n\n        enableEmptyViewPolicy();\n        enableLoadMore();\n        ultimateRecyclerView.setRecylerViewBackgroundColor(Color.parseColor(\"#ff4fcccf\"));\n        enableRefresh();\n\n\n        ultimateRecyclerView.setAdapter(simpleRecyclerViewAdapter);\n    }\n\n    @Override\n    protected void addButtonTrigger() {\n        SampleDataboxset.insertMoreWhole(simpleRecyclerViewAdapter, 3);\n        ultimateRecyclerView.reenableLoadmore();\n    }\n\n    @Override\n    protected void removeButtonTrigger() {\n        simpleRecyclerViewAdapter.removeAll();\n        ultimateRecyclerView.showEmptyView();\n    }\n\n    @Override\n    protected void toggleButtonTrigger() {\n        simpleRecyclerViewAdapter.removeAll();\n        ultimateRecyclerView.showEmptyView();\n        ultimateRecyclerView.disableLoadmore();\n\n    }\n\n    @Override\n    public void onEmptyViewShow(View mView) {\n        TextView tv = (TextView) mView.findViewById(R.id.exp_section_title);\n        if (tv != null) {\n            StringBuilder sb = new StringBuilder();\n            sb.append(\"Your pressed at \\\"\");\n            sb.append(time);\n            sb.append(\"\\\" and that is not found.\");\n            tv.setText(sb.toString());\n        }\n        time++;\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/loadmoredemo/FirstPageCancelLoadMore.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.loadmoredemo;\n\nimport android.graphics.Color;\nimport android.os.Handler;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.demo.rvComponents.sectionZeroAdapter;\nimport com.marshalchen.ultimaterecyclerview.demo.modules.SampleDataboxset;\n\nimport java.util.ArrayList;\n\n/**\n * Created by hesk on 25/2/16.\n */\npublic class FirstPageCancelLoadMore extends BasicFunctions {\n    private sectionZeroAdapter simpleRecyclerViewAdapter = null;\n    private Handler time_count = new Handler();\n\n    @Override\n    protected void enableEmptyViewPolicy() {\n        //  ultimateRecyclerView.setEmptyView(R.layout.empty_view, UltimateRecyclerView.EMPTY_KEEP_HEADER_AND_LOARMORE);\n        //    ultimateRecyclerView.setEmptyView(R.layout.empty_view, UltimateRecyclerView.EMPTY_KEEP_HEADER);\n        ultimateRecyclerView.setEmptyView(R.layout.empty_view, UltimateRecyclerView.EMPTY_KEEP_HEADER_AND_LOARMORE);\n    }\n\n    @Override\n    protected void onLoadmore() {\n        time_count.postDelayed(new Runnable() {\n            @Override\n            public void run() {\n                SampleDataboxset.insertMoreWhole(simpleRecyclerViewAdapter, 2);\n                ultimateRecyclerView.disableLoadmore();\n            }\n        }, 1000);\n    }\n\n    @Override\n    protected void onFireRefresh() {\n        // simpleRecyclerViewAdapter.insertLast(moreNum++ + \"  Refresh things\");\n        ultimateRecyclerView.setRefreshing(false);\n        //   ultimateRecyclerView.scrollBy(0, -50);\n        linearLayoutManager.scrollToPosition(0);\n        //ultimateRecyclerView.setAdapter(simpleRecyclerViewAdapter);\n        //simpleRecyclerViewAdapter.notifyDataSetChanged();\n        simpleRecyclerViewAdapter.removeAll();\n        ultimateRecyclerView.disableLoadmore();\n        ultimateRecyclerView.showEmptyView();\n    }\n\n    @Override\n    protected void doURV(UltimateRecyclerView urv) {\n        ultimateRecyclerView.setHasFixedSize(false);\n        simpleRecyclerViewAdapter = new sectionZeroAdapter(new ArrayList<String>());\n        configLinearLayoutManager(ultimateRecyclerView);\n\n        enableEmptyViewPolicy();\n        enableLoadMore();\n        ultimateRecyclerView.setRecylerViewBackgroundColor(Color.parseColor(\"#ff4fcccf\"));\n        enableRefresh();\n\n\n        ultimateRecyclerView.setAdapter(simpleRecyclerViewAdapter);\n    }\n\n    @Override\n    protected void addButtonTrigger() {\n        SampleDataboxset.insertMoreWhole(simpleRecyclerViewAdapter, 3);\n        ultimateRecyclerView.reenableLoadmore();\n    }\n\n    @Override\n    protected void removeButtonTrigger() {\n        simpleRecyclerViewAdapter.removeAll();\n    }\n\n    @Override\n    protected void toggleButtonTrigger() {\n        if (!status_progress) {\n            isEnableAutoLoadMore = !isEnableAutoLoadMore;\n            if (isEnableAutoLoadMore) {\n                ultimateRecyclerView.reenableLoadmore();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/loadmoredemo/LineNodeActivity.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.loadmoredemo;\n\nimport android.graphics.Color;\nimport android.os.Handler;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\nimport com.marshalchen.ultimaterecyclerview.demo.modules.TimeLineModel;\nimport com.marshalchen.ultimaterecyclerview.demo.rvComponents.TimeLineAdapter;\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.easyRegularAdapter;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.UUID;\n\n/**\n * Created by zJJ on 4/27/2016.\n */\npublic class LineNodeActivity extends BasicFunctions {\n    @Override\n    protected void onLoadmore() {\n\n    }\n\n    @Override\n    protected void onFireRefresh() {\n\n    }\n\n\n    public static void insertMoreWhole(easyRegularAdapter sd, int howmany) {\n        ArrayList<TimeLineModel> items = new ArrayList<>();\n        addAmount(howmany, items);\n        /**\n         * additional patch for the additional item\n         */\n        int at = sd.getAdapterItemCount();\n        sd.insert(items);\n        sd.notifyDataSetChanged();\n    }\n\n    protected static void addAmount(int howMany, ArrayList<TimeLineModel> list) {\n        for (int i = 0; i < howMany; i++) {\n            UUID uuid = UUID.randomUUID();\n            TimeLineModel time = new TimeLineModel();\n            time.setAge(uuid.variant());\n            time.setName(uuid.toString());\n            list.add(time);\n        }\n    }\n\n    @Override\n    protected void addButtonTrigger() {\n        insertMoreWhole(simpleRecyclerViewAdapter, 3);\n    }\n\n    @Override\n    protected void removeButtonTrigger() {\n\n    }\n\n    private TimeLineAdapter simpleRecyclerViewAdapter = null;\n    private Handler time_count = new Handler();\n\n    @Override\n    protected void doURV(UltimateRecyclerView urv) {\n        ArrayList<TimeLineModel> list = new ArrayList<>();\n        TimeLineModel time = new TimeLineModel();\n        time.setAge(139);\n        time.setName(\"England\");\n        list.add(time);\n        TimeLineModel time2 = new TimeLineModel();\n        time2.setAge(359);\n        time2.setName(\"Japan\");\n        list.add(time2);\n        TimeLineModel time3 = new TimeLineModel();\n        time3.setAge(339);\n        time3.setName(\"HK\");\n        list.add(time3);\n        addAmount(29, list);\n        ultimateRecyclerView.setHasFixedSize(true);\n        simpleRecyclerViewAdapter = new TimeLineAdapter(list);\n        //currently we only support linearlayout option but we have tested anything for the grid layout yet\n        configLinearLayoutManager(ultimateRecyclerView);\n        enableEmptyViewPolicy();\n        // enableLoadMore();\n        ultimateRecyclerView.setRecylerViewBackgroundColor(Color.parseColor(\"#ff6f36cf\"));\n        //enableRefresh();\n        ultimateRecyclerView.setAdapter(simpleRecyclerViewAdapter);\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/loadmoredemo/PullToRefreshActivity.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.loadmoredemo;\n\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.Message;\nimport androidx.appcompat.widget.Toolbar;\nimport android.view.ActionMode;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.View;\n\nimport com.marshalchen.ultimaterecyclerview.CustomUltimateRecyclerview;\nimport com.marshalchen.ultimaterecyclerview.URLogs;\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.demo.rvComponents.sectionZeroAdapter;\nimport com.marshalchen.ultimaterecyclerview.demo.modules.FastBinding;\n\nimport in.srain.cube.views.ptr.PtrDefaultHandler;\nimport in.srain.cube.views.ptr.PtrFrameLayout;\nimport in.srain.cube.views.ptr.PtrHandler;\nimport in.srain.cube.views.ptr.PtrUIHandler;\nimport in.srain.cube.views.ptr.header.MaterialHeader;\nimport in.srain.cube.views.ptr.header.StoreHouseHeader;\nimport in.srain.cube.views.ptr.indicator.PtrIndicator;\n\n\npublic class PullToRefreshActivity extends BasicFunctions implements ActionMode.Callback {\n\n    private CustomUltimateRecyclerview ultimateRecyclerView;\n    private sectionZeroAdapter simpleRecyclerViewAdapter = null;\n    private View floatingButton = null;\n\n    @Override\n    protected void onLoadmore() {\n\n    }\n\n    @Override\n    protected void onFireRefresh() {\n//        simpleRecyclerViewAdapter.insertLast(\"Refresh things\");\n        //   ultimateRecyclerView.scrollBy(0, -50);\n//        linearLayoutManager.scrollToPosition(0);\n        ultimateRecyclerView.mPtrFrameLayout.refreshComplete();\n        changeHeaderHandler.sendEmptyMessageDelayed(0, 500);\n    }\n\n    @Override\n    protected void addButtonTrigger() {\n\n    }\n\n    @Override\n    protected void removeButtonTrigger() {\n\n    }\n\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.custom_refresh_activity);\n        ultimateRecyclerView = (CustomUltimateRecyclerview) findViewById(R.id.custom_ultimate_recycler_view);\n        ultimateRecyclerView.setCustomSwipeToRefresh();\n        // refreshingMaterial();\n        refreshingString();\n\n    }\n\n    void refreshingString() {\n        storeHouseHeader = new StoreHouseHeader(this);\n        //   header.setPadding(0, 15, 0, 0);\n\n        storeHouseHeader.initWithString(\"XCode Big Air\");\n        //  header.initWithStringArray(R.array.akta);\n        ultimateRecyclerView.mPtrFrameLayout.removePtrUIHandler(materialHeader);\n        ultimateRecyclerView.mPtrFrameLayout.setHeaderView(storeHouseHeader);\n        ultimateRecyclerView.mPtrFrameLayout.addPtrUIHandler(storeHouseHeader);\n        ultimateRecyclerView.mPtrFrameLayout.autoRefresh(false);\n        ultimateRecyclerView.mPtrFrameLayout.setPtrHandler(new PtrHandler() {\n            @Override\n            public boolean checkCanDoRefresh(PtrFrameLayout ptrFrameLayout, View view, View view2) {\n                boolean canbePullDown = PtrDefaultHandler.checkContentCanBePulledDown(ptrFrameLayout, view, view2);\n                return canbePullDown;\n            }\n\n            @Override\n            public void onRefreshBegin(PtrFrameLayout ptrFrameLayout) {\n                ptrFrameLayout.postDelayed(new Runnable() {\n                    @Override\n                    public void run() {\n                        onFireRefresh();\n                    }\n                }, 1800);\n            }\n        });\n\n    }\n\n\n//    void refreshingRental() {\n//        rentalsSunHeaderView = new RentalsSunHeaderView(this);\n//        rentalsSunHeaderView.setUp(ultimateRecyclerView.mPtrFrameLayout);\n//\n//        ultimateRecyclerView.mPtrFrameLayout.removePtrUIHandler(materialHeader);\n//        ultimateRecyclerView.mPtrFrameLayout.removePtrUIHandler(storeHouseHeader);\n//        ultimateRecyclerView.mPtrFrameLayout.setHeaderView(rentalsSunHeaderView);\n//        ultimateRecyclerView.mPtrFrameLayout.addPtrUIHandler(rentalsSunHeaderView);\n//        ultimateRecyclerView.mPtrFrameLayout.autoRefresh(false);\n//        ultimateRecyclerView.mPtrFrameLayout.setPtrHandler(new PtrHandler() {\n//            @Override\n//            public boolean checkCanDoRefresh(PtrFrameLayout ptrFrameLayout, View view, View view2) {\n//                boolean canbePullDown = PtrDefaultHandler.checkContentCanBePulledDown(ptrFrameLayout, view, view2);\n//                return canbePullDown;\n//            }\n//\n//            @Override\n//            public void onRefreshBegin(PtrFrameLayout ptrFrameLayout) {\n//                ptrFrameLayout.postDelayed(new Runnable() {\n//                    @Override\n//                    public void run() {\n//                        simpleRecyclerViewAdapter.insert(\"Refresh things\", 0);\n//                        //   ultimateRecyclerView.scrollBy(0, -50);\n//                        linearLayoutManager.scrollToPosition(0);\n//                        ultimateRecyclerView.mPtrFrameLayout.refreshComplete();\n//                        changeHeaderHandler.sendEmptyMessageDelayed(3, 500);\n//                    }\n//                }, 1800);\n//            }\n//        });\n//\n//    }\n\n    void refreshingMaterial() {\n        materialHeader = new MaterialHeader(this);\n        int[] colors = getResources().getIntArray(R.array.google_colors);\n        materialHeader.setColorSchemeColors(colors);\n        materialHeader.setLayoutParams(new PtrFrameLayout.LayoutParams(-1, -2));\n        materialHeader.setPadding(0, 15, 0, 10);\n        materialHeader.setPtrFrameLayout(ultimateRecyclerView.mPtrFrameLayout);\n        ultimateRecyclerView.mPtrFrameLayout.autoRefresh(false);\n        ultimateRecyclerView.mPtrFrameLayout.removePtrUIHandler(storeHouseHeader);\n        ultimateRecyclerView.mPtrFrameLayout.setHeaderView(materialHeader);\n        ultimateRecyclerView.mPtrFrameLayout.addPtrUIHandler(materialHeader);\n\n        ultimateRecyclerView.mPtrFrameLayout.setPtrHandler(new PtrHandler() {\n            @Override\n            public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {\n                return true;\n            }\n\n            @Override\n            public void onRefreshBegin(final PtrFrameLayout frame) {\n                frame.postDelayed(new Runnable() {\n                    @Override\n                    public void run() {\n                      //  simpleRecyclerViewAdapter.insertLast(\"Refresh things\");\n                        //   ultimateRecyclerView.scrollBy(0, -50);\n                     //   linearLayoutManager.scrollToPosition(0);\n                        ultimateRecyclerView.mPtrFrameLayout.refreshComplete();\n                        //   changeHeaderHandler.sendEmptyMessageDelayed(2, 500);\n                    }\n                }, 1800);\n            }\n        });\n    }\n\n    Handler changeHeaderHandler = new Handler() {\n\n        @Override\n        public void handleMessage(Message msg) {\n            super.handleMessage(msg);\n            switch (msg.what) {\n                case 0:\n                    refreshingStringArray();\n                    break;\n                case 1:\n                    //  refreshingMaterial();\n                    refreshingString();\n                    break;\n                case 2:\n                    // refreshingString();\n                    break;\n                case 3:\n                    refreshingString();\n                    break;\n                case 4:\n                    break;\n            }\n        }\n    };\n    private int mLoadTime = 0;\n    StoreHouseHeader storeHouseHeader;\n    MaterialHeader materialHeader;\n    //  RentalsSunHeaderView rentalsSunHeaderView;\n\n    private void refreshingStringArray() {\n        storeHouseHeader = new StoreHouseHeader(this);\n        storeHouseHeader.setPadding(0, 15, 0, 0);\n\n        // using string array from resource xml file\n        storeHouseHeader.initWithStringArray(R.array.storehouse);\n        ultimateRecyclerView.mPtrFrameLayout.setDurationToCloseHeader(1500);\n        ultimateRecyclerView.mPtrFrameLayout.removePtrUIHandler(materialHeader);\n        ultimateRecyclerView.mPtrFrameLayout.setHeaderView(storeHouseHeader);\n        ultimateRecyclerView.mPtrFrameLayout.addPtrUIHandler(storeHouseHeader);\n        ultimateRecyclerView.mPtrFrameLayout.autoRefresh(false);\n\n        // change header after loaded\n        ultimateRecyclerView.mPtrFrameLayout.addPtrUIHandler(new PtrUIHandler() {\n\n\n            @Override\n            public void onUIReset(PtrFrameLayout frame) {\n                mLoadTime++;\n                if (mLoadTime % 2 == 0) {\n                    storeHouseHeader.setScale(1);\n                    storeHouseHeader.initWithStringArray(R.array.storehouse);\n                } else {\n                    storeHouseHeader.setScale(0.5f);\n                    storeHouseHeader.initWithStringArray(R.array.akta);\n                }\n            }\n\n            @Override\n            public void onUIRefreshPrepare(PtrFrameLayout frame) {\n\n            }\n\n            @Override\n            public void onUIRefreshBegin(PtrFrameLayout frame) {\n\n            }\n\n            @Override\n            public void onUIRefreshComplete(PtrFrameLayout frame) {\n\n            }\n\n            @Override\n            public void onUIPositionChange(PtrFrameLayout frame, boolean isUnderTouch, byte status, PtrIndicator ptrIndicator) {\n\n            }\n        });\n\n        ultimateRecyclerView.mPtrFrameLayout.setPtrHandler(new PtrHandler() {\n            @Override\n            public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {\n                return true;\n            }\n\n            @Override\n            public void onRefreshBegin(final PtrFrameLayout frame) {\n                frame.postDelayed(new Runnable() {\n                    @Override\n                    public void run() {\n                        // frame.refreshComplete();\n//                        simpleRecyclerViewAdapter.insertLast(\"Refresh things\");\n                        //   ultimateRecyclerView.scrollBy(0, -50);\n                        linearLayoutManager.scrollToPosition(0);\n                        ultimateRecyclerView.mPtrFrameLayout.refreshComplete();\n                        if (mLoadTime % 2 == 0)\n                            changeHeaderHandler.sendEmptyMessageDelayed(1, 500);\n                    }\n                }, 2000);\n            }\n        });\n    }\n\n    private void toggleSelection(int position) {\n        simpleRecyclerViewAdapter.toggleSelection(position);\n        actionMode.setTitle(\"Selected \" + \"1\");\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n\n\n    }\n\n    public int getScreenHeight() {\n        return findViewById(android.R.id.content).getHeight();\n    }\n\n    @Override\n    protected void doURV(UltimateRecyclerView urv) {\n\n    }\n\n    @Override\n    public boolean onCreateActionMode(ActionMode mode, Menu menu) {\n        URLogs.d(\"actionmode---\" + (mode == null));\n        mode.getMenuInflater().inflate(R.menu.menu_main, menu);\n        return true;\n        //  return false;\n    }\n\n    /**\n     * Called to refresh an action mode's action menu whenever it is invalidated.\n     *\n     * @param mode ActionMode being prepared\n     * @param menu Menu used to populate action buttons\n     * @return true if the menu or action mode was updated, false otherwise.\n     */\n    @Override\n    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {\n        // swipeToDismissTouchListener.setEnabled(false);\n        this.actionMode = mode;\n        return false;\n    }\n\n\n    @Override\n    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {\n        return false;\n    }\n\n\n    @Override\n    public void onDestroyActionMode(ActionMode mode) {\n        this.actionMode = null;\n    }\n\n\n    //\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        // Inflate the menu; this adds items to the action bar if it is present.\n        getMenuInflater().inflate(R.menu.menu_main, menu);\n        return true;\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        FastBinding.startactivity(this, item.getItemId());\n        return super.onOptionsItemSelected(item);\n    }\n\n/*\n\n    enum Type {\n        FadeIn(\"FadeIn\", new FadeInAnimator()),\n        FadeInDown(\"FadeInDown\", new FadeInDownAnimator()),\n        FadeInUp(\"FadeInUp\", new FadeInUpAnimator()),\n        FadeInLeft(\"FadeInLeft\", new FadeInLeftAnimator()),\n        FadeInRight(\"FadeInRight\", new FadeInRightAnimator()),\n        Landing(\"Landing\", new LandingAnimator()),\n        ScaleIn(\"ScaleIn\", new ScaleInAnimator()),\n        ScaleInTop(\"ScaleInTop\", new ScaleInTopAnimator()),\n        ScaleInBottom(\"ScaleInBottom\", new ScaleInBottomAnimator()),\n        ScaleInLeft(\"ScaleInLeft\", new ScaleInLeftAnimator()),\n        ScaleInRight(\"ScaleInRight\", new ScaleInRightAnimator()),\n        FlipInTopX(\"FlipInTopX\", new FlipInTopXAnimator()),\n        FlipInBottomX(\"FlipInBottomX\", new FlipInBottomXAnimator()),\n        FlipInLeftY(\"FlipInLeftY\", new FlipInLeftYAnimator()),\n        FlipInRightY(\"FlipInRightY\", new FlipInRightYAnimator()),\n        SlideInLeft(\"SlideInLeft\", new SlideInLeftAnimator()),\n        SlideInRight(\"SlideInRight\", new SlideInRightAnimator()),\n        SlideInDown(\"SlideInDown\", new SlideInDownAnimator()),\n        SlideInUp(\"SlideInUp\", new SlideInUpAnimator()),\n        OvershootInRight(\"OvershootInRight\", new OvershootInRightAnimator()),\n        OvershootInLeft(\"OvershootInLeft\", new OvershootInLeftAnimator());\n\n        private String mTitle;\n        private BaseItemAnimator mAnimator;\n\n        Type(String title, BaseItemAnimator animator) {\n            mTitle = title;\n            mAnimator = animator;\n        }\n\n        public BaseItemAnimator getAnimator() {\n            return mAnimator;\n        }\n\n        public String getTitle() {\n            return mTitle;\n        }\n    }\n*/\n\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/loadmoredemo/Route.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.loadmoredemo;\n\nimport android.content.Context;\nimport android.content.Intent;\n\n/**\n * Created by hesk on 24/2/16.\n */\npublic enum Route {\n    LineNodeActivity(\"LineNodeActivity\", LineNodeActivity.class),\n    STAGGER_LOAD_MORE(\"Stagger LoadMore\", StaggerLoadMoreActivity.class),\n    LOADLOADING_CUT(\"Stop loading\", FirstPageCancelLoadMore.class),\n    LOADMORE_TEST(\"No Header\", DebugNoHeaderLoadMoreActivity.class),\n    FinalEmptyViewDisplayActivity(\"Empty View\", FinalEmptyViewDisplayActivity.class),\n    SLIDER_HEADER(\"Header of Slider\", SliderHeader.class),\n    SWIPE_LIST(\"Swipe List View Example\", SwipeListViewExampleActivity.class),\n    LOADMORE_HEADER(\"Header Pallx\", DebugLoadMoreActivity.class),;\n\n    private String name;\n    private Class<?> clazzna;\n\n    Route(String name, Class<?> clazz) {\n        this.name = name;\n        this.clazzna = clazz;\n    }\n\n    public Route getAnimator() {\n\n        return this;\n    }\n\n\n    public String getNameDisplay() {\n        return name;\n    }\n\n    public void start(final Context ctx) {\n        Intent intent = new Intent(ctx, clazzna);\n        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n        ctx.startActivity(intent);\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/loadmoredemo/SliderHeader.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.loadmoredemo;\n\nimport android.annotation.TargetApi;\nimport android.graphics.Color;\nimport android.os.Build;\nimport androidx.interpolator.view.animation.LinearOutSlowInInterpolator;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewTreeObserver;\n\nimport com.hkm.slider.SliderLayout;\nimport com.hkm.slider.SliderTypes.BaseSliderView;\nimport com.hkm.slider.SliderTypes.TextSliderView;\nimport com.hkm.slider.TransformerL;\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.demo.rvComponents.sectionZeroAdapter;\nimport com.marshalchen.ultimaterecyclerview.demo.modules.SampleDataboxset;\n\nimport java.util.ArrayList;\n\n/**\n * Created by hesk on 18/3/16.\n */\npublic class SliderHeader extends BasicFunctions implements BaseSliderView.OnSliderClickListener {\n\n    private sectionZeroAdapter simpleRecyclerViewAdapter = null;\n\n    @Override\n    protected void onLoadmore() {\n        SampleDataboxset.insertMoreWhole(simpleRecyclerViewAdapter, 2);\n    }\n\n    @Override\n    protected void onFireRefresh() {\n        // simpleRecyclerViewAdapter.insertLast(moreNum++ + \"  Refresh things\");\n        ultimateRecyclerView.setRefreshing(false);\n        //   ultimateRecyclerView.scrollBy(0, -50);\n        linearLayoutManager.scrollToPosition(0);\n        //ultimateRecyclerView.setAdapter(simpleRecyclerViewAdapter);\n        //simpleRecyclerViewAdapter.notifyDataSetChanged();\n        simpleRecyclerViewAdapter.removeAll();\n        ultimateRecyclerView.disableLoadmore();\n        ultimateRecyclerView.showEmptyView();\n    }\n\n    @Override\n    protected void addButtonTrigger() {\n        simpleRecyclerViewAdapter.insertFirst(\"rand added item\");\n        ultimateRecyclerView.reenableLoadmore();\n    }\n\n    @Override\n    protected void removeButtonTrigger() {\n        simpleRecyclerViewAdapter.removeLast();\n    }\n\n    @Override\n    protected void doURV(UltimateRecyclerView urv) {\n        ultimateRecyclerView.setHasFixedSize(false);\n        simpleRecyclerViewAdapter = new sectionZeroAdapter(new ArrayList<String>());\n        configLinearLayoutManager(ultimateRecyclerView);\n        enableParallaxHeader();\n        enableEmptyViewPolicy();\n        enableLoadMore();\n        ultimateRecyclerView.setRecylerViewBackgroundColor(Color.parseColor(\"#ffff66ff\"));\n        enableRefresh();\n        // enableScrollControl();\n        // enableSwipe();\n        // enableItemClick();\n        ultimateRecyclerView.setItemViewCacheSize(simpleRecyclerViewAdapter.getAdditionalItems());\n        ultimateRecyclerView.setNormalHeader(initSlider(ultimateRecyclerView));\n        ultimateRecyclerView.setAdapter(simpleRecyclerViewAdapter);\n    }\n\n\n    private View initSlider(UltimateRecyclerView listview) {\n        final View view = LayoutInflater.from(getApplication()).inflate(R.layout.list_item_header, null, false);\n        final ViewTreeObserver vto = listview.getViewTreeObserver();\n        vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {\n            @TargetApi(Build.VERSION_CODES.JELLY_BEAN)\n            @Override\n            public void onGlobalLayout() {\n                view.getViewTreeObserver().removeOnGlobalLayoutListener(this);\n                //Log.d(\"vto\", \"globallayout\");\n                final SliderLayout sl = (SliderLayout) view.findViewById(R.id.header_slider);\n                try {\n                    sl.setOffscreenPageLimit(1);\n                    sl.setSliderTransformDuration(500, new LinearOutSlowInInterpolator());\n                    sl.setPresetTransformer(TransformerL.Default);\n                    sl.setPresetIndicator(SliderLayout.PresetIndicators.Center_Bottom);\n                    sl.getPagerIndicator().setDefaultIndicatorColor(R.color.accent, R.color.primaryDark);\n                    sl.getPagerIndicator().setVisibility(View.GONE);\n                    setup_double_faces(sl);\n                } catch (Exception e) {\n                    e.printStackTrace();\n                }\n            }\n        });\n\n\n        return view;\n    }\n\n\n    String[] urls = {\n            //   \"http://pcdn.500px.net/35939982/127d53ceac436e2e17a11ea42bb2cd7719b9f1e1/4.jpg\",\n            \"http://cs407831.userapi.com/v4078f31207/18fe/4Tz8av5Hlvo.jpg\",\n            //    special url with error\n            \"http://cs407831.userapi.com/v407831207/1906/oxoP6URjFtA.jpg\",\n            \"http://cs407831.userapi.com/v407831207/190e/2Sz9A774hUc.jpg\",\n            \"http://cs407831.userapi.com/v407831207/1916/Ua52RjnKqjk.jpg\",\n            \"http://cs407831.userapi.com/v407831207/190e/2Sz9A774hUc.jpg\",\n            \"http://cs407831.userapi.com/v407831207/1916/Ua52RjnKqjk.jpg\",\n            \"http://cs407831.userapi.com/v407831207/190e/2Sz9A774hUc.jpg\",\n            \"http://cs407831.userapi.com/v407831207/1916/Ua52RjnKqjk.jpg\",\n            \"http://cs407831.userapi.com/v407831207/191e/QEQE83Ok0lQ.jpg\"\n    };\n\n\n    protected void setup_double_faces(final SliderLayout mslide) throws Exception {\n        ArrayList<BaseSliderView> ie = new ArrayList<>();\n        // mslide.setCustomAnimation(new DescriptionAnimation(250, new DecelerateInterpolator()));\n        for (int i = 0; i < urls.length; i++) {\n            TextSliderView textSliderView = new TextSliderView(this);\n            // initialize a SliderLayout\n            textSliderView\n                    .image(urls[i])\n                    .setScaleType(BaseSliderView.ScaleType.Fit)\n                    .setOnSliderClickListener(this);\n            //add your extra information\n            ie.add(textSliderView);\n        }\n        mslide.loadSliderList(ie);\n    }\n\n    @Override\n    public void onSliderClick(BaseSliderView coreSlider) {\n\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/loadmoredemo/StaggerLoadMoreActivity.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.loadmoredemo;\n\nimport android.graphics.Color;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.demo.modules.SampleDataboxset;\nimport com.marshalchen.ultimaterecyclerview.demo.rvComponents.sectionZeroAdapter;\nimport com.marshalchen.ultimaterecyclerview.demo.rvComponents.staggerAdapter;\n\nimport java.util.ArrayList;\n\n/**\n * Created by hesk on 5/4/16.\n */\npublic class StaggerLoadMoreActivity extends BasicFunctions {\n\n    staggerAdapter simpleRecyclerViewAdapter = null;\n\n    @Override\n    protected void onLoadmore() {\n        SampleDataboxset.insertMoreWhole(simpleRecyclerViewAdapter, 7);\n    }\n\n    @Override\n    protected void enableEmptyViewPolicy() {\n        //  ultimateRecyclerView.setEmptyView(R.layout.empty_view, UltimateRecyclerView.EMPTY_KEEP_HEADER_AND_LOARMORE);\n        //    ultimateRecyclerView.setEmptyView(R.layout.empty_view, UltimateRecyclerView.EMPTY_KEEP_HEADER);\n        ultimateRecyclerView.setEmptyView(R.layout.empty_view, UltimateRecyclerView.EMPTY_KEEP_HEADER_AND_LOARMORE);\n    }\n\n    @Override\n    protected void onFireRefresh() {\n        // simpleRecyclerViewAdapter.insertLast(moreNum++ + \"  Refresh things\");\n        ultimateRecyclerView.setRefreshing(false);\n        //   ultimateRecyclerView.scrollBy(0, -50);\n        linearLayoutManager.scrollToPosition(0);\n        //ultimateRecyclerView.setAdapter(simpleRecyclerViewAdapter);\n        //simpleRecyclerViewAdapter.notifyDataSetChanged();\n        simpleRecyclerViewAdapter.removeAll();\n        ultimateRecyclerView.disableLoadmore();\n        ultimateRecyclerView.showEmptyView();\n    }\n\n\n    @Override\n    protected void doURV(UltimateRecyclerView urv) {\n        ultimateRecyclerView.setHasFixedSize(false);\n        simpleRecyclerViewAdapter = new staggerAdapter(new ArrayList<String>());\n        //configLinearLayoutManager(ultimateRecyclerView);\n        configStaggerLayoutManager(ultimateRecyclerView, simpleRecyclerViewAdapter);\n        // enableParallaxHeader();\n        enableEmptyViewPolicy();\n        enableLoadMore();\n        ultimateRecyclerView.setRecylerViewBackgroundColor(Color.parseColor(\"#ff4fcccf\"));\n        enableRefresh();\n        // enableScrollControl();\n        // enableSwipe();\n        // enableItemClick();\n        ultimateRecyclerView.setItemViewCacheSize(simpleRecyclerViewAdapter.getAdditionalItems());\n\n\n        ultimateRecyclerView.setAdapter(simpleRecyclerViewAdapter);\n    }\n\n\n    @Override\n    protected void addButtonTrigger() {\n        simpleRecyclerViewAdapter.insertLast(\"++ New Item\");\n        ultimateRecyclerView.reenableLoadmore();\n    }\n\n    @Override\n    protected void removeButtonTrigger() {\n        simpleRecyclerViewAdapter.removeLast();\n    }\n\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/loadmoredemo/SwipeListViewExampleActivity.java",
    "content": "/*\n * Copyright (C) 2013 47 Degrees, LLC\n *  http://47deg.com\n *  hello@47deg.com\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\");\n *  you may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS,\n *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n */\n\npackage com.marshalchen.ultimaterecyclerview.demo.loadmoredemo;\n\n\nimport androidx.recyclerview.widget.LinearLayoutManager;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.demo.modules.SampleDataboxset;\nimport com.marshalchen.ultimaterecyclerview.demo.rvComponents.SwipeAdapter;\nimport com.marshalchen.ultimaterecyclerview.layoutmanagers.ScrollSmoothLineaerLayoutManager;\nimport com.marshalchen.ultimaterecyclerview.swipe.SwipeItemManagerInterface;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class SwipeListViewExampleActivity extends BasicFunctions {\n    private SwipeAdapter adapter;\n    private List<String> data;\n    private ScrollSmoothLineaerLayoutManager mLayoutManager;\n\n    @Override\n    protected void onLoadmore() {\n        SampleDataboxset.insertMoreWhole(adapter, 3);\n    }\n\n    @Override\n    protected void onFireRefresh() {\n        ultimateRecyclerView.setRefreshing(false);\n        //   ultimateRecyclerView.scrollBy(0, -50);\n        linearLayoutManager.scrollToPosition(0);\n        //ultimateRecyclerView.setAdapter(simpleRecyclerViewAdapter);\n        //simpleRecyclerViewAdapter.notifyDataSetChanged();\n        adapter.removeAll();\n        ultimateRecyclerView.disableLoadmore();\n        ultimateRecyclerView.showEmptyView();\n    }\n\n    @Override\n    protected void addButtonTrigger() {\n        adapter.insertLast(\"++ xxx\");\n        ultimateRecyclerView.reenableLoadmore();\n    }\n\n    @Override\n    protected void removeButtonTrigger() {\n        adapter.removeLast();\n    }\n\n    @Override\n    protected void enableEmptyViewPolicy() {\n        //  ultimateRecyclerView.setEmptyView(R.layout.empty_view, UltimateRecyclerView.EMPTY_KEEP_HEADER_AND_LOARMORE);\n        //    ultimateRecyclerView.setEmptyView(R.layout.empty_view, UltimateRecyclerView.EMPTY_KEEP_HEADER);\n        ultimateRecyclerView.setEmptyView(R.layout.empty_view, UltimateRecyclerView.EMPTY_KEEP_HEADER_AND_LOARMORE);\n    }\n\n\n    @Override\n    protected void doURV(UltimateRecyclerView urv) {\n        data = new ArrayList<String>();\n\n        data.add(\"aa\");\n        data.add(\"bb\");\n        data.add(\"cc\");\n        data.add(\"dd\");\n        data.add(\"aa\");\n        data.add(\"bb\");\n        data.add(\"cc\");\n        data.add(\"dd\");\n        data.add(\"aa\");\n        data.add(\"bb\");\n        data.add(\"cc\");\n        data.add(\"dd\");\n\n        enableEmptyViewPolicy();\n        enableLoadMore();\n        enableRefresh();\n        adapter = new SwipeAdapter(data);\n        adapter.setMode(SwipeItemManagerInterface.Mode.Single);\n        mLayoutManager = new ScrollSmoothLineaerLayoutManager(this, LinearLayoutManager.VERTICAL, false, 500);\n        ultimateRecyclerView.setHasFixedSize(false);\n        ultimateRecyclerView.setLayoutManager(mLayoutManager);\n//        swipeListView.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {\n//            @Override\n//            public void onItemClick(View view, int position) {\n//                URLogs.d(\"click\");\n//            }\n//        }));\n\n\n        ultimateRecyclerView.setAdapter(adapter);\n    }\n\n\n\n\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/modules/AbstractDataProvider.java",
    "content": "/*\n *    Copyright (C) 2015 Haruki Hasegawa\n *\n *    Licensed under the Apache License, Version 2.0 (the \"License\");\n *    you may not use this file except in compliance with the License.\n *    You may obtain a copy of the License at\n *\n *        http://www.apache.org/licenses/LICENSE-2.0\n *\n *    Unless required by applicable law or agreed to in writing, software\n *    distributed under the License is distributed on an \"AS IS\" BASIS,\n *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *    See the License for the specific language governing permissions and\n *    limitations under the License.\n */\n\npackage com.marshalchen.ultimaterecyclerview.demo.modules;\n\npublic abstract class AbstractDataProvider {\n\n    public static abstract class Data {\n        public abstract long getId();\n\n        public abstract boolean isSectionHeader();\n\n        public abstract int getViewType();\n\n        public abstract int getSwipeReactionType();\n\n        public abstract String getText();\n\n        public abstract void setPinnedToSwipeLeft(boolean pinned);\n\n        public abstract boolean isPinnedToSwipeLeft();\n    }\n\n    public abstract int getCount();\n\n    public abstract Data getItem(int index);\n\n    public abstract void removeItem(int position);\n\n    public abstract void moveItem(int fromPosition, int toPosition);\n\n    public abstract int undoLastRemoval();\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/modules/CircularImageView.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.modules;\n\nimport android.annotation.TargetApi;\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapShader;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.ColorFilter;\nimport android.graphics.Matrix;\nimport android.graphics.Paint;\nimport android.graphics.PorterDuff;\nimport android.graphics.PorterDuffColorFilter;\nimport android.graphics.RectF;\nimport android.graphics.Shader;\nimport android.graphics.drawable.BitmapDrawable;\nimport android.graphics.drawable.Drawable;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.util.AttributeSet;\nimport android.util.Log;\nimport android.view.MotionEvent;\nimport android.widget.ImageView;\n\nimport com.marshalchen.ultimaterecyclerview.demo.R;\n\n\n/**\n * Custom ImageView for circular images in Android while maintaining the\n * best draw performance and supporting custom borders & selectors.\n */\npublic class CircularImageView extends ImageView {\n\t// For logging purposes\n\tprivate static final String TAG = CircularImageView.class.getSimpleName();\n\n\t// Default property values\n\tprivate static final boolean SHADOW_ENABLED = false;\n\tprivate static final float SHADOW_RADIUS = 4f;\n\tprivate static final float SHADOW_DX = 0f;\n\tprivate static final float SHADOW_DY = 2f;\n\tprivate static final int SHADOW_COLOR = Color.BLACK;\n\n\t// Border & Selector configuration variables\n\tprivate boolean hasBorder;\n\tprivate boolean hasSelector;\n\tprivate boolean isSelected;\n\tprivate int borderWidth;\n\tprivate int canvasSize;\n\tprivate int selectorStrokeWidth;\n\n\t// Shadow properties\n\tprivate boolean shadowEnabled;\n\tprivate float shadowRadius;\n\tprivate float shadowDx;\n\tprivate float shadowDy;\n\tprivate int shadowColor;\n\n\t// Objects used for the actual drawing\n\tprivate BitmapShader shader;\n\tprivate Bitmap image;\n\tprivate Paint paint;\n\tprivate Paint paintBorder;\n\tprivate Paint paintSelectorBorder;\n\tprivate ColorFilter selectorFilter;\n\n\tpublic CircularImageView(Context context) {\n\t\tthis(context, null,\n\t\t\t\tR.styleable.CircularImageViewStyle_circularImageViewDefault);\n\t}\n\n\tpublic CircularImageView(Context context, AttributeSet attrs) {\n\t\tthis(context, attrs, R.styleable.CircularImageViewStyle_circularImageViewDefault);\n\t}\n\n\tpublic CircularImageView(Context context, AttributeSet attrs, int defStyleAttr) {\n\t\tsuper(context, attrs, defStyleAttr);\n\t\tinit(context, attrs, defStyleAttr);\n\t}\n\n\t@TargetApi(Build.VERSION_CODES.LOLLIPOP)\n\tpublic CircularImageView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {\n\t\tsuper(context, attrs, defStyleAttr, defStyleRes);\n\t\tinit(context, attrs, defStyleAttr);\n\t}\n\n\t/**\n\t * Initializes paint objects and sets desired attributes.\n\t * @param context Context\n\t * @param attrs Attributes\n\t * @param defStyle Default Style\n\t */\n\tprivate void init(Context context, AttributeSet attrs, int defStyle) {\n\t\t// Initialize paint objects\n\t\tpaint = new Paint();\n\t\tpaint.setAntiAlias(true);\n\t\tpaintBorder = new Paint();\n\t\tpaintBorder.setAntiAlias(true);\n\t\tpaintBorder.setStyle(Paint.Style.STROKE);\n\t\tpaintSelectorBorder = new Paint();\n\t\tpaintSelectorBorder.setAntiAlias(true);\n\n\t\t// Enable software rendering on HoneyComb and up. (needed for shadow)\n\t\tif(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)\n\t\t\tsetLayerType(LAYER_TYPE_SOFTWARE, null);\n\n\t\t// Load the styled attributes and set their properties\n\t\tTypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.CircularImageView, defStyle, 0);\n\n\t\t// Check for extra features being enabled\n\t\thasBorder = attributes.getBoolean(R.styleable.CircularImageView_civ_border, false);\n\t\thasSelector = attributes.getBoolean(R.styleable.CircularImageView_civ_selector, false);\n\t\tshadowEnabled = attributes.getBoolean(R.styleable.CircularImageView_civ_shadow, SHADOW_ENABLED);\n\n\t\t// Set border properties, if enabled\n\t\tif(hasBorder) {\n\t\t\tint defaultBorderSize = (int) (2 * context.getResources().getDisplayMetrics().density + 0.5f);\n\t\t\tsetBorderWidth(attributes.getDimensionPixelOffset(R.styleable.CircularImageView_civ_borderWidth, defaultBorderSize));\n\t\t\tsetBorderColor(attributes.getColor(R.styleable.CircularImageView_civ_borderColor, Color.WHITE));\n\t\t}\n\n\t\t// Set selector properties, if enabled\n\t\tif(hasSelector) {\n\t\t\tint defaultSelectorSize = (int) (2 * context.getResources().getDisplayMetrics().density + 0.5f);\n\t\t\tsetSelectorColor(attributes.getColor(R.styleable.CircularImageView_civ_selectorColor, Color.TRANSPARENT));\n\t\t\tsetSelectorStrokeWidth(attributes.getDimensionPixelOffset(R.styleable.CircularImageView_civ_selectorStrokeWidth, defaultSelectorSize));\n\t\t\tsetSelectorStrokeColor(attributes.getColor(R.styleable.CircularImageView_civ_selectorStrokeColor, Color.BLUE));\n\t\t}\n\n\t\t// Set shadow properties, if enabled\n\t\tif(shadowEnabled) {\n\t\t\tshadowRadius = attributes.getFloat(R.styleable.CircularImageView_civ_shadowRadius, SHADOW_RADIUS);\n\t\t\tshadowDx = attributes.getFloat(R.styleable.CircularImageView_civ_shadowDx, SHADOW_DX);\n\t\t\tshadowDy = attributes.getFloat(R.styleable.CircularImageView_civ_shadowDy, SHADOW_DY);\n\t\t\tshadowColor = attributes.getColor(R.styleable.CircularImageView_civ_shadowColor, SHADOW_COLOR);\n\t\t\tsetShadowEnabled(true);\n\t\t}\n\n\t\t// We no longer need our attributes TypedArray, give it back to cache\n\t\tattributes.recycle();\n\t}\n\n\t/**\n\t * Sets the CircularImageView's border width in pixels.\n\t * @param borderWidth Width in pixels for the border.\n\t */\n\tpublic void setBorderWidth(int borderWidth) {\n\t\tthis.borderWidth = borderWidth;\n\t\tif(paintBorder != null)\n\t\t\tpaintBorder.setStrokeWidth(borderWidth);\n\t\trequestLayout();\n\t\tinvalidate();\n\t}\n\n\t/**\n\t * Sets the CircularImageView's basic border color.\n\t * @param borderColor The new color (including alpha) to set the border.\n\t */\n\tpublic void setBorderColor(int borderColor) {\n\t\tif (paintBorder != null)\n\t\t\tpaintBorder.setColor(borderColor);\n\t\tthis.invalidate();\n\t}\n\n\t/**\n\t * Sets the color of the selector to be draw over the\n\t * CircularImageView. Be sure to provide some opacity.\n\t * @param selectorColor The color (including alpha) to set for the selector overlay.\n\t */\n\tpublic void setSelectorColor(int selectorColor) {\n\t\tthis.selectorFilter = new PorterDuffColorFilter(selectorColor, PorterDuff.Mode.SRC_ATOP);\n\t\tthis.invalidate();\n\t}\n\n\t/**\n\t * Sets the stroke width to be drawn around the CircularImageView\n\t * during click events when the selector is enabled.\n\t * @param selectorStrokeWidth Width in pixels for the selector stroke.\n\t */\n\tpublic void setSelectorStrokeWidth(int selectorStrokeWidth) {\n\t\tthis.selectorStrokeWidth = selectorStrokeWidth;\n\t\tthis.requestLayout();\n\t\tthis.invalidate();\n\t}\n\n\t/**\n\t * Sets the stroke color to be drawn around the CircularImageView\n\t * during click events when the selector is enabled.\n\t * @param selectorStrokeColor The color (including alpha) to set for the selector stroke.\n\t */\n\tpublic void setSelectorStrokeColor(int selectorStrokeColor) {\n\t\tif (paintSelectorBorder != null)\n\t\t\tpaintSelectorBorder.setColor(selectorStrokeColor);\n\t\tthis.invalidate();\n\t}\n\n\t/**\n\t * Enables a dark shadow for this CircularImageView.\n\t * @param enabled Set to true to draw a shadow or false to disable it.\n\t */\n\tpublic void setShadowEnabled(boolean enabled) {\n\t\tshadowEnabled = enabled;\n\t\tupdateShadow();\n\t}\n\n\t/**\n\t * Enables a dark shadow for this CircularImageView.\n\t * If the radius is set to 0, the shadow is removed.\n\t * @param radius Radius for the shadow to extend to.\n\t * @param dx Horizontal shadow offset.\n\t * @param dy Vertical shadow offset.\n\t * @param color The color of the shadow to apply.\n\t */\n\tpublic void setShadow(float radius, float dx, float dy, int color) {\n\t\tshadowRadius = radius;\n\t\tshadowDx = dx;\n\t\tshadowDy = dy;\n\t\tshadowColor = color;\n\t\tupdateShadow();\n\t}\n\n\t@Override\n\tpublic void onDraw(Canvas canvas) {\n\t\t// Don't draw anything without an image\n\t\tif(image == null)\n\t\t\treturn;\n\n\t\t// Nothing to draw (Empty bounds)\n\t\tif(image.getHeight() == 0 || image.getWidth() == 0)\n\t\t\treturn;\n\n\t\t// Update shader if canvas size has changed\n\t\tint oldCanvasSize = canvasSize;\n\t\tcanvasSize = getWidth() < getHeight() ? getWidth() : getHeight();\n\t\tif(oldCanvasSize != canvasSize)\n\t\t\tupdateBitmapShader();\n\n\t\t// Apply shader to paint\n\t\tpaint.setShader(shader);\n\n\t\t// Keep track of selectorStroke/border width\n\t\tint outerWidth = 0;\n\n\t\t// Get the exact X/Y axis of the view\n\t\tint center = canvasSize / 2;\n\n\n\t\tif(hasSelector && isSelected) { // Draw the selector stroke & apply the selector filter, if applicable\n\t\t\touterWidth = selectorStrokeWidth;\n\t\t\tcenter = (canvasSize - (outerWidth * 2)) / 2;\n\n\t\t\tpaint.setColorFilter(selectorFilter);\n\t\t\tcanvas.drawCircle(center + outerWidth, center + outerWidth, ((canvasSize - (outerWidth * 2)) / 2) + outerWidth - 4.0f, paintSelectorBorder);\n\t\t}\n\t\telse if(hasBorder) { // If no selector was drawn, draw a border and clear the filter instead... if enabled\n\t\t\touterWidth = borderWidth;\n\t\t\tcenter = (canvasSize - (outerWidth * 2)) / 2;\n\n\t\t\tpaint.setColorFilter(null);\n\t\t\tRectF rekt = new RectF(0 + outerWidth / 2, 0 + outerWidth / 2, canvasSize - outerWidth / 2, canvasSize - outerWidth / 2);\n\t\t\tcanvas.drawArc(rekt, 360, 360, false, paintBorder);\n\t\t\t//canvas.drawCircle(center + outerWidth, center + outerWidth, ((canvasSize - (outerWidth * 2)) / 2) + outerWidth - 4.0f, paintBorder);\n\t\t}\n\t\telse // Clear the color filter if no selector nor border were drawn\n\t\t\tpaint.setColorFilter(null);\n\n\t\t// Draw the circular image itself\n\t\tcanvas.drawCircle(center + outerWidth, center + outerWidth, ((canvasSize - (outerWidth * 2)) / 2), paint);\n\t}\n\n\t@Override\n\tpublic boolean dispatchTouchEvent(MotionEvent event) {\n\t\t// Check for clickable state and do nothing if disabled\n\t\tif(!this.isClickable()) {\n\t\t\tthis.isSelected = false;\n\t\t\treturn super.onTouchEvent(event);\n\t\t}\n\n\t\t// Set selected state based on Motion Event\n\t\tswitch(event.getAction()) {\n\t\t\tcase MotionEvent.ACTION_DOWN:\n\t\t\t\tthis.isSelected = true;\n\t\t\t\tbreak;\n\t\t\tcase MotionEvent.ACTION_UP:\n\t\t\tcase MotionEvent.ACTION_SCROLL:\n\t\t\tcase MotionEvent.ACTION_OUTSIDE:\n\t\t\tcase MotionEvent.ACTION_CANCEL:\n\t\t\t\tthis.isSelected = false;\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Redraw image and return super type\n\t\tthis.invalidate();\n\t\treturn super.dispatchTouchEvent(event);\n\t}\n\n\t@Override\n\tpublic void setImageURI(Uri uri) {\n\t\tsuper.setImageURI(uri);\n\n\t\t// Extract a Bitmap out of the drawable & set it as the main shader\n\t\timage = drawableToBitmap(getDrawable());\n\t\tif(canvasSize > 0)\n\t\t\tupdateBitmapShader();\n\t}\n\n\t@Override\n\tpublic void setImageResource(int resId) {\n\t\tsuper.setImageResource(resId);\n\n\t\t// Extract a Bitmap out of the drawable & set it as the main shader\n\t\timage = drawableToBitmap(getDrawable());\n\t\tif(canvasSize > 0)\n\t\t\tupdateBitmapShader();\n\t}\n\n\t@Override\n\tpublic void setImageDrawable(Drawable drawable) {\n\t\tsuper.setImageDrawable(drawable);\n\n\t\t// Extract a Bitmap out of the drawable & set it as the main shader\n\t\timage = drawableToBitmap(getDrawable());\n\t\tif(canvasSize > 0)\n\t\t\tupdateBitmapShader();\n\t}\n\n\t@Override\n\tpublic void setImageBitmap(Bitmap bm) {\n\t\tsuper.setImageBitmap(bm);\n\n\t\t// Extract a Bitmap out of the drawable & set it as the main shader\n\t\timage = bm;\n\t\tif(canvasSize > 0)\n\t\t\tupdateBitmapShader();\n\t}\n\n\t@Override\n\tprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n\t\tint width = measureWidth(widthMeasureSpec);\n\t\tint height = measureHeight(heightMeasureSpec);\n\t\tsetMeasuredDimension(width, height);\n\t}\n\n\tprivate int measureWidth(int measureSpec) {\n\t\tint result;\n\t\tint specMode = MeasureSpec.getMode(measureSpec);\n\t\tint specSize = MeasureSpec.getSize(measureSpec);\n\n\t\tif (specMode == MeasureSpec.EXACTLY) {\n\t\t\t// The parent has determined an exact size for the child.\n\t\t\tresult = specSize;\n\t\t}\n\t\telse if (specMode == MeasureSpec.AT_MOST) {\n\t\t\t// The child can be as large as it wants up to the specified size.\n\t\t\tresult = specSize;\n\t\t}\n\t\telse {\n\t\t\t// The parent has not imposed any constraint on the child.\n\t\t\tresult = canvasSize;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tprivate int measureHeight(int measureSpecHeight) {\n\t\tint result;\n\t\tint specMode = MeasureSpec.getMode(measureSpecHeight);\n\t\tint specSize = MeasureSpec.getSize(measureSpecHeight);\n\n\t\tif (specMode == MeasureSpec.EXACTLY) {\n\t\t\t// We were told how big to be\n\t\t\tresult = specSize;\n\t\t} else if (specMode == MeasureSpec.AT_MOST) {\n\t\t\t// The child can be as large as it wants up to the specified size.\n\t\t\tresult = specSize;\n\t\t} else {\n\t\t\t// Measure the text (beware: ascent is a negative number)\n\t\t\tresult = canvasSize;\n\t\t}\n\n\t\treturn (result + 2);\n\t}\n\n\t// TODO: Update shadow layers based on border/selector state and visibility.\n\tprivate void updateShadow() {\n\t\tfinal float radius = shadowEnabled ? shadowRadius : 0;\n\t\t//paint.setShadowLayer(radius, shadowDx, shadowDy, shadowColor);\n\t\tpaintBorder.setShadowLayer(radius, shadowDx, shadowDy, shadowColor);\n\t\tpaintSelectorBorder.setShadowLayer(radius, shadowDx, shadowDy, shadowColor);\n\t}\n\n\t/**\n\t * Convert a drawable object into a Bitmap.\n\t * @param drawable Drawable to extract a Bitmap from.\n\t * @return A Bitmap created from the drawable parameter.\n\t */\n\tpublic Bitmap drawableToBitmap(Drawable drawable) {\n\t\tif (drawable == null)   // Don't do anything without a proper drawable\n\t\t\treturn null;\n\t\telse if (drawable instanceof BitmapDrawable) {  // Use the getBitmap() method instead if BitmapDrawable\n\t\t\tLog.i(TAG, \"Bitmap drawable!\");\n\t\t\treturn ((BitmapDrawable) drawable).getBitmap();\n\t\t}\n\n\t\tint intrinsicWidth = drawable.getIntrinsicWidth();\n\t\tint intrinsicHeight = drawable.getIntrinsicHeight();\n\n\t\tif (!(intrinsicWidth > 0 && intrinsicHeight > 0))\n\t\t\treturn null;\n\n\t\ttry {\n\t\t\t// Create Bitmap object out of the drawable\n\t\t\tBitmap bitmap = Bitmap.createBitmap(intrinsicWidth, intrinsicHeight, Bitmap.Config.ARGB_8888);\n\t\t\tCanvas canvas = new Canvas(bitmap);\n\t\t\tdrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());\n\t\t\tdrawable.draw(canvas);\n\t\t\treturn bitmap;\n\t\t} catch (OutOfMemoryError e) {\n\t\t\t// Simply return null of failed bitmap creations\n\t\t\tLog.e(TAG, \"Encountered OutOfMemoryError while generating bitmap!\");\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t// TODO TEST REMOVE\n\tpublic void setIconModeEnabled(final boolean e) {}\n\n\t/**\n\t * Re-initializes the shader texture used to fill in\n\t * the Circle upon drawing.\n\t */\n\tpublic void updateBitmapShader() {\n\t\tif (image == null)\n\t\t\treturn;\n\n\t\tshader = new BitmapShader(image, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);\n\n\t\tif(canvasSize != image.getWidth() || canvasSize != image.getHeight()) {\n\t\t\tMatrix matrix = new Matrix();\n\t\t\tfloat scale = (float) canvasSize / (float) image.getWidth();\n\t\t\tmatrix.setScale(scale, scale);\n\t\t\tshader.setLocalMatrix(matrix);\n\t\t}\n\t}\n\n\t/**\n\t * @return Whether or not this view is currently\n\t * in its selected state.\n\t */\n\tpublic boolean isSelected() {\n\t\treturn this.isSelected;\n\t}\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/modules/FastBinding.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.modules;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport androidx.annotation.IdRes;\n\nimport com.marshalchen.ultimaterecyclerview.demo.loadmoredemo.PullToRefreshActivity;\nimport com.marshalchen.ultimaterecyclerview.demo.griddemo.GridLayoutRVTest;\nimport com.marshalchen.ultimaterecyclerview.demo.multiitemdemo.MultiViewTypesActivity;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.demo.admobdemo.TestAdMobClassicActivity;\nimport com.marshalchen.ultimaterecyclerview.demo.loadmoredemo.DebugLoadMoreActivity;\nimport com.marshalchen.ultimaterecyclerview.demo.admobdemo.TestAdvancedAdmobActivity;\nimport com.marshalchen.ultimaterecyclerview.demo.scrollableobservable.ScrollObservablesActivity;\nimport com.marshalchen.ultimaterecyclerview.demo.expandemo.TestExpandableRV;\nimport com.marshalchen.ultimaterecyclerview.demo.loadmoredemo.SwipeListViewExampleActivity;\n\n/**\n * Created by hesk on 7/1/2015.\n */\npublic enum FastBinding {\n    action_bottom(R.id.action_bottom, MultiViewTypesActivity.class),\n    action_custom(R.id.action_custom, PullToRefreshActivity.class),\n    admob(R.id.admob, TestAdMobClassicActivity.class),\n    scrollactivity(R.id.scrollactivity, ScrollObservablesActivity.class),\n    swipe_and_drag(R.id.swipe_and_drag, SwipeListViewExampleActivity.class),\n    debug_load_more(R.id.debug_load_more, DebugLoadMoreActivity.class),\n    advancedAdmob(R.id.adv_admob, TestAdvancedAdmobActivity.class),\n    gridlayouttesting(R.id.gridlayoutperformance, GridLayoutRVTest.class),\n    expandmenu(R.id.expandmenu, TestExpandableRV.class);\n\n    private int id;\n    private Class<?> clazz;\n\n    FastBinding(final @IdRes int id, Class<?> clazz) {\n        this.id = id;\n        this.clazz = clazz;\n    }\n\n    public Class<?> getClassName() {\n        return clazz;\n    }\n\n    public int getId() {\n        return id;\n    }\n\n    public static void startactivity(final Context ctx, final @IdRes int id) {\n        final int g = FastBinding.values().length;\n        for (int i = 0; i < g; i++) {\n            FastBinding bind = FastBinding.values()[i];\n            if (bind.getId() == id) {\n                Intent intent = new Intent(ctx, bind.getClassName());\n                ctx.startActivity(intent);\n                return;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/modules/JRitem.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.modules;\n\nimport androidx.annotation.DrawableRes;\n\n/**\n * Created by hesk on 3/2/16.\n */\npublic class JRitem {\n    @DrawableRes\n    public final int photo_id;\n    public final String train_name;\n\n    public JRitem(@DrawableRes final int photo_idjr, String name) {\n        photo_id = photo_idjr;\n        train_name = name;\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/modules/MainWatcher.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.modules;\n\nimport android.app.Application;\nimport android.content.pm.ApplicationInfo;\n\n\n/**\n * Created by hesk on 2/10/15.\n */\npublic class MainWatcher extends Application {\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        //CrashWoodpecker.fly().to(this);\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/modules/SampleDataboxset.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.modules;\n\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.demo.admobdemo.ZeroStickyAdvertistmentAdapter;\nimport com.marshalchen.ultimaterecyclerview.demo.rvComponents.sectionZeroAdapter;\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.easyRegularAdapter;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Random;\n\n/**\n * Created by hesk on 7/1/2015.\n */\npublic class SampleDataboxset {\n\n    public static List<String> newList() {\n        final List<String> stringList = new ArrayList<>();\n        stringList.add(\"111\");\n        stringList.add(\"TYAT\");\n        stringList.add(\"BMW\");\n        stringList.add(\"3M\");\n        stringList.add(\"Apple\");\n        stringList.add(\"Organe\");\n        stringList.add(\"Nike\");\n        stringList.add(\"Addos\");\n        stringList.add(\"76 RE\");\n        return stringList;\n    }\n\n    public static List<String> newList(int longh) {\n        final List<String> j = newList();\n        genItems(longh, j);\n        return j;\n    }\n\n    public static List<String> newListFromGen(int n) {\n        final List<String> s = new ArrayList<>();\n        genItems(n, s);\n        return s;\n    }\n\n    public static List<String> newListFromGen() {\n        final List<String> s = new ArrayList<>();\n        genItems(38, s);\n        return s;\n    }\n\n    public static void genItems(final int howmany, final List<String> list) {\n        for (int i = 0; i < howmany; i++) {\n            Random e = new Random();\n            list.add(\"No.\" + i + \" \" + girl_name[e.nextInt(girl_name.length)]);\n        }\n    }\n\n    public static void insertMore(easyRegularAdapter sd, int howmany) {\n        for (int i = 0; i < howmany; i++) {\n            sd.insertLast(\"More ** \" + i);\n        }\n    }\n\n    public static void insertMoreWhole(easyRegularAdapter sd, int howmany) {\n        List<String> items = new ArrayList<>();\n        for (int i = 0; i < howmany; i++) {\n            items.add(\"More ** \" + i);\n        }\n        sd.insert(items);\n    }\n\n\n    public static List<JRitem> genJRList(int counts) {\n        List<JRitem> items = new ArrayList<>();\n        for (int i = 0; i < counts; i++) {\n            items.add(genJRSingle());\n        }\n        return items;\n    }\n\n    public static JRitem genJRSingle() {\n        Random e = new Random();\n        JRitem bodu = new JRitem(SampleDataboxset.getGirlImageRandom(), girl_name[e.nextInt(girl_name.length)]);\n        return bodu;\n    }\n\n    public static int getGirlImageRandom() {\n        Random e = new Random();\n        return res[e.nextInt(res.length)];\n    }\n\n    public static void insertMore(ZeroStickyAdvertistmentAdapter sd, int howmany) {\n        for (int i = 0; i < howmany; i++) {\n            sd.insertFirst(\"More items \" + i);\n        }\n    }\n\n    public static final Integer[] res = new Integer[]{\n            R.drawable.jr13,\n            R.drawable.jr16,\n            R.drawable.jr14,\n            R.drawable.jr15,\n            R.drawable.jr17,\n            R.drawable.jr1,\n            R.drawable.jr2,\n            R.drawable.jr3,\n            R.drawable.jr4,\n            R.drawable.jr5\n    };\n\n    public static final Integer[] res_scn = new Integer[]{\n            R.drawable.scn1,\n            R.drawable.scn2\n    };\n    public static final String[] girl_name = new String[]{\n            \"Anna\",\n            \"Sindy\",\n            \"Venus\",\n            \"Pamela\",\n            \"Chantel\",\n            \"Lostus\",\n            \"Sephia\",\n            \"Sophy\",\n            \"YahoLee\",\n            \"Liza\",\n            \"Angel\",\n            \"Cristy\",\n            \"Gobby\",\n            \"Sophia\",\n            \"Nicole\",\n            \"Emily\",\n            \"Tiffany\",\n            \"Susan\",\n            \"Vicki\",\n            \"Eva\",\n            \"Ruby\",\n            \"Toby\",\n            \"Gobia\",\n            \"Victoria\",\n            \"Annus\",\n            \"Sammus\",\n            \"Sindia\",\n            \"Erica\",\n            \"Vivian\",\n            \"Septhanie\",\n            \"Fiona\",\n            \"Leonia\",\n            \"Karon\"\n    };\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/modules/TimeLineModel.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.modules;\n\n/**\n * Created by zJJ on 4/27/2016.\n */\npublic class TimeLineModel {\n    private String name;\n    private int age;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public int getAge() {\n        return age;\n    }\n\n    public void setAge(int age) {\n        this.age = age;\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/modules/ViewPagerAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.modules;\n\nimport androidx.viewpager.widget.PagerAdapter;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.marshalchen.ultimaterecyclerview.demo.R;\n\nclass ViewPagerAdapter extends PagerAdapter {\n\n    public Object instantiateItem(ViewGroup collection, int position) {\n\n        int resId = 0;\n        switch (position) {\n            case 0:\n                resId = R.id.primaryContentCardView;\n                break;\n            case 1:\n                resId = R.id.secondaryContentFrameLayout;\n                break;\n        }\n        return collection.findViewById(resId);\n    }\n\n    @Override\n    public int getCount() {\n        return 2;\n    }\n\n    @Override\n    public boolean isViewFromObject(View arg0, Object arg1) {\n        return arg0 == ((View) arg1);\n    }\n}"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/multiitemdemo/MultiViewTypesActivity.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.multiitemdemo;\n\nimport android.graphics.Color;\nimport android.graphics.DashPathEffect;\nimport android.graphics.Paint;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.appcompat.widget.Toolbar;\nimport android.view.LayoutInflater;\nimport android.view.View;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.ui.divideritemdecoration.HorizontalDividerItemDecoration;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * A activity which can be swiped to show bottom view with default horizontal divider item decoration.\n */\npublic class MultiViewTypesActivity extends AppCompatActivity {\n\n    UltimateRecyclerView ultimateRecyclerView;\n    MultiViewTypesRecyclerViewAdapter simpleRecyclerViewAdapter = null;\n    LinearLayoutManager linearLayoutManager;\n    int moreNum = 100;\n    Toolbar toolbar;\n\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_loadmore);\n\n        toolbar = (Toolbar) findViewById(R.id.tool_bar);\n        setSupportActionBar(toolbar);\n        getSupportActionBar().setDisplayShowTitleEnabled(false);\n\n\n        ultimateRecyclerView = (UltimateRecyclerView) findViewById(R.id.ultimate_recycler_view);\n        ultimateRecyclerView.setHasFixedSize(false);\n        List<String> stringList = new ArrayList<>();\n\n        stringList.add(\"111\");\n        stringList.add(\"aaa\");\n        stringList.add(\"222\");\n        stringList.add(\"33\");\n        stringList.add(\"44\");\n        stringList.add(\"55\");\n\n\n        simpleRecyclerViewAdapter = new MultiViewTypesRecyclerViewAdapter(stringList);\n        simpleRecyclerViewAdapter.setCustomLoadMoreView(\n                LayoutInflater.from(this).inflate(R.layout.custom_bottom_progressbar, null));\n\n//        stringList.add(\"66\");\n//        stringList.add(\"11771\");\n        linearLayoutManager = new LinearLayoutManager(this);\n        ultimateRecyclerView.setLayoutManager(linearLayoutManager);\n        // ultimateRecyclerView.setAdapter(simpleRecyclerViewAdapter);\n        ultimateRecyclerView.setAdapter(simpleRecyclerViewAdapter);\n        ultimateRecyclerView.setDefaultOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {\n            @Override\n            public void onRefresh() {\n                new Handler().postDelayed(new Runnable() {\n                    @Override\n                    public void run() {\n                        simpleRecyclerViewAdapter.insert(\"Refresh things\", 0);\n                        ultimateRecyclerView.setRefreshing(false);\n                        //   ultimateRecyclerView.scrollBy(0, -50);\n                        linearLayoutManager.scrollToPosition(0);\n                    }\n                }, 1000);\n            }\n        });\n\n        Paint paint = new Paint();\n        paint.setStrokeWidth(5);\n        paint.setColor(Color.BLUE);\n        paint.setAntiAlias(true);\n        paint.setPathEffect(new DashPathEffect(new float[]{25.0f, 25.0f}, 0));\n        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {\n            ultimateRecyclerView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);\n        }\n        ultimateRecyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(this).paint(paint).build());\n\n      //  simpleRecyclerViewAdapter.ad\n\n    }\n\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/multiitemdemo/MultiViewTypesRecyclerViewAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.multiitemdemo;\n\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ListView;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateDifferentViewTypeAdapter;\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class MultiViewTypesRecyclerViewAdapter extends UltimateDifferentViewTypeAdapter {\n    private List<String> mDataset;\n\n    private enum SwipedState {\n        SHOWING_PRIMARY_CONTENT,\n        SHOWING_SECONDARY_CONTENT\n    }\n\n    private List<SwipedState> mItemSwipedStates;\n\n    // Provide a reference to the views for each data item\n    // Complex data items may need more than one view per item, and\n    // you provide access to all the views for a data item in a view holder\n    public static class ViewHolder extends UltimateRecyclerviewViewHolder {\n        // each data item is just a string in this case\n        public View mView;\n\n        public ViewHolder(View v) {\n            super(v);\n            mView = v;\n        }\n    }\n\n    // Provide a suitable constructor (depends on the kind of dataset)\n    public MultiViewTypesRecyclerViewAdapter(List<String> dataSet) {\n        mDataset = dataSet;\n        mItemSwipedStates = new ArrayList<>();\n        for (int i = 0; i < dataSet.size(); i++) {\n            mItemSwipedStates.add(i, SwipedState.SHOWING_PRIMARY_CONTENT);\n        }\n\n        putBinder(SampleViewType.SAMPLE1, new Sample1Binder(this, dataSet));\n        putBinder(SampleViewType.SAMPLE2, new Sample2Binder(this, dataSet));\n        putBinder(SampleViewType.SAMPLE3, new Sample1Binder(this, dataSet));\n        //  ((Sample2Binder) getDataBinder(SampleViewType.SAMPLE2)).addAll(dataSet);\n    }\n\n    public void insert(String string, int position) {\n        insertInternal(mDataset, string, position);\n    }\n\n    public void remove(int position) {\n        removeInternal(mDataset, position);\n    }\n\n\n    /**\n     * requirement: FOOTER, HEADER. it does not bind and need to do that in the header binding\n     *\n     * @param view with no binding view of nothing\n     * @return v\n     */\n    @Override\n    public RecyclerView.ViewHolder newFooterHolder(View view) {\n        return new UltimateRecyclerviewViewHolder<>(view);\n    }\n\n    @Override\n    public RecyclerView.ViewHolder newHeaderHolder(View view) {\n        return new UltimateRecyclerviewViewHolder<>(view);\n    }\n\n    @Override\n    public UltimateRecyclerviewViewHolder onCreateViewHolder(ViewGroup parent) {\n        View v = LayoutInflater.from(parent.getContext())\n                .inflate(R.layout.rv_item_linear, parent, false);\n        ViewHolder vh = new ViewHolder(v);\n        return vh;\n    }\n\n\n    @Override\n    public RecyclerView.ViewHolder onCreateHeaderViewHolder(ViewGroup viewGroup) {\n        return null;\n    }\n\n    @Override\n    public void onBindHeaderViewHolder(RecyclerView.ViewHolder viewHolder, int i) {\n\n    }\n\n//    @Override\n//    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {\n//\n//    }\n\n    /**\n     * Called by RecyclerView to display the data at the specified position. This method should\n     * update the contents of the {@link ViewHolder#itemView} to reflect the item at the given\n     * position.\n     * <p/>\n     * Note that unlike {@link ListView}, RecyclerView will not call this method\n     * again if the position of the item changes in the data set unless the item itself is\n     * invalidated or the new position cannot be determined. For this reason, you should only\n     * use the <code>position</code> parameter while acquiring the related data item inside\n     * this method and should not keep a copy of it. If you need the position of an item later\n     * on (e.g. in a click listener), use {@link ViewHolder#getAdapterPosition()} which will\n     * have the updated adapter position.\n     * <p/>\n     * Override {@link #onBindViewHolder} instead if Adapter can\n     * handle effcient partial bind.\n     *\n     * @param holder   The ViewHolder which should be updated to represent the contents of the\n     *                 item at the given position in the data set.\n     * @param position The position of the item within the adapter's data set.\n     */\n    @Override\n    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {\n\n    }\n\n    // Return the size of your dataset (invoked by the layout manager)\n    @Override\n    public int getItemCount() {\n        return mDataset.size();\n    }\n\n    @Override\n    public int getAdapterItemCount() {\n        return 0;\n    }\n\n    @Override\n    public long generateHeaderId(int position) {\n        return 0;\n    }\n\n    @Override\n    public Enum getEnumFromPosition(int position) {\n        if (position % 2 == 1) {\n            return SampleViewType.SAMPLE1;\n        } else {\n            return SampleViewType.SAMPLE2;\n        }\n    }\n\n    @Override\n    public Enum getEnumFromOrdinal(int ordinal) {\n        return SampleViewType.values()[ordinal];\n    }\n\n    enum SampleViewType {\n        SAMPLE1, SAMPLE2, SAMPLE3\n    }\n\n\n}"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/multiitemdemo/Sample1Binder.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.multiitemdemo;\n\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateDifferentViewTypeAdapter;\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.multiViewTypes.DataBinder;\n\nimport java.util.List;\n\n/**\n * Created by cym on 15/5/18.\n */\npublic class Sample1Binder extends DataBinder<Sample1Binder.ViewHolder> {\n    List<String> dataSet;\n    public Sample1Binder(UltimateDifferentViewTypeAdapter dataBindAdapter,List<String> dataSet) {\n        super(dataBindAdapter);\n        this.dataSet=dataSet;\n    }\n\n    @Override\n    public ViewHolder newViewHolder(ViewGroup parent) {\n        View view = LayoutInflater.from(parent.getContext()).inflate(\n                R.layout.rv_sample_1, parent, false);\n        return new ViewHolder(view);\n    }\n\n    @Override\n    public void bindViewHolder(ViewHolder holder, int position) {\n        holder.mTitleText.setText(\"Sample1Binder   \"+dataSet.get(position));\n\n    }\n\n    @Override\n    public int getItemCount() {\n        return 1;\n    }\n\n    static class ViewHolder extends UltimateRecyclerviewViewHolder {\n\n        TextView mTitleText;\n        ImageView mImageView;\n        TextView mContent;\n\n        public ViewHolder(View view) {\n            super(view);\n            mTitleText = (TextView) view.findViewById(R.id.title_type1);\n            mImageView = (ImageView) view.findViewById(R.id.image_type1);\n            mContent = (TextView) view.findViewById(R.id.content_type1);\n        }\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/multiitemdemo/Sample2Binder.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.multiitemdemo;\n\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateDifferentViewTypeAdapter;\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.multiViewTypes.DataBinder;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by cym on 15/5/18.\n */\npublic class Sample2Binder extends DataBinder<Sample2Binder.ViewHolder> {\n    private List<String> mList;\n    public Sample2Binder(UltimateDifferentViewTypeAdapter dataBindAdapter,List<String> mList) {\n        super(dataBindAdapter);\n        this.mList=mList;\n    }\n\n    @Override\n    public ViewHolder newViewHolder(ViewGroup parent) {\n        View view = LayoutInflater.from(parent.getContext()).inflate(\n                R.layout.rv_item_linear, parent, false);\n        return new ViewHolder(view);\n    }\n\n    @Override\n    public void bindViewHolder(ViewHolder holder, int position) {\n        holder.mTitleText.setText(\"Sample type 2   \"+mList.get(position));\n    }\n\n    @Override\n    public int getItemCount() {\n        return 1;\n    }\n\n    static class ViewHolder extends UltimateRecyclerviewViewHolder {\n\n        TextView mTitleText;\n        ImageView mImageView;\n        TextView mContent;\n\n        public ViewHolder(View view) {\n            super(view);\n            mTitleText = (TextView) view.findViewById(R.id.textview);\n            mImageView = (ImageView) view.findViewById(R.id.imageview);\n\n        }\n    }\n    private List<String> mDataSet = new ArrayList<>();\n    public void addAll(List<String> dataSet) {\n        mDataSet.addAll(dataSet);\n        notifyBinderDataSetChanged();\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/rvComponents/SimpleAnimationAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.rvComponents;\n\nimport android.animation.Animator;\nimport android.graphics.Color;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.animation.Interpolator;\nimport android.view.animation.LinearInterpolator;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.marshalchen.ultimaterecyclerview.URLogs;\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder;\nimport com.marshalchen.ultimaterecyclerview.UltimateViewAdapter;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\n\nimport java.security.SecureRandom;\nimport java.util.List;\n\nimport jp.wasabeef.recyclerview.internal.ViewHelper;\n\n\npublic class SimpleAnimationAdapter extends UltimateViewAdapter<RecyclerView.ViewHolder> {\n    private List<String> stringList;\n\n    public SimpleAnimationAdapter(List<String> stringList) {\n        this.stringList = stringList;\n    }\n\n    private int mDuration = 300;\n    private Interpolator mInterpolator = new LinearInterpolator();\n    private int mLastPosition = 5;\n\n    private boolean isFirstOnly = true;\n\n\n    @Override\n    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {\n        if (position < getItemCount() && (customHeaderView != null ? position <= stringList.size() : position < stringList.size()) && (customHeaderView != null ? position > 0 : true)) {\n\n            ((ViewHolder) holder).textViewSample.setText(stringList.get(customHeaderView != null ? position - 1 : position));\n            // ((ViewHolder) holder).itemView.setActivated(selectedItems.get(position, false));\n        }\n        if (!isFirstOnly || position > mLastPosition) {\n            for (Animator anim : getAdapterAnimations(holder.itemView, AdapterAnimationType.ScaleIn)) {\n                anim.setDuration(mDuration).start();\n                anim.setInterpolator(mInterpolator);\n            }\n            mLastPosition = position;\n        } else {\n            ViewHelper.clear(holder.itemView);\n        }\n\n    }\n\n    @Override\n    public int getAdapterItemCount() {\n        return stringList.size();\n    }\n\n    /**\n     * requirement: FOOTER, HEADER. it does not bind and need to do that in the header binding\n     *\n     * @param view with no binding view of nothing\n     * @return v\n     */\n    @Override\n    public RecyclerView.ViewHolder newFooterHolder(View view) {\n        return new ViewHolder(view, false);\n    }\n\n    @Override\n    public RecyclerView.ViewHolder newHeaderHolder(View view) {\n        return new ViewHolder(view, false);\n    }\n\n    @Override\n    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent) {\n        View v = LayoutInflater.from(parent.getContext())\n                .inflate(R.layout.rv_item_linear, parent, false);\n        return new ViewHolder(v, true);\n    }\n\n\n    public void insert(String string, int position) {\n        insertInternal(stringList, string, position);\n    }\n\n    public void remove(int position) {\n        removeInternal(stringList, position);\n    }\n\n    public void clear() {\n        clearInternal(stringList);\n    }\n\n    public void swapPositions(int from, int to) {\n        swapPositions(stringList, from, to);\n    }\n\n\n    @Override\n    public long generateHeaderId(int position) {\n        URLogs.d(\"position--\" + position + \"   \" + getItem(position));\n        if (getItem(position).length() > 0)\n            return getItem(position).charAt(0);\n        else return -1;\n    }\n\n    @Override\n    public RecyclerView.ViewHolder onCreateHeaderViewHolder(ViewGroup viewGroup) {\n        View view = LayoutInflater.from(viewGroup.getContext())\n                .inflate(R.layout.stick_header_item, viewGroup, false);\n        return new ViewHolder(view, false);\n    }\n\n    @Override\n    public void onBindHeaderViewHolder(RecyclerView.ViewHolder viewHolder, int position) {\n\n        TextView textView = (TextView) viewHolder.itemView.findViewById(R.id.stick_text);\n        textView.setText(String.valueOf(getItem(position).charAt(0)));\n//        viewHolder.itemView.setBackgroundColor(Color.parseColor(\"#AA70DB93\"));\n        viewHolder.itemView.setBackgroundColor(Color.parseColor(\"#AAffffff\"));\n        ImageView imageView = (ImageView) viewHolder.itemView.findViewById(R.id.stick_img);\n\n        SecureRandom imgGen = new SecureRandom();\n        switch (imgGen.nextInt(3)) {\n            case 0:\n                imageView.setImageResource(R.drawable.scn1);\n                break;\n            case 1:\n                imageView.setImageResource(R.drawable.jr13);\n                break;\n            case 2:\n                imageView.setImageResource(R.drawable.jr16);\n                break;\n        }\n\n    }\n//\n//    private int getRandomColor() {\n//        SecureRandom rgen = new SecureRandom();\n//        return Color.HSVToColor(150, new float[]{\n//                rgen.nextInt(359), 1, 1\n//        });\n//    }\n\n\n    public class ViewHolder extends UltimateRecyclerviewViewHolder {\n\n        public TextView textViewSample;\n        public ImageView imageViewSample;\n\n        public ViewHolder(View itemView, boolean normal) {\n            super(itemView);\n//            itemView.setOnTouchListener(new SwipeDismissTouchListener(itemView, null, new SwipeDismissTouchListener.DismissCallbacks() {\n//                @Override\n//                public boolean canDismiss(Object token) {\n//                    Logs.d(\"can dismiss\");\n//                    return true;\n//                }\n//\n//                @Override\n//                public void onDismiss(View view, Object token) {\n//                   // Logs.d(\"dismiss\");\n//                    remove(getPosition());\n//\n//                }\n//            }));\n            if (normal) {\n                textViewSample = (TextView) itemView.findViewById(\n                        R.id.textview);\n                imageViewSample = (ImageView) itemView.findViewById(R.id.imageview);\n            }\n        }\n    }\n\n    public String getItem(int position) {\n        if (customHeaderView != null)\n            position--;\n        if (position < stringList.size())\n            return stringList.get(position);\n        else return \"\";\n    }\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/rvComponents/SwipeAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.rvComponents;\n\nimport android.view.View;\nimport android.widget.Button;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport com.marshalchen.ultimaterecyclerview.SwipeableUltimateViewAdapter;\nimport com.marshalchen.ultimaterecyclerview.URLogs;\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.swipe.SwipeLayout;\n\nimport java.util.List;\n\npublic class SwipeAdapter extends SwipeableUltimateViewAdapter<String> {\n\n    public SwipeAdapter(List<String> mData) {\n        super(mData);\n    }\n\n\n    @Override\n    protected void withBindHolder(UltimateRecyclerviewViewHolder holder, String data, int position) {\n        super.withBindHolder(holder, data, position);\n        ((SVHolder) holder).textView.setText(data);\n    }\n\n    /**\n     * the layout id for the normal data\n     *\n     * @return the ID\n     */\n    @Override\n    protected int getNormalLayoutResId() {\n        return SVHolder.layout;\n    }\n\n    /**\n     * this is the Normal View Holder initiation\n     *\n     * @param view view\n     * @return holder\n     */\n    @Override\n    protected UltimateRecyclerviewViewHolder newViewHolder(final View view) {\n        view.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                URLogs.d(\"click\");\n            }\n        });\n        final SVHolder viewHolder = new SVHolder(view, true);\n        viewHolder.swipeLayout.setOnDoubleClickListener(new SwipeLayout.DoubleClickListener() {\n            @Override\n            public void onDoubleClick(SwipeLayout layout, boolean surface) {\n                Toast.makeText(view.getContext(), \"DoubleClick\", Toast.LENGTH_SHORT).show();\n            }\n        });\n\n        viewHolder.deleteButton.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                removeAt(viewHolder.getPosition());\n                Toast.makeText(view.getContext(), \"Deleted \" + viewHolder.getPosition(), Toast.LENGTH_SHORT).show();\n            }\n        });\n\n        return viewHolder;\n    }\n\n    @Override\n    public SVHolder newFooterHolder(View view) {\n        return new SVHolder(view, false);\n    }\n\n    @Override\n    public SVHolder newHeaderHolder(View view) {\n        return new SVHolder(view, false);\n    }\n\n    @Override\n    public long generateHeaderId(int position) {\n        return 0;\n    }\n\n    @Override\n    public long getItemId(int position) {\n        return position;\n    }\n\n\n    @Override\n    protected void removeNotifyExternal(int pos) {\n        closeItem(pos);\n    }\n\n\n    public static class SVHolder extends UltimateRecyclerviewViewHolder {\n        public static final int layout = R.layout.item_swipeable;\n        public TextView textView;\n        public Button deleteButton;\n        public SwipeLayout swipeLayout;\n\n        public SVHolder(View itemView, boolean bind) {\n            super(itemView);\n            if (bind) {\n                textView = (TextView) itemView.findViewById(R.id.position);\n                deleteButton = (Button) itemView.findViewById(R.id.delete);\n                swipeLayout = (SwipeLayout) itemView.findViewById(R.id.recyclerview_swipe);\n                swipeLayout.setDragEdge(SwipeLayout.DragEdge.Right);\n                swipeLayout.setShowMode(SwipeLayout.ShowMode.PullOut);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/rvComponents/TimeLineAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.rvComponents;\n\nimport android.view.View;\n\nimport com.marshalchen.ultimaterecyclerview.demo.modules.TimeLineModel;\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.easyRegularAdapter;\nimport com.marshalchen.ultimaterecyclerview.ui.timelineview.TimelineView;\n\nimport java.util.List;\n\n/**\n * Created by zJJ on 4/27/2016.\n */\npublic class TimeLineAdapter extends easyRegularAdapter<TimeLineModel, itemNode> {\n\n    public TimeLineAdapter(List<TimeLineModel> feedList) {\n        super(feedList);\n    }\n\n    @Override\n    protected int getNormalLayoutResId() {\n        return itemNode.layout;\n    }\n\n    @Override\n    protected itemNode newViewHolder(View view) {\n        return new itemNode(view);\n    }\n\n    @Override\n    protected void withBindHolder(itemNode holder, TimeLineModel data, int position) {\n        holder.name.setText(\"name：\" + data.getName() + \" age：\" + data.getAge());\n        holder.init(TimelineView.getTimeLineViewType(position, getItemCount()));\n    }\n}"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/rvComponents/itemCommonBinder.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.rvComponents;\n\nimport android.graphics.Color;\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\n\n/**\n * Created by hesk on 16/2/16.\n * this is the example holder for the simple adapter\n */\npublic class itemCommonBinder extends UltimateRecyclerviewViewHolder {\n    public static final int layout = R.layout.rv_item_linear;\n    public TextView textViewSample;\n    public ImageView imageViewSample;\n    public ProgressBar progressBarSample;\n    public RelativeLayout item_view;\n\n    /**\n     * give more control over NORMAL or HEADER view binding\n     *\n     * @param itemView view binding\n     * @param isItem   bool\n     */\n    public itemCommonBinder(View itemView, boolean isItem) {\n        super(itemView);\n//            itemView.setOnTouchListener(new SwipeDismissTouchListener(itemView, null, new SwipeDismissTouchListener.DismissCallbacks() {\n//                @Override\n//                public boolean canDismiss(Object token) {\n//                    Logs.d(\"can dismiss\");\n//                    return true;\n//                }\n//\n//                @Override\n//                public void onDismiss(View view, Object token) {\n//                   // Logs.d(\"dismiss\");\n//                    remove(getPosition());\n//\n//                }\n//            }));\n        if (isItem) {\n            textViewSample = (TextView) itemView.findViewById(R.id.str_textview_holder);\n            imageViewSample = (ImageView) itemView.findViewById(R.id.str_image_holder);\n            progressBarSample = (ProgressBar) itemView.findViewById(R.id.str_progress_holder);\n            item_view = (RelativeLayout) itemView.findViewById(R.id.str_item_view);\n        }\n\n    }\n\n    @Override\n    public void onItemSelected() {\n        itemView.setBackgroundColor(Color.LTGRAY);\n    }\n\n    @Override\n    public void onItemClear() {\n        itemView.setBackgroundColor(0);\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/rvComponents/itemGridCellBinder.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.rvComponents;\n\nimport android.graphics.Color;\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\n\n/**\n * Created by hesk on 3/2/16.\n */\npublic class itemGridCellBinder extends UltimateRecyclerviewViewHolder {\n    public static final int layout = R.layout.grid_item;\n    public TextView textViewSample;\n    public ImageView imageViewSample;\n    public View item_view;\n\n    public itemGridCellBinder(View itemView, boolean isItem) {\n        super(itemView);\n        if (isItem) {\n            textViewSample = (TextView) itemView.findViewById(R.id.example_row_tv_title);\n            imageViewSample = (ImageView) itemView.findViewById(R.id.example_row_iv_image);\n            item_view = itemView.findViewById(R.id.planview);\n        }\n    }\n\n    @Override\n    public void onItemSelected() {\n        itemView.setBackgroundColor(Color.LTGRAY);\n    }\n\n    @Override\n    public void onItemClear() {\n        itemView.setBackgroundColor(0);\n    }\n}"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/rvComponents/itemNode.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.rvComponents;\n\nimport android.view.View;\nimport android.widget.TextView;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.ui.timelineview.TimelineView;\n\n/**\n * Created by zJJ on 4/27/2016.\n */\npublic class itemNode extends UltimateRecyclerviewViewHolder {\n    public static final int layout = R.layout.item_node;\n    public TimelineView mTimelineView;\n    public TextView name;\n\n    /**\n     * the view\n     *\n     * @param itemView the view context\n     */\n    public itemNode(View itemView) {\n        super(itemView);\n        name = (TextView) itemView.findViewById(R.id.tx_name);\n        mTimelineView = (TimelineView) itemView.findViewById(R.id.time_marker);\n    }\n\n    /**\n     * this is the initialization of the node\n     *\n     * @param viewTypeLine the type of node to redraw\n     */\n    public void init(int viewTypeLine) {\n        mTimelineView.initLine(viewTypeLine);\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/rvComponents/itemStaggerCommonBinder.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.rvComponents;\n\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\n\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.StaggerHolder;\n\n/**\n * Created by hesk on 5/4/16.\n */\npublic class itemStaggerCommonBinder extends StaggerHolder {\n    public static final int layout = R.layout.rv_item_stagger;\n\n    public TextView textViewSample;\n    public ImageView imageViewSample;\n    public ProgressBar progressBarSample;\n    public RelativeLayout item_view;\n\n    public itemStaggerCommonBinder(View itemView, int type) {\n        super(itemView, type);\n    }\n\n    @Override\n    protected void bindHeader(View view) {\n\n    }\n\n    @Override\n    protected void bindFooter(View view) {\n\n    }\n\n    @Override\n    protected void bindNormal(View view) {\n        textViewSample = (TextView) itemView.findViewById(R.id.str_textview_holder);\n        imageViewSample = (ImageView) itemView.findViewById(R.id.str_image_holder);\n        progressBarSample = (ProgressBar) itemView.findViewById(R.id.str_progress_holder);\n        item_view = (RelativeLayout) itemView.findViewById(R.id.str_item_view);\n    }\n\n    @Override\n    protected void bindAd(View view) {\n\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/rvComponents/sectionCommonAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.rvComponents;\n\nimport android.graphics.Color;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.easyRegularAdapter;\n\nimport java.security.SecureRandom;\nimport java.util.List;\n\n/**\n * Created by hesk on 16/2/16.\n */\npublic class sectionCommonAdapter extends easyRegularAdapter<String, itemCommonBinder> {\n\n    /**\n     * dynamic object to start\n     *\n     * @param list the list source\n     */\n    public sectionCommonAdapter(List<String> list) {\n        super(list);\n    }\n\n    /**\n     * the layout id for the normal data\n     *\n     * @return the ID\n     */\n    @Override\n    protected int getNormalLayoutResId() {\n        return itemCommonBinder.layout;\n    }\n\n    @Override\n    protected itemCommonBinder newViewHolder(View view) {\n        return new itemCommonBinder(view, true);\n    }\n\n\n    private void setRandomImage(ImageView image) {\n        SecureRandom imgGen = new SecureRandom();\n        switch (imgGen.nextInt(3)) {\n            case 0:\n                image.setImageResource(R.drawable.scn1);\n                break;\n            case 1:\n                image.setImageResource(R.drawable.jr13);\n                break;\n            case 2:\n                image.setImageResource(R.drawable.jr16);\n                break;\n        }\n    }\n\n    @Override\n    protected void withBindHolder(itemCommonBinder holder, String data, int position) {\n        char Firstletter = data.charAt(0);\n        holder.textViewSample.setText(data);\n        holder.item_view.setBackgroundColor(Color.parseColor(\"#AAffffff\"));\n        setRandomImage(holder.imageViewSample);\n       /* if (position < getItemCount() && (hasHeaderView() ? position <= getAdapterItemCount() : position < getAdapterItemCount()) && (hasHeaderView() ? position > 0 : true)) {\n            holder.textViewSample.setText(getItem(hasHeaderView() ? position - 1 : position));\n           if (mDragStartListener != null) {\n                holder.item_view.setOnTouchListener(new View.OnTouchListener() {\n                    @Override\n                    public boolean onTouch(View v, MotionEvent event) {\n                        return false;\n                    }\n                });\n            }\n        }*/\n    }\n\n\n    @Override\n    public void onItemMove(int fromPosition, int toPosition) {\n        swapPositions(fromPosition, toPosition);\n//        notifyItemMoved(fromPosition, toPosition);\n        super.onItemMove(fromPosition, toPosition);\n    }\n\n    @Override\n    public void onItemDismiss(int position) {\n        if (position > 0)\n            removeAt(position);\n        // notifyItemRemoved(position);\n        //        notifyDataSetChanged();\n        super.onItemDismiss(position);\n    }\n\n    public void setOnDragStartListener(OnStartDragListener dragStartListener) {\n        mDragStartListener = dragStartListener;\n\n    }\n\n    /**\n     * this is the way to enable section header\n     *\n     * @param i position in the display items\n     * @return long position\n     */\n    @Override\n    public long generateHeaderId(int i) {\n        if (getItem(i).length() > 0) {\n            return getItem(i).charAt(0);\n        } else return -1;\n    }\n\n    /**\n     * this is the way to enable section header\n     *\n     * @param viewGroup enable the view group\n     * @return view holder\n     */\n\n    @Override\n    public UltimateRecyclerviewViewHolder onCreateHeaderViewHolder(ViewGroup viewGroup) {\n        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.stick_header_item, viewGroup, false);\n        return new UltimateRecyclerviewViewHolder(view) {\n\n        };\n    }\n\n    /**\n     * this is the section header binding\n     *\n     * @param viewHolder section holder\n     * @param position   position\n     */\n    @Override\n    public void onBindHeaderViewHolder(RecyclerView.ViewHolder viewHolder, int position) {\n\n        TextView textView = (TextView) viewHolder.itemView.findViewById(R.id.stick_text);\n        textView.setText(String.valueOf(getItem(hasHeaderView() ? position - 1 : position).charAt(0)));\n//        viewHolder.itemView.setBackgroundColor(Color.parseColor(\"#AA70DB93\"));\n        viewHolder.itemView.setBackgroundColor(Color.parseColor(\"#AAffffff\"));\n        ImageView imageView = (ImageView) viewHolder.itemView.findViewById(R.id.stick_img);\n\n        SecureRandom imgGen = new SecureRandom();\n        switch (imgGen.nextInt(3)) {\n            case 0:\n                imageView.setImageResource(R.drawable.scn1);\n                break;\n            case 1:\n                imageView.setImageResource(R.drawable.jr13);\n                break;\n            case 2:\n                imageView.setImageResource(R.drawable.jr16);\n                break;\n        }\n\n\n    }\n\n    @Override\n    public itemCommonBinder newFooterHolder(View view) {\n        return new itemCommonBinder(view, false);\n    }\n\n    @Override\n    public itemCommonBinder newHeaderHolder(View view) {\n        return new itemCommonBinder(view, false);\n    }\n}"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/rvComponents/sectionZeroAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.rvComponents;\n\nimport android.graphics.Color;\nimport android.view.View;\n\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.easyRegularAdapter;\n\nimport java.security.SecureRandom;\nimport java.util.List;\n\n\npublic class sectionZeroAdapter extends easyRegularAdapter<String, itemCommonBinder> {\n    // private List<String> stringList;\n\n    public sectionZeroAdapter(List<String> stringList) {\n        super(stringList);\n        //  this.stringList = stringList;\n    }\n\n    /**\n     * the layout id for the normal data\n     *\n     * @return the ID\n     */\n    @Override\n    protected int getNormalLayoutResId() {\n        return itemCommonBinder.layout;\n    }\n\n    @Override\n    protected itemCommonBinder newViewHolder(View view) {\n        return new itemCommonBinder(view, true);\n    }\n\n\n\n    @Override\n    public itemCommonBinder newFooterHolder(View view) {\n        return new itemCommonBinder(view, false);\n    }\n\n    @Override\n    public itemCommonBinder newHeaderHolder(View view) {\n        return new itemCommonBinder(view, false);\n    }\n\n\n  /*  @Override\n    public void onBindViewHolder(final SHol holder, int position) {\n        if (position < getItemCount() && (customHeaderView != null ? position <= stringList.size() : position < stringList.size()) && (customHeaderView != null ? position > 0 : true)) {\n\n            ((SHol) holder).textViewSample.setText(stringList.get(customHeaderView != null ? position - 1 : position));\n            // ((ViewHolder) holder).itemView.setActivated(selectedItems.get(position, false));\n            if (mDragStartListener != null) {\n//                ((ViewHolder) holder).imageViewSample.setOnTouchListener(new View.OnTouchListener() {\n//                    @Override\n//                    public boolean onTouch(View v, MotionEvent event) {\n//                        if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {\n//                            mDragStartListener.onStartDrag(holder);\n//                        }\n//                        return false;\n//                    }\n//                });\n\n                ((SHol) holder).item_view.setOnTouchListener(new View.OnTouchListener() {\n                    @Override\n                    public boolean onTouch(View v, MotionEvent event) {\n                        return false;\n                    }\n                });\n            }\n        }\n\n    }\n*/\n\n\n    public final void insertOne(String e) {\n        insertLast(e);\n    }\n\n    public final void removeLastOne() {\n        removeLast();\n    }\n\n/*\n    @Override\n    public long generateHeaderId(int position) {\n        // URLogs.d(\"position--\" + position + \"   \" + getItem(position));\n        if (getItem(position).length() > 0)\n            return getItem(position).charAt(0);\n        else return -1;\n    }*/\n\n    @Override\n    protected void withBindHolder(itemCommonBinder holder, String data, int position) {\n        holder.textViewSample.setText(data + \"just the sample data\");\n        holder.item_view.setBackgroundColor(Color.parseColor(\"#AAffffff\"));\n        SecureRandom imgGen = new SecureRandom();\n        switch (imgGen.nextInt(3)) {\n            case 0:\n                holder.imageViewSample.setImageResource(R.drawable.scn1);\n                break;\n            case 1:\n                holder.imageViewSample.setImageResource(R.drawable.jr13);\n                break;\n            case 2:\n                holder.imageViewSample.setImageResource(R.drawable.jr16);\n                break;\n        }\n    }\n\n\n    @Override\n    public void onItemMove(int fromPosition, int toPosition) {\n        swapPositions(fromPosition, toPosition);\n//        notifyItemMoved(fromPosition, toPosition);\n        super.onItemMove(fromPosition, toPosition);\n    }\n\n    @Override\n    public void onItemDismiss(int position) {\n        if (position > 0)\n            removeAt(position);\n        // notifyItemRemoved(position);\n        //        notifyDataSetChanged();\n        super.onItemDismiss(position);\n    }\n\n   /* public String getItem(int position) {\n        if (customHeaderView != null)\n            position--;\n        if (position < stringList.size())\n            return stringList.get(position);\n        else\n            return \"\";\n    }*/\n//\n//    private int getRandomColor() {\n//        SecureRandom rgen = new SecureRandom();\n//        return Color.HSVToColor(150, new float[]{\n//                rgen.nextInt(359), 1, 1\n//        });\n//    }\n\n    public void setOnDragStartListener(OnStartDragListener dragStartListener) {\n        mDragStartListener = dragStartListener;\n\n    }\n\n\n}"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/rvComponents/staggerAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.rvComponents;\n\nimport android.graphics.Color;\nimport android.view.View;\n\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.easyRegularAdapter;\n\nimport java.security.SecureRandom;\nimport java.util.List;\n\n/**\n * Created by hesk on 5/4/16.\n */\npublic class staggerAdapter extends easyRegularAdapter<String, itemStaggerCommonBinder> {\n\n\n    public staggerAdapter(List<String> stringList) {\n        super(stringList);\n        //  this.stringList = stringList;\n    }\n\n    @Override\n    protected int getNormalLayoutResId() {\n        return itemStaggerCommonBinder.layout;\n    }\n\n    @Override\n    protected itemStaggerCommonBinder newViewHolder(View view) {\n        return new itemStaggerCommonBinder(view, VIEW_TYPES.NORMAL);\n    }\n\n    @Override\n    public itemStaggerCommonBinder newFooterHolder(View view) {\n        return new itemStaggerCommonBinder(view, VIEW_TYPES.FOOTER);\n    }\n\n    @Override\n    public itemStaggerCommonBinder newHeaderHolder(View view) {\n        return new itemStaggerCommonBinder(view, VIEW_TYPES.HEADER);\n    }\n\n    @Override\n    protected void withBindHolder(itemStaggerCommonBinder holder, String data, int position) {\n        holder.textViewSample.setText(data + \"just the sample data\");\n        holder.item_view.setBackgroundColor(Color.parseColor(\"#AAffffff\"));\n        SecureRandom imgGen = new SecureRandom();\n        switch (imgGen.nextInt(3)) {\n            case 0:\n                holder.imageViewSample.setImageResource(R.drawable.scn1);\n                break;\n            case 1:\n                holder.imageViewSample.setImageResource(R.drawable.jr13);\n                break;\n            case 2:\n                holder.imageViewSample.setImageResource(R.drawable.jr16);\n                break;\n        }\n    }\n\n\n    @Override\n    public void onItemMove(int fromPosition, int toPosition) {\n        swapPositions(fromPosition, toPosition);\n//        notifyItemMoved(fromPosition, toPosition);\n        super.onItemMove(fromPosition, toPosition);\n    }\n\n    @Override\n    public void onItemDismiss(int position) {\n        if (position > 0)\n            removeAt(position);\n        // notifyItemRemoved(position);\n        //        notifyDataSetChanged();\n        super.onItemDismiss(position);\n    }\n\n    public void setOnDragStartListener(OnStartDragListener dragStartListener) {\n        mDragStartListener = dragStartListener;\n\n    }\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/scrollableobservable/BaseActivity.java",
    "content": "/*\n * Copyright 2014 Soichiro Kashima\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.marshalchen.ultimaterecyclerview.demo.scrollableobservable;\n\nimport android.content.res.TypedArray;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.util.TypedValue;\nimport android.view.View;\nimport android.widget.AbsListView;\nimport android.widget.ArrayAdapter;\nimport android.widget.ListView;\n\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.demo.rvComponents.sectionZeroAdapter;\n\nimport java.util.ArrayList;\n\npublic abstract class BaseActivity extends AppCompatActivity {\n    private static final int NUM_OF_ITEMS = 100;\n    private static final int NUM_OF_ITEMS_FEW = 3;\n\n    protected int getActionBarSize() {\n        TypedValue typedValue = new TypedValue();\n        int[] textSizeAttr = new int[]{R.attr.actionBarSize};\n        int indexOfAttrTextSize = 0;\n        TypedArray a = obtainStyledAttributes(typedValue.data, textSizeAttr);\n        int actionBarSize = a.getDimensionPixelSize(indexOfAttrTextSize, -1);\n        a.recycle();\n        return actionBarSize;\n    }\n\n    protected int getScreenHeight() {\n        return findViewById(android.R.id.content).getHeight();\n    }\n\n    public static ArrayList<String> getDummyData() {\n        return getDummyData(NUM_OF_ITEMS);\n    }\n\n    public static ArrayList<String> getDummyData(int num) {\n        ArrayList<String> items = new ArrayList<>();\n        for (int i = 1; i <= num; i++) {\n            items.add(\"Item \" + i);\n        }\n        return items;\n    }\n\n    protected void setDummyData(ListView listView) {\n        setDummyData(listView, NUM_OF_ITEMS);\n    }\n\n    protected void setDummyDataFew(ListView listView) {\n        setDummyData(listView, NUM_OF_ITEMS_FEW);\n    }\n\n    protected void setDummyData(ListView listView, int num) {\n        listView.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, getDummyData(num)));\n    }\n\n    protected void setDummyDataWithHeader(ListView listView, int headerHeight) {\n        setDummyDataWithHeader(listView, headerHeight, NUM_OF_ITEMS);\n    }\n\n    protected void setDummyDataWithHeader(ListView listView, int headerHeight, int num) {\n        View headerView = new View(this);\n        headerView.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, headerHeight));\n        headerView.setMinimumHeight(headerHeight);\n        // This is required to disable header's list selector effect\n        headerView.setClickable(true);\n        setDummyDataWithHeader(listView, headerView, num);\n    }\n\n    protected void setDummyDataWithHeader(ListView listView, View headerView, int num) {\n        listView.addHeaderView(headerView);\n        setDummyData(listView, num);\n    }\n/*\n    protected void setDummyData(GridView gridView) {\n        gridView.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, getDummyData()));\n    }\n\n    protected void setDummyData(RecyclerView recyclerView) {\n        setDummyData(recyclerView, NUM_OF_ITEMS);\n    }\n\n    protected void setDummyDataFew(RecyclerView recyclerView) {\n        setDummyData(recyclerView, NUM_OF_ITEMS_FEW);\n    }*/\n\n    protected void setDummyData(RecyclerView recyclerView, int num) {\n        recyclerView.setAdapter(new sectionZeroAdapter(getDummyData(num)));\n    }\n\n    protected void setDummyData(RecyclerView recyclerView) {\n        setDummyData(recyclerView, NUM_OF_ITEMS);\n    }\n\n\n /*\n    protected void setDummyDataWithHeader(RecyclerView recyclerView, int headerHeight) {\n        View headerView = new View(this);\n        headerView.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, headerHeight));\n        headerView.setMinimumHeight(headerHeight);\n        // This is required to disable header's list selector effect\n        headerView.setClickable(true);\n        // setDummyDataWithHeader(recyclerView, headerView);\n    }\n\n   protected void setDummyDataWithHeader(RecyclerView recyclerView, View headerView) {\n        recyclerView.setAdapter(new SimpleAdapter(this, getDummyData(), headerView));\n    }*/\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/scrollableobservable/BaseFragment.java",
    "content": "/*\n * Copyright 2014 Soichiro Kashima\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.marshalchen.ultimaterecyclerview.demo.scrollableobservable;\n\nimport android.app.Activity;\nimport android.content.res.TypedArray;\nimport androidx.fragment.app.Fragment;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.util.TypedValue;\nimport android.view.View;\nimport android.widget.ArrayAdapter;\nimport android.widget.GridView;\nimport android.widget.ListView;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.demo.rvComponents.sectionZeroAdapter;\n\nimport java.util.ArrayList;\n\npublic abstract class BaseFragment extends Fragment {\n\n\n    public static ArrayList<String> getDummyData() {\n        return BaseActivity.getDummyData();\n    }\n\n    protected int getActionBarSize() {\n        Activity activity = getActivity();\n        if (activity == null) {\n            return 0;\n        }\n        TypedValue typedValue = new TypedValue();\n        int[] textSizeAttr = new int[]{R.attr.actionBarSize};\n        int indexOfAttrTextSize = 0;\n        TypedArray a = activity.obtainStyledAttributes(typedValue.data, textSizeAttr);\n        int actionBarSize = a.getDimensionPixelSize(indexOfAttrTextSize, -1);\n        a.recycle();\n        return actionBarSize;\n    }\n\n    protected int getScreenHeight() {\n        Activity activity = getActivity();\n        if (activity == null) {\n            return 0;\n        }\n        return activity.findViewById(android.R.id.content).getHeight();\n    }\n\n    protected void setDummyData(ListView listView) {\n        listView.setAdapter(new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, getDummyData()));\n    }\n\n    protected void setDummyDataWithHeader(ListView listView, View headerView) {\n        listView.addHeaderView(headerView);\n        setDummyData(listView);\n    }\n\n    protected void setDummyData(GridView gridView) {\n        gridView.setAdapter(new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, getDummyData()));\n    }\n\n    protected void setDummyData(RecyclerView recyclerView) {\n        recyclerView.setAdapter(new sectionZeroAdapter(getDummyData()));\n    }\n\n    protected void setDummyData(UltimateRecyclerView recyclerView) {\n        recyclerView.setAdapter(new sectionZeroAdapter(getDummyData()));\n    }\n\n  /*  protected void setDummyDataWithHeader(RecyclerView recyclerView, View headerView) {\n        recyclerView.setAdapter(new SimpleHeaderRecyclerAdapter(getActivity(), getDummyData(), headerView));\n    }*/\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/scrollableobservable/ScrollObservablesActivity.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.scrollableobservable;\n\nimport android.os.Bundle;\nimport androidx.fragment.app.FragmentManager;\nimport androidx.fragment.app.FragmentTransaction;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.appcompat.widget.Toolbar;\n\nimport com.marshalchen.ultimaterecyclerview.demo.R;\n\n/**\n * Created by hesk on 12/6/15.\n */\npublic class ScrollObservablesActivity extends AppCompatActivity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.simple_scroll_activity);\n        setSupportActionBar((Toolbar) findViewById(R.id.toolbar));\n        FragmentManager fm = getSupportFragmentManager();\n        if (fm.findFragmentByTag(ViewPagerTabFragmentParentFragment.FRAGMENT_TAG) == null) {\n            FragmentTransaction ft = fm.beginTransaction();\n            ft.add(R.id.fragment, new ViewPagerTabFragmentParentFragment(),\n                    ViewPagerTabFragmentParentFragment.FRAGMENT_TAG);\n            ft.commit();\n            fm.executePendingTransactions();\n        }\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/scrollableobservable/ViewPagerFragmentListSingle.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.scrollableobservable;\n\nimport android.os.Bundle;\n\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.marshalchen.ultimaterecyclerview.ObservableScrollViewCallbacks;\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\n\n/**\n * Created by hesk on 12/6/15.\n */\npublic class ViewPagerFragmentListSingle extends BaseFragment {\n    protected ObservableScrollViewCallbacks parent_fragment;\n\n    public static String TAG = \"thisWork\";\n\n    @Override\n    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n        super.onCreateView(inflater, container, savedInstanceState);\n        View view = inflater.inflate(R.layout.listurv, container, false);\n\n        final UltimateRecyclerView recyclerView = (UltimateRecyclerView) view.findViewById(R.id.scroll);\n        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));\n        recyclerView.setHasFixedSize(false);\n        recyclerView.setRefreshing(false);\n        setDummyData(recyclerView);\n        ViewPagerTabFragmentParentFragment parentFragment = (ViewPagerTabFragmentParentFragment) getParentFragment();\n        ViewGroup parentFView = (ViewGroup) parentFragment.getView();\n        if (parentFragment != null) {\n            recyclerView.setTouchInterceptionViewGroup((ViewGroup) parentFView.findViewById(R.id.container));\n            if (parentFragment instanceof ObservableScrollViewCallbacks) {\n                recyclerView.setScrollViewCallbacks(parentFragment);\n                Log.d(TAG, \"this is ObservableScrollViewCallbacks\");\n            }\n        }\n\n        return view;\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/scrollableobservable/ViewPagerTabFragmentParentFragment.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.scrollableobservable;\n\nimport android.animation.ValueAnimator;\nimport android.os.Bundle;\nimport androidx.annotation.Nullable;\nimport androidx.fragment.app.Fragment;\nimport androidx.fragment.app.FragmentManager;\nimport androidx.core.view.ViewCompat;\nimport androidx.viewpager.widget.ViewPager;\nimport androidx.appcompat.app.AppCompatActivity;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewConfiguration;\nimport android.view.ViewGroup;\nimport android.widget.FrameLayout;\nimport android.widget.ImageView;\n\nimport com.marshalchen.ultimaterecyclerview.ObservableScrollState;\nimport com.marshalchen.ultimaterecyclerview.ObservableScrollViewCallbacks;\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\nimport com.marshalchen.ultimaterecyclerview.uiUtils.ScrollUtils;\nimport com.marshalchen.ultimaterecyclerview.Scrollable;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\nimport com.marshalchen.ultimaterecyclerview.demo.scrollableobservable.widget.SlidingTabLayout;\nimport com.marshalchen.ultimaterecyclerview.uiUtils.CacheFragmentStatePagerAdapter;\nimport com.marshalchen.ultimaterecyclerview.uiUtils.TouchInterceptionLayout;\n\n\n/**\n * Created by hesk on 12/6/15.\n */\npublic class ViewPagerTabFragmentParentFragment extends BaseFragment implements ObservableScrollViewCallbacks {\n\n    public static final String FRAGMENT_TAG = \"fragmentViewPager\";\n\n    private TouchInterceptionLayout mInterceptionLayout;\n    private ViewPager mPager;\n    private NavigationAdapter mPagerAdapter;\n    private int mSlop;\n    private boolean mScrolled = false;\n    private ObservableScrollState mLastScrollState;\n    private View mHeaderContainer;\n    private ImageView headerBanner;\n    private int slidingTabLayout_height, mBaseTranslationY;\n    private SlidingTabLayout slidingTabLayout;\n    private FrameLayout pager_wrapper;\n    private int totalfullheight;\n\n    @Override\n    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n        View view = inflater.inflate(R.layout.simplefragment_viewpaper_fragment_parent, container, false);\n        totalfullheight = view.getHeight();\n        AppCompatActivity parentActivity = (AppCompatActivity) getActivity();\n        mPagerAdapter = new NavigationAdapter(getChildFragmentManager());\n        mPager = (ViewPager) view.findViewById(R.id.pager);\n        pager_wrapper = (FrameLayout) view.findViewById(R.id.pager_wrapper);\n        mPager.setAdapter(mPagerAdapter);\n        mHeaderContainer = (View) view.findViewById(R.id.header);\n        headerBanner = (ImageView) view.findViewById(R.id.header_background);\n        slidingTabLayout = (SlidingTabLayout) view.findViewById(R.id.sliding_tabs);\n        slidingTabLayout.setCustomTabView(R.layout.tab_indicator, android.R.id.text1);\n        slidingTabLayout.setSelectedIndicatorColors(getResources().getColor(R.color.accent));\n        slidingTabLayout.setDistributeEvenly(true);\n        slidingTabLayout.setViewPager(mPager);\n        ViewConfiguration vc = ViewConfiguration.get(parentActivity);\n        mSlop = vc.getScaledTouchSlop();\n        mInterceptionLayout = (TouchInterceptionLayout) view.findViewById(R.id.container);\n        mInterceptionLayout.setScrollInterceptionListener(mInterceptionListener);\n        mPager.setCurrentItem(0);\n        return view;\n    }\n\n    @Override\n    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {\n        setpagertoppadding(headerBanner.getHeight() + slidingTabLayout.getHeight());\n    }\n\n    protected void setpagertoppadding(float m) {\n        final int mheight = (int) Math.abs(m);\n        pager_wrapper.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, mheight));\n        pager_wrapper.requestLayout();\n    }\n\n    @Override\n    public void onScrollChanged(int scrollY, boolean firstScroll, boolean dragging) {\n        if (dragging) {\n            int headerBannerHeight = headerBanner.getHeight();\n            float currentHeaderTranslationY = ViewCompat.getTranslationY(mHeaderContainer);\n            if (firstScroll) {\n                if (-headerBannerHeight < currentHeaderTranslationY) {\n                    mBaseTranslationY = scrollY;\n                }\n            }\n            final float headerTranslationY = ScrollUtils.getFloat(mBaseTranslationY - scrollY, -headerBannerHeight, 0);\n            ViewCompat.animate(mHeaderContainer).cancel();\n            ViewCompat.setTranslationY(mHeaderContainer, headerTranslationY);\n            //todo: need some more works on this\n            setpagertoppadding(totalfullheight - headerTranslationY);\n        }\n    }\n\n    @Override\n    public void onDownMotionEvent() {\n    }\n\n    @Override\n    public void onUpOrCancelMotionEvent(final ObservableScrollState scrollState) {\n        if (!mScrolled) {\n            // This event can be used only when TouchInterceptionFrameLayout\n            // doesn't handle the consecutive events.\n            // toolbarAdjustment(scrollState);\n            mBaseTranslationY = 0;\n\n            final Fragment fragment = getCurrentFragment();\n            if (fragment == null) {\n                return;\n            }\n            View view = fragment.getView();\n            if (view == null) {\n                return;\n            }\n            //    toolbarAdjustment(mLastScrollState, view);\n        }\n    }\n\n    private TouchInterceptionLayout.TouchInterceptionListener mInterceptionListener = new TouchInterceptionLayout.TouchInterceptionListener() {\n        @Override\n        public boolean shouldInterceptTouchEvent(MotionEvent ev, boolean moving, float diffX, float diffY) {\n            if (!mScrolled && mSlop < Math.abs(diffX) && Math.abs(diffY) < Math.abs(diffX)) {\n                // Horizontal scroll is maybe handled by ViewPager\n                return false;\n            }\n\n            Scrollable scrollable = getCurrentScrollable();\n            if (scrollable == null) {\n                mScrolled = false;\n                return false;\n            }\n\n            // If interceptionLayout can move, it should intercept.\n            // And once it begins to move, horizontal scroll shouldn't work any longer.\n            // View toolbarView = getActivity().findViewById(R.id.toolbar);\n            int headerBannerHeight = headerBanner.getHeight();\n            int translationY = (int) ViewCompat.getTranslationY(mInterceptionLayout);\n            boolean scrollingUp = 0 < diffY;\n            boolean scrollingDown = diffY < 0;\n            if (scrollingUp) {\n                if (translationY < 0) {\n                    mScrolled = true;\n                    mLastScrollState = ObservableScrollState.UP;\n                    return true;\n                }\n            } else if (scrollingDown) {\n                if (-headerBannerHeight < translationY) {\n                    mScrolled = true;\n                    mLastScrollState = ObservableScrollState.DOWN;\n                    return true;\n                }\n            }\n            mScrolled = false;\n            return false;\n        }\n\n        @Override\n        public void onDownMotionEvent(MotionEvent ev) {\n        }\n\n        @Override\n        public void onMoveMotionEvent(MotionEvent ev, float diffX, float diffY) {\n         /*   View tView = adjustmentToolBarView();\n            float translationY = ScrollUtils.getFloat(ViewCompat.getTranslationY(mInterceptionLayout) + diffY, -tView.getHeight(), 0);\n            ViewCompat.setTranslationY(mInterceptionLayout, translationY);\n            ViewCompat.setTranslationY(tView, translationY);\n            if (translationY < 0) {\n                FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mInterceptionLayout.getLayoutParams();\n                lp.height = (int) (-translationY + getScreenHeight());\n                mInterceptionLayout.requestLayout();\n            }*/\n            float translationY = ScrollUtils.getFloat(ViewCompat.getTranslationY(mInterceptionLayout) + diffY, -headerBanner.getHeight(), 0);\n            ViewCompat.setTranslationY(mInterceptionLayout, translationY);\n            if (translationY < 0) {\n                // start getting smaller\n                FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mInterceptionLayout.getLayoutParams();\n                lp.height = (int) (-translationY + getScreenHeight());\n                mInterceptionLayout.requestLayout();\n            }\n        }\n\n        @Override\n        public void onUpOrCancelMotionEvent(MotionEvent ev) {\n            mScrolled = false;\n            //  toolbarAdjustment(mLastScrollState);\n        }\n    };\n\n    private Scrollable getCurrentScrollable() {\n        Fragment fragment = getCurrentFragment();\n        if (fragment == null) {\n            return null;\n        }\n        View view = fragment.getView();\n        if (view == null) {\n            return null;\n        }\n        return viewscrollable(view);\n    }\n\n    private Scrollable viewscrollable(View fromFragmentView) {\n        return (Scrollable) fromFragmentView.findViewById(R.id.scroll);\n\n    }\n\n    private View adjustmentToolBarView() {\n        return getActivity().findViewById(R.id.toolbar);\n        //  return getCurrentFragment().getView().findViewById(R.id.header);\n    }\n\n    private void toolbarAdjustment(ObservableScrollState scrollState) {\n        View tView = adjustmentToolBarView();\n        int toolbarHeight = tView.getHeight();\n        final Scrollable scrollable = getCurrentScrollable();\n        if (scrollable == null) {\n            return;\n        }\n        int scrollY = scrollable.getCurrentScrollY();\n        if (scrollState == ObservableScrollState.DOWN) {\n            showToolbar();\n        } else if (scrollState == ObservableScrollState.UP) {\n            if (toolbarHeight <= scrollY) {\n                hideToolbar();\n            } else {\n                showToolbar();\n            }\n        } else if (!toolbarIsShown() && !toolbarIsHidden()) {\n            // Toolbar is moving but doesn't know which to move:\n            // you can change this to hideToolbar()\n            showToolbar();\n        }\n    }\n\n\n    private void toolbarAdjustment(ObservableScrollState scrollState, View view) {\n        int toolbarHeight = headerBanner.getHeight();\n        final Scrollable scrollView = viewscrollable(view);\n        if (scrollView == null) {\n            return;\n        }\n        int scrollY = scrollView.getCurrentScrollY();\n        if (scrollState == ObservableScrollState.DOWN) {\n            showToolbar();\n        } else if (scrollState == ObservableScrollState.UP) {\n            if (toolbarHeight <= scrollY) {\n                hideToolbar();\n            } else {\n                showToolbar();\n            }\n        } else {\n            // Even if onScrollChanged occurs without scrollY changing, toolbar should be adjusted\n            if (toolbarIsShown() || toolbarIsHidden()) {\n                // Toolbar is completely moved, so just keep its state\n                // and propagate it to other pages\n                propagateToolbarState(toolbarIsShown());\n            } else {\n                // Toolbar is moving but doesn't know which to move:\n                // you can change this to hideToolbar()\n                showToolbar();\n            }\n        }\n    }\n\n    private void propagateToolbarState(boolean isShown) {\n        final int toolbarHeight = headerBanner.getHeight();\n        // Set scrollY for the fragments that are not created yet\n        mPagerAdapter.setScrollY(isShown ? 0 : toolbarHeight);\n\n        // Set scrollY for the active fragments\n        for (int i = 0; i < mPagerAdapter.getCount(); i++) {\n            // Skip current item\n            if (i == mPager.getCurrentItem()) {\n                continue;\n            }\n            // Skip destroyed or not created item\n            Fragment f = mPagerAdapter.getItemAt(i);\n            if (f == null) {\n                continue;\n            }\n            View view = f.getView();\n            if (view == null) {\n                continue;\n            }\n\n            if (view.findViewById(R.id.scroll) instanceof UltimateRecyclerView) {\n                UltimateRecyclerView listView = (UltimateRecyclerView) viewscrollable(view);\n                if (isShown) {\n                    // Scroll up\n                    if (0 < listView.getCurrentScrollY()) {\n                        // listView.setSelection(0);\n                        Log.d(FRAGMENT_TAG, \"up\");\n                    }\n                } else {\n                    // Scroll down (to hide padding)\n                    if (listView.getCurrentScrollY() < toolbarHeight) {\n                        //listView.setSelection(1);\n                        Log.d(FRAGMENT_TAG, \"down\");\n                    }\n                }\n            }\n\n        }\n    }\n\n    private Fragment getCurrentFragment() {\n        return mPagerAdapter.getItemAt(mPager.getCurrentItem());\n    }\n\n    private boolean toolbarIsShown() {\n        return ViewCompat.getTranslationY(mInterceptionLayout) == 0;\n    }\n\n    private boolean toolbarIsHidden() {\n        View view = getView();\n        if (view == null) {\n            return false;\n        }\n        View tView = adjustmentToolBarView();\n        return ViewCompat.getTranslationY(mInterceptionLayout) == -tView.getHeight();\n    }\n\n    private void showToolbar() {\n        animateToolbar(0);\n    }\n\n    private void hideToolbar() {\n        View tView = adjustmentToolBarView();\n        animateToolbar(-tView.getHeight());\n    }\n\n    private void animateToolbar(final float toY) {\n        float layoutTranslationY = ViewCompat.getTranslationY(mInterceptionLayout);\n        if (layoutTranslationY != toY) {\n            ValueAnimator animator = ValueAnimator.ofFloat(ViewCompat.getTranslationY(mInterceptionLayout), toY).setDuration(200);\n            animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    float translationY = (float) animation.getAnimatedValue();\n                    View tView = adjustmentToolBarView();\n                    ViewCompat.setTranslationY(mInterceptionLayout, translationY);\n                    ViewCompat.setTranslationY(tView, translationY);\n                    if (translationY < 0) {\n                        FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mInterceptionLayout.getLayoutParams();\n                        lp.height = (int) (-translationY + getScreenHeight());\n                        mInterceptionLayout.requestLayout();\n                    }\n                }\n            });\n            animator.start();\n        }\n    }\n\n    /**\n     * This adapter provides two types of fragments as an example.\n     * {@linkplain #createItem(int)} should be modified if you use this example for your app.\n     */\n    private static class NavigationAdapter extends CacheFragmentStatePagerAdapter {\n\n        private static final String[] TITLES = new String[]{\"Applepie\", \"Butter Cookie\", \"Cupcake\", \"Donut\", \"Eclair\", \"Froyo\", \"Gingerbread\", \"Honeycomb\", \"Ice Cream Sandwich\", \"Jelly Bean\", \"KitKat\", \"Lollipop\"};\n        //  private static final String[] TITLES = new String[]{\"fff\", \"nd eee\"};\n\n        public NavigationAdapter(FragmentManager fm) {\n            super(fm);\n        }\n\n        private int mScrollY;\n\n        public void setScrollY(int scrollY) {\n            mScrollY = scrollY;\n        }\n\n        @Override\n        protected Fragment createItem(int position) {\n\n            Fragment f = new ViewPagerFragmentListSingle();\n            if (0 < mScrollY) {\n                Bundle args = new Bundle();\n                // args.putInt(ViewPagerTab2RecyclerViewFragment.ARG_INITIAL_POSITION, 1);\n                f.setArguments(args);\n            }\n\n            return f;\n            /*\n            Fragment f;\n            final int pattern = position % 5;\n            switch (pattern) {\n                case 0:\n                    f = new ViewPagerTab2RecyclerViewFragment();\n                    break;\n                case 1:\n                    f = new ViewPagerTab2RecyclerViewFragment();\n                    break;\n                case 2:\n                    f = new ViewPagerTab2RecyclerViewFragment();\n                    break;\n                case 3:\n                    f = new ViewPagerTab2RecyclerViewFragment();\n                    break;\n                case 4:\n                default:\n                    f = new ViewPagerTab2RecyclerViewFragment();\n                    break;\n            }\n            return f;*/\n        }\n\n        @Override\n        public int getCount() {\n            return TITLES.length;\n        }\n\n        @Override\n        public CharSequence getPageTitle(int position) {\n            return TITLES[position];\n        }\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/scrollableobservable/widget/SlidingTabLayout.java",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.marshalchen.ultimaterecyclerview.demo.scrollableobservable.widget;\n\nimport android.annotation.TargetApi;\nimport android.content.Context;\nimport android.graphics.Typeface;\nimport android.os.Build;\n\nimport androidx.fragment.app.Fragment;\nimport androidx.viewpager.widget.PagerAdapter;\nimport androidx.viewpager.widget.ViewPager;\nimport android.util.AttributeSet;\nimport android.util.SparseArray;\nimport android.util.TypedValue;\nimport android.view.Gravity;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.HorizontalScrollView;\nimport android.widget.LinearLayout;\nimport android.widget.TextView;\n\n/**\n * To be used with ViewPager to provide a tab indicator component which give constant feedback as to\n * the user's scroll progress.\n * <p>\n * To use the component, simply add it to your view hierarchy. Then in your\n * {@link android.app.Activity} or {@link Fragment} call\n * {@link #setViewPager(ViewPager)} providing it the ViewPager this layout is being used for.\n * <p>\n * The colors can be customized in two ways. The first and simplest is to provide an array of colors\n * via {@link #setSelectedIndicatorColors(int...)}. The\n * alternative is via the {@link com.google.samples.apps.iosched.ui.widget.SlidingTabLayout.TabColorizer} interface which provides you complete control over\n * which color is used for any individual position.\n * <p>\n * The views used as tabs can be customized by calling {@link #setCustomTabView(int, int)},\n * providing the layout ID of your custom layout.\n */\npublic class SlidingTabLayout extends HorizontalScrollView {\n    /**\n     * Allows complete control over the colors drawn in the tab layout. Set with\n     * {@link #setCustomTabColorizer(com.google.samples.apps.iosched.ui.widget.SlidingTabLayout.TabColorizer)}.\n     */\n    public interface TabColorizer {\n\n        /**\n         * @return return the color of the indicator used when {@code position} is selected.\n         */\n        int getIndicatorColor(int position);\n\n    }\n\n    private static final int TITLE_OFFSET_DIPS = 24;\n    private static final int TAB_VIEW_PADDING_DIPS = 16;\n    private static final int TAB_VIEW_TEXT_SIZE_SP = 12;\n\n    private int mTitleOffset;\n\n    private int mTabViewLayoutId;\n    private int mTabViewTextViewId;\n    private boolean mDistributeEvenly;\n\n    private ViewPager mViewPager;\n    private SparseArray<String> mContentDescriptions = new SparseArray<String>();\n    private ViewPager.OnPageChangeListener mViewPagerPageChangeListener;\n\n    private final SlidingTabStrip mTabStrip;\n\n    public SlidingTabLayout(Context context) {\n        this(context, null);\n    }\n\n    public SlidingTabLayout(Context context, AttributeSet attrs) {\n        this(context, attrs, 0);\n    }\n\n    public SlidingTabLayout(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n\n        // Disable the Scroll Bar\n        setHorizontalScrollBarEnabled(false);\n        // Make sure that the Tab Strips fills this View\n        setFillViewport(true);\n\n        mTitleOffset = (int) (TITLE_OFFSET_DIPS * getResources().getDisplayMetrics().density);\n\n        mTabStrip = new SlidingTabStrip(context);\n        addView(mTabStrip, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);\n    }\n\n    /**\n     * Set the custom {@link com.google.samples.apps.iosched.ui.widget.SlidingTabLayout.TabColorizer} to be used.\n     *\n     * If you only require simple custmisation then you can use\n     * {@link #setSelectedIndicatorColors(int...)} to achieve\n     * similar effects.\n     */\n    public void setCustomTabColorizer(TabColorizer tabColorizer) {\n        mTabStrip.setCustomTabColorizer(tabColorizer);\n    }\n\n    public void setDistributeEvenly(boolean distributeEvenly) {\n        mDistributeEvenly = distributeEvenly;\n    }\n\n    /**\n     * Sets the colors to be used for indicating the selected tab. These colors are treated as a\n     * circular array. Providing one color will mean that all tabs are indicated with the same color.\n     */\n    public void setSelectedIndicatorColors(int... colors) {\n        mTabStrip.setSelectedIndicatorColors(colors);\n    }\n\n    /**\n     * Set the {@link ViewPager.OnPageChangeListener}. When using {@link com.google.samples.apps.iosched.ui.widget.SlidingTabLayout} you are\n     * required to set any {@link ViewPager.OnPageChangeListener} through this method. This is so\n     * that the layout can update it's scroll position correctly.\n     *\n     * @see ViewPager#setOnPageChangeListener(ViewPager.OnPageChangeListener)\n     */\n    public void setOnPageChangeListener(ViewPager.OnPageChangeListener listener) {\n        mViewPagerPageChangeListener = listener;\n    }\n\n    /**\n     * Set the custom layout to be inflated for the tab views.\n     *\n     * @param layoutResId Layout id to be inflated\n     * @param textViewId id of the {@link TextView} in the inflated view\n     */\n    public void setCustomTabView(int layoutResId, int textViewId) {\n        mTabViewLayoutId = layoutResId;\n        mTabViewTextViewId = textViewId;\n    }\n\n    /**\n     * Sets the associated view pager. Note that the assumption here is that the pager content\n     * (number of tabs and tab titles) does not change after this call has been made.\n     */\n    public void setViewPager(ViewPager viewPager) {\n        mTabStrip.removeAllViews();\n\n        mViewPager = viewPager;\n        if (viewPager != null) {\n            viewPager.setOnPageChangeListener(new InternalViewPagerListener());\n            populateTabStrip();\n        }\n    }\n\n    /**\n     * Create a default view to be used for tabs. This is called if a custom tab view is not set via\n     * {@link #setCustomTabView(int, int)}.\n     */\n    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)\n    protected TextView createDefaultTabView(Context context) {\n        TextView textView = new TextView(context);\n        textView.setGravity(Gravity.CENTER);\n        textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, TAB_VIEW_TEXT_SIZE_SP);\n        textView.setTypeface(Typeface.DEFAULT_BOLD);\n        textView.setLayoutParams(new LinearLayout.LayoutParams(\n                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));\n\n        TypedValue outValue = new TypedValue();\n        getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground,\n                outValue, true);\n        textView.setBackgroundResource(outValue.resourceId);\n        textView.setAllCaps(true);\n\n        int padding = (int) (TAB_VIEW_PADDING_DIPS * getResources().getDisplayMetrics().density);\n        textView.setPadding(padding, padding, padding, padding);\n\n        return textView;\n    }\n\n    private void populateTabStrip() {\n        final PagerAdapter adapter = mViewPager.getAdapter();\n        final OnClickListener tabClickListener = new TabClickListener();\n\n        for (int i = 0; i < adapter.getCount(); i++) {\n            View tabView = null;\n            TextView tabTitleView = null;\n\n            if (mTabViewLayoutId != 0) {\n                // If there is a custom tab view layout id set, try and inflate it\n                tabView = LayoutInflater.from(getContext()).inflate(mTabViewLayoutId, mTabStrip,\n                        false);\n                tabTitleView = (TextView) tabView.findViewById(mTabViewTextViewId);\n            }\n\n            if (tabView == null) {\n                tabView = createDefaultTabView(getContext());\n            }\n\n            if (tabTitleView == null && TextView.class.isInstance(tabView)) {\n                tabTitleView = (TextView) tabView;\n            }\n\n            if (mDistributeEvenly) {\n                LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) tabView.getLayoutParams();\n                lp.width = 0;\n                lp.weight = 1;\n            }\n\n            tabTitleView.setText(adapter.getPageTitle(i));\n            tabView.setOnClickListener(tabClickListener);\n            String desc = mContentDescriptions.get(i, null);\n            if (desc != null) {\n                tabView.setContentDescription(desc);\n            }\n\n            mTabStrip.addView(tabView);\n            if (i == mViewPager.getCurrentItem()) {\n                tabView.setSelected(true);\n            }\n        }\n    }\n\n    public void setContentDescription(int i, String desc) {\n        mContentDescriptions.put(i, desc);\n    }\n\n    @Override\n    protected void onAttachedToWindow() {\n        super.onAttachedToWindow();\n\n        if (mViewPager != null) {\n            scrollToTab(mViewPager.getCurrentItem(), 0);\n        }\n    }\n\n    private void scrollToTab(int tabIndex, int positionOffset) {\n        final int tabStripChildCount = mTabStrip.getChildCount();\n        if (tabStripChildCount == 0 || tabIndex < 0 || tabIndex >= tabStripChildCount) {\n            return;\n        }\n\n        View selectedChild = mTabStrip.getChildAt(tabIndex);\n        if (selectedChild != null) {\n            int targetScrollX = selectedChild.getLeft() + positionOffset;\n\n            if (tabIndex > 0 || positionOffset > 0) {\n                // If we're not at the first child and are mid-scroll, make sure we obey the offset\n                targetScrollX -= mTitleOffset;\n            }\n\n            scrollTo(targetScrollX, 0);\n        }\n    }\n\n    private class InternalViewPagerListener implements ViewPager.OnPageChangeListener {\n        private int mScrollState;\n\n        @Override\n        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {\n            int tabStripChildCount = mTabStrip.getChildCount();\n            if ((tabStripChildCount == 0) || (position < 0) || (position >= tabStripChildCount)) {\n                return;\n            }\n\n            mTabStrip.onViewPagerPageChanged(position, positionOffset);\n\n            View selectedTitle = mTabStrip.getChildAt(position);\n            int extraOffset = (selectedTitle != null)\n                    ? (int) (positionOffset * selectedTitle.getWidth())\n                    : 0;\n            scrollToTab(position, extraOffset);\n\n            if (mViewPagerPageChangeListener != null) {\n                mViewPagerPageChangeListener.onPageScrolled(position, positionOffset,\n                        positionOffsetPixels);\n            }\n        }\n\n        @Override\n        public void onPageScrollStateChanged(int state) {\n            mScrollState = state;\n\n            if (mViewPagerPageChangeListener != null) {\n                mViewPagerPageChangeListener.onPageScrollStateChanged(state);\n            }\n        }\n\n        @Override\n        public void onPageSelected(int position) {\n            if (mScrollState == ViewPager.SCROLL_STATE_IDLE) {\n                mTabStrip.onViewPagerPageChanged(position, 0f);\n                scrollToTab(position, 0);\n            }\n            for (int i = 0; i < mTabStrip.getChildCount(); i++) {\n                mTabStrip.getChildAt(i).setSelected(position == i);\n            }\n            if (mViewPagerPageChangeListener != null) {\n                mViewPagerPageChangeListener.onPageSelected(position);\n            }\n        }\n\n    }\n\n    private class TabClickListener implements OnClickListener {\n        @Override\n        public void onClick(View v) {\n            for (int i = 0; i < mTabStrip.getChildCount(); i++) {\n                if (v == mTabStrip.getChildAt(i)) {\n                    mViewPager.setCurrentItem(i);\n                    return;\n                }\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/scrollableobservable/widget/SlidingTabStrip.java",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.marshalchen.ultimaterecyclerview.demo.scrollableobservable.widget;\n\nimport android.R;\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.Paint;\nimport android.util.AttributeSet;\nimport android.util.TypedValue;\nimport android.view.View;\nimport android.widget.LinearLayout;\n\nclass SlidingTabStrip extends LinearLayout {\n\n    private static final int DEFAULT_BOTTOM_BORDER_THICKNESS_DIPS = 0;\n    private static final byte DEFAULT_BOTTOM_BORDER_COLOR_ALPHA = 0x26;\n    private static final int SELECTED_INDICATOR_THICKNESS_DIPS = 3;\n    private static final int DEFAULT_SELECTED_INDICATOR_COLOR = 0xFF33B5E5;\n\n    private final int mBottomBorderThickness;\n    private final Paint mBottomBorderPaint;\n\n    private final int mSelectedIndicatorThickness;\n    private final Paint mSelectedIndicatorPaint;\n\n    private final int mDefaultBottomBorderColor;\n\n    private int mSelectedPosition;\n    private float mSelectionOffset;\n\n    private SlidingTabLayout.TabColorizer mCustomTabColorizer;\n    private final SimpleTabColorizer mDefaultTabColorizer;\n\n    SlidingTabStrip(Context context) {\n        this(context, null);\n    }\n\n    SlidingTabStrip(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        setWillNotDraw(false);\n\n        final float density = getResources().getDisplayMetrics().density;\n\n        TypedValue outValue = new TypedValue();\n        context.getTheme().resolveAttribute(R.attr.colorForeground, outValue, true);\n        final int themeForegroundColor =  outValue.data;\n\n        mDefaultBottomBorderColor = setColorAlpha(themeForegroundColor,\n                DEFAULT_BOTTOM_BORDER_COLOR_ALPHA);\n\n        mDefaultTabColorizer = new SimpleTabColorizer();\n        mDefaultTabColorizer.setIndicatorColors(DEFAULT_SELECTED_INDICATOR_COLOR);\n\n        mBottomBorderThickness = (int) (DEFAULT_BOTTOM_BORDER_THICKNESS_DIPS * density);\n        mBottomBorderPaint = new Paint();\n        mBottomBorderPaint.setColor(mDefaultBottomBorderColor);\n\n        mSelectedIndicatorThickness = (int) (SELECTED_INDICATOR_THICKNESS_DIPS * density);\n        mSelectedIndicatorPaint = new Paint();\n    }\n\n    void setCustomTabColorizer(SlidingTabLayout.TabColorizer customTabColorizer) {\n        mCustomTabColorizer = customTabColorizer;\n        invalidate();\n    }\n\n    void setSelectedIndicatorColors(int... colors) {\n        // Make sure that the custom colorizer is removed\n        mCustomTabColorizer = null;\n        mDefaultTabColorizer.setIndicatorColors(colors);\n        invalidate();\n    }\n\n    void onViewPagerPageChanged(int position, float positionOffset) {\n        mSelectedPosition = position;\n        mSelectionOffset = positionOffset;\n        invalidate();\n    }\n\n    @Override\n    protected void onDraw(Canvas canvas) {\n        final int height = getHeight();\n        final int childCount = getChildCount();\n        final SlidingTabLayout.TabColorizer tabColorizer = mCustomTabColorizer != null\n                ? mCustomTabColorizer\n                : mDefaultTabColorizer;\n\n        // Thick colored underline below the current selection\n        if (childCount > 0) {\n            View selectedTitle = getChildAt(mSelectedPosition);\n            int left = selectedTitle.getLeft();\n            int right = selectedTitle.getRight();\n            int color = tabColorizer.getIndicatorColor(mSelectedPosition);\n\n            if (mSelectionOffset > 0f && mSelectedPosition < (getChildCount() - 1)) {\n                int nextColor = tabColorizer.getIndicatorColor(mSelectedPosition + 1);\n                if (color != nextColor) {\n                    color = blendColors(nextColor, color, mSelectionOffset);\n                }\n\n                // Draw the selection partway between the tabs\n                View nextTitle = getChildAt(mSelectedPosition + 1);\n                left = (int) (mSelectionOffset * nextTitle.getLeft() +\n                        (1.0f - mSelectionOffset) * left);\n                right = (int) (mSelectionOffset * nextTitle.getRight() +\n                        (1.0f - mSelectionOffset) * right);\n            }\n\n            mSelectedIndicatorPaint.setColor(color);\n\n            canvas.drawRect(left, height - mSelectedIndicatorThickness, right,\n                    height, mSelectedIndicatorPaint);\n        }\n\n        // Thin underline along the entire bottom edge\n        canvas.drawRect(0, height - mBottomBorderThickness, getWidth(), height, mBottomBorderPaint);\n    }\n\n    /**\n     * Set the alpha value of the {@code color} to be the given {@code alpha} value.\n     */\n    private static int setColorAlpha(int color, byte alpha) {\n        return Color.argb(alpha, Color.red(color), Color.green(color), Color.blue(color));\n    }\n\n    /**\n     * Blend {@code color1} and {@code color2} using the given ratio.\n     *\n     * @param ratio of which to blend. 1.0 will return {@code color1}, 0.5 will give an even blend,\n     *              0.0 will return {@code color2}.\n     */\n    private static int blendColors(int color1, int color2, float ratio) {\n        final float inverseRation = 1f - ratio;\n        float r = (Color.red(color1) * ratio) + (Color.red(color2) * inverseRation);\n        float g = (Color.green(color1) * ratio) + (Color.green(color2) * inverseRation);\n        float b = (Color.blue(color1) * ratio) + (Color.blue(color2) * inverseRation);\n        return Color.rgb((int) r, (int) g, (int) b);\n    }\n\n    private static class SimpleTabColorizer implements SlidingTabLayout.TabColorizer {\n        private int[] mIndicatorColors;\n\n        @Override\n        public final int getIndicatorColor(int position) {\n            return mIndicatorColors[position % mIndicatorColors.length];\n        }\n\n        void setIndicatorColors(int... colors) {\n            mIndicatorColors = colors;\n        }\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/java/com/marshalchen/ultimaterecyclerview/demo/swiplistdemo/PackageAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.demo.swiplistdemo;\n\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.pm.PackageManager;\nimport android.content.pm.ResolveInfo;\nimport android.net.Uri;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.Button;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.marshalchen.ultimaterecyclerview.URLogs;\nimport com.marshalchen.ultimaterecyclerview.demo.R;\n\nimport java.util.List;\n\npublic class PackageAdapter extends RecyclerView.Adapter<PackageAdapter.ViewHolder> {\n\n    private List<String> data;\n    private Context context;\n\n    public PackageAdapter(Context context, List<String> data) {\n        this.context = context;\n        this.data = data;\n    }\n\n\n    public String getItem(int position) {\n        return data.get(position);\n    }\n\n    @Override\n    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {\n\n        View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.package_row, viewGroup, false);\n        ViewHolder vh = new ViewHolder(itemView);\n        return vh;\n\n    }\n\n    @Override\n    public void onBindViewHolder(ViewHolder viewHolder, int i) {\n\n        final String item = getItem(i);\n        URLogs.d(\"\" + viewHolder.ivImage);\n        viewHolder.tvTitle.setText(data.get(i));\n\n\n//\n    }\n\n    @Override\n    public long getItemId(int position) {\n        return position;\n    }\n\n    @Override\n    public int getItemCount() {\n        return data.size();\n    }\n\n\n//    @Override\n//    public View getView(final int position, View convertView, ViewGroup parent) {\n//        final PackageItem item = getItem(position);\n//        ViewHolder holder;\n//        if (convertView == null) {\n//            LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n//            convertView = li.inflate(R.layout.package_row, parent, false);\n//            holder = new ViewHolder();\n//            holder.ivImage = (ImageView) convertView.findViewById(R.id.example_row_iv_image);\n//            holder.tvTitle = (TextView) convertView.findViewById(R.id.example_row_tv_title);\n//            holder.tvDescription = (TextView) convertView.findViewById(R.id.example_row_tv_description);\n//            holder.bAction1 = (Button) convertView.findViewById(R.id.example_row_b_action_1);\n//            holder.bAction2 = (Button) convertView.findViewById(R.id.example_row_b_action_2);\n//            holder.bAction3 = (Button) convertView.findViewById(R.id.example_row_b_action_3);\n//            convertView.setTag(holder);\n//        } else {\n//            holder = (ViewHolder) convertView.getTag();\n//        }\n//\n//        ((SwipeListView)parent).recycle(convertView, position);\n//\n//        holder.ivImage.setImageDrawable(item.getIcon());\n//        holder.tvTitle.setText(item.getName());\n//        holder.tvDescription.setText(item.getPackageName());\n//\n//\n//        holder.bAction1.setOnClickListener(new View.OnClickListener() {\n//            @Override\n//            public void onClick(View v) {\n//                Intent intent = context.getPackageManager().getLaunchIntentForPackage(item.getPackageName());\n//                if (intent != null) {\n//                    context.startActivity(intent);\n//                } else {\n//                    Toast.makeText(context, R.string.cantOpen, Toast.LENGTH_SHORT).show();\n//                }\n//            }\n//        });\n//\n//        holder.bAction2.setOnClickListener(new View.OnClickListener() {\n//            @Override\n//            public void onClick(View v) {\n//                if (isPlayStoreInstalled()) {\n//                    context.startActivity(new Intent(Intent.ACTION_VIEW,\n//                            Uri.parse(\"market://details?id=\" + item.getPackageName())));\n//                } else {\n//                    context.startActivity(new Intent(Intent.ACTION_VIEW,\n//                            Uri.parse(\"http://play.google.com/store/apps/details?id=\" + item.getPackageName())));\n//                }\n//            }\n//        });\n//\n//        holder.bAction3.setOnClickListener(new View.OnClickListener() {\n//            @Override\n//            public void onClick(View v) {\n//                Uri packageUri = Uri.parse(\"package:\" + item.getPackageName());\n//                Intent uninstallIntent;\n//                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {\n//                    uninstallIntent = new Intent(Intent.ACTION_DELETE, packageUri);\n//                } else {\n//                    uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageUri);\n//                }\n//                context.startActivity(uninstallIntent);\n//            }\n//        });\n//\n//\n//        return convertView;\n//    }\n\n    public static class ViewHolder extends RecyclerView.ViewHolder {\n        ImageView ivImage;\n        TextView tvTitle;\n        Button bAction1;\n        Button bAction2;\n\n\n        public ViewHolder(View itemView) {\n\n            super(itemView);\n            ivImage = (ImageView) itemView.findViewById(R.id.example_row_iv_image);\n            tvTitle = (TextView) itemView.findViewById(R.id.example_row_tv_title);\n            bAction1 = (Button) itemView.findViewById(R.id.example_row_b_action_1);\n            bAction2 = (Button) itemView.findViewById(R.id.example_row_b_action_2);\n\n\n        }\n    }\n\n    private boolean isPlayStoreInstalled() {\n        Intent market = new Intent(Intent.ACTION_VIEW, Uri.parse(\"market://search?q=dummy\"));\n        PackageManager manager = context.getPackageManager();\n        List<ResolveInfo> list = manager.queryIntentActivities(market, 0);\n\n        return list.size() > 0;\n    }\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/drawable/ic_add_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"/>\n</vector>\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/drawable/ic_autorenew_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,6v3l4,-4 -4,-4v3c-4.42,0 -8,3.58 -8,8 0,1.57 0.46,3.03 1.24,4.26L6.7,14.8c-0.45,-0.83 -0.7,-1.79 -0.7,-2.8 0,-3.31 2.69,-6 6,-6zm6.76,1.74L17.3,9.2c0.44,0.84 0.7,1.79 0.7,2.8 0,3.31 -2.69,6 -6,6v-3l-4,4 4,4v-3c4.42,0 8,-3.58 8,-8 0,-1.57 -0.46,-3.03 -1.24,-4.26z\"/>\n</vector>\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/drawable/ic_blur_linear_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M5,17.5c0.83,0 1.5,-0.67 1.5,-1.5s-0.67,-1.5 -1.5,-1.5 -1.5,0.67 -1.5,1.5 0.67,1.5 1.5,1.5zM9,13c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1 -1,0.45 -1,1 0.45,1 1,1zm0,-4c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1 -1,0.45 -1,1 0.45,1 1,1zM3,21h18v-2H3v2zM5,9.5c0.83,0 1.5,-0.67 1.5,-1.5S5.83,6.5 5,6.5 3.5,7.17 3.5,8 4.17,9.5 5,9.5zm0,4c0.83,0 1.5,-0.67 1.5,-1.5s-0.67,-1.5 -1.5,-1.5 -1.5,0.67 -1.5,1.5 0.67,1.5 1.5,1.5zM9,17c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1 -1,0.45 -1,1 0.45,1 1,1zm8,-0.5c0.28,0 0.5,-0.22 0.5,-0.5s-0.22,-0.5 -0.5,-0.5 -0.5,0.22 -0.5,0.5 0.22,0.5 0.5,0.5zM3,3v2h18V3H3zm14,5.5c0.28,0 0.5,-0.22 0.5,-0.5s-0.22,-0.5 -0.5,-0.5 -0.5,0.22 -0.5,0.5 0.22,0.5 0.5,0.5zm0,4c0.28,0 0.5,-0.22 0.5,-0.5s-0.22,-0.5 -0.5,-0.5 -0.5,0.22 -0.5,0.5 0.22,0.5 0.5,0.5zM13,9c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1 -1,0.45 -1,1 0.45,1 1,1zm0,4c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1 -1,0.45 -1,1 0.45,1 1,1zm0,4c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1 -1,0.45 -1,1 0.45,1 1,1z\"/>\n</vector>\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/drawable/ic_bug_report_24dp.xml",
    "content": "<vector android:height=\"60dp\" android:viewportHeight=\"24.0\"\n    android:viewportWidth=\"24.0\" android:width=\"60dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M20,8h-2.81c-0.45,-0.78 -1.07,-1.45 -1.82,-1.96L17,4.41 15.59,3l-2.17,2.17C12.96,5.06 12.49,5 12,5c-0.49,0 -0.96,0.06 -1.41,0.17L8.41,3 7,4.41l1.62,1.63C7.88,6.55 7.26,7.22 6.81,8H4v2h2.09c-0.05,0.33 -0.09,0.66 -0.09,1v1H4v2h2v1c0,0.34 0.04,0.67 0.09,1H4v2h2.81c1.04,1.79 2.97,3 5.19,3s4.15,-1.21 5.19,-3H20v-2h-2.09c0.05,-0.33 0.09,-0.66 0.09,-1v-1h2v-2h-2v-1c0,-0.34 -0.04,-0.67 -0.09,-1H20V8zm-6,8h-4v-2h4v2zm0,-4h-4v-2h4v2z\"/>\n</vector>\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/drawable/ic_exposure_plus_1_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M10,7H8v4H4v2h4v4h2v-4h4v-2h-4V7zm10,11h-2V7.38L15,8.4V6.7L19.7,5h0.3v13z\"/>\n</vector>\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/drawable/ic_extension_24dp.xml",
    "content": "<vector android:height=\"100dp\" android:viewportHeight=\"24.0\"\n    android:viewportWidth=\"24.0\" android:width=\"100dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M20.5,11H19V7c0,-1.1 -0.9,-2 -2,-2h-4V3.5C13,2.12 11.88,1 10.5,1S8,2.12 8,3.5V5H4c-1.1,0 -1.99,0.9 -1.99,2v3.8H3.5c1.49,0 2.7,1.21 2.7,2.7s-1.21,2.7 -2.7,2.7H2V20c0,1.1 0.9,2 2,2h3.8v-1.5c0,-1.49 1.21,-2.7 2.7,-2.7 1.49,0 2.7,1.21 2.7,2.7V22H17c1.1,0 2,-0.9 2,-2v-4h1.5c1.38,0 2.5,-1.12 2.5,-2.5S21.88,11 20.5,11z\"/>\n</vector>\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/drawable/ic_remove_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19,13H5v-2h14v2z\"/>\n</vector>\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/drawable/toptint.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <gradient\n        android:angle=\"270\"\n        android:endColor=\"#22002aff\"\n        android:startColor=\"#e70a137e\" />\n    <!--<stroke\n        android:width=\"10dp\"\n        android:color=\"@color/bg_item_dragging_state\" />\n    <corners android:radius=\"3dp\" />-->\n    <padding\n        android:bottom=\"10dp\"\n        android:left=\"10dp\"\n        android:right=\"10dp\"\n        android:top=\"10dp\" />\n</shape>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/drawable-mdpi/custom_drag_frame.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n    <solid android:color=\"@android:color/transparent\" />\n    <stroke\n        android:width=\"1dp\"\n        android:color=\"#ff0000\" />\n</shape>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/drawable-xxhdpi/item_selector.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:drawable=\"@color/primaryDark\" android:state_pressed=\"true\"/>\n    <item android:drawable=\"@color/backgroundColorPress\" android:state_focused=\"true\"/>\n    <item android:drawable=\"@color/backgroundColor\"/>\n\n</selector>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/activity_drag.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    tools:context=\".MainActivity\">\n\n    <androidx.appcompat.widget.Toolbar\n        android:id=\"@+id/tool_bar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"#ff009688\">\n\n        <RelativeLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n            <Spinner\n                android:id=\"@+id/spinner\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\" />\n\n            <TextView\n                android:id=\"@+id/del\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_alignParentRight=\"true\"\n                android:layout_centerInParent=\"true\"\n                android:background=\"?attr/selectableItemBackground\"\n                android:padding=\"10dp\"\n                android:text=\"Del\" />\n\n            <TextView\n                android:id=\"@+id/add\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_centerInParent=\"true\"\n                android:layout_toLeftOf=\"@id/del\"\n                android:background=\"?attr/selectableItemBackground\"\n                android:padding=\"10dp\"\n                android:text=\"Add\" />\n        </RelativeLayout>\n\n    </androidx.appcompat.widget.Toolbar>\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/ultimate_recycler_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginTop=\"?attr/actionBarSize\"\n        app:recyclerviewClipToPadding=\"true\"\n        app:recyclerviewDefaultSwipeColor=\"@array/google_colors\"\n        app:recyclerviewFloatingActionView=\"@layout/floating_view\"\n        app:recyclerviewScrollbars=\"vertical\" />\n</FrameLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/activity_launcher.xml",
    "content": "<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    tools:context=\".LauncherActivity\">\n\n    <androidx.appcompat.widget.Toolbar\n        android:id=\"@+id/tool_bar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"#ff009688\">\n\n        <RelativeLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n            <Spinner\n                android:id=\"@+id/spinner\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\" />\n\n            <TextView\n                android:id=\"@+id/del\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_alignParentRight=\"true\"\n                android:layout_centerInParent=\"true\"\n                android:background=\"?attr/selectableItemBackground\"\n                android:padding=\"10dp\"\n                android:text=\"Del\" />\n\n            <TextView\n                android:id=\"@+id/add\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_centerInParent=\"true\"\n                android:layout_toLeftOf=\"@id/del\"\n                android:background=\"?attr/selectableItemBackground\"\n                android:padding=\"10dp\"\n                android:text=\"Add\" />\n        </RelativeLayout>\n\n    </androidx.appcompat.widget.Toolbar>\n\n    <com.marshalchen.ultimaterecyclerview.UltimateRecyclerView\n        android:id=\"@+id/ultimate_recycler_view\"\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"fill_parent\"\n        android:layout_marginTop=\"?attr/actionBarSize\"\n        app:recyclerviewClipToPadding=\"true\"\n        app:recyclerviewDefaultSwipeColor=\"@array/google_colors\"\n        app:recyclerviewFloatingActionView=\"@layout/floating_view\"\n        app:recyclerviewScrollbars=\"vertical\" />\n</FrameLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/activity_loadmore.xml",
    "content": "<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    tools:context=\".loadmoredemo.BasicFunctions\">\n\n    <androidx.appcompat.widget.Toolbar\n        android:id=\"@+id/tool_bar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"?attr/actionBarSize\"\n        android:background=\"#30f2e0\"\n        app:contentInsetEnd=\"0dp\"\n        app:contentInsetLeft=\"0dp\"\n        app:contentInsetRight=\"0dp\"\n        app:contentInsetStart=\"0dp\">\n\n        <include layout=\"@layout/toolbar_loadmore\" />\n\n    </androidx.appcompat.widget.Toolbar>\n\n    <com.marshalchen.ultimaterecyclerview.UltimateRecyclerView\n        android:id=\"@+id/ultimate_recycler_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginTop=\"?attr/actionBarSize\"\n        app:recyclerviewClipToPadding=\"true\"\n        app:recyclerviewDefaultSwipeColor=\"@array/google_colors\"\n        app:recyclerviewFloatingActionView=\"@layout/floating_view\"\n        app:recyclerviewScrollbars=\"vertical\" />\n</FrameLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/activity_main.xml",
    "content": "<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    tools:context=\".MainList\">\n\n <!--   <android.support.v7.widget.Toolbar\n        android:id=\"@+id/tool_bar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"?attr/actionBarSize\"\n        android:background=\"#853e99\"\n        app:contentInsetEnd=\"0dp\"\n        app:contentInsetLeft=\"0dp\"\n        app:contentInsetRight=\"0dp\"\n        app:contentInsetStart=\"0dp\">\n\n        <include layout=\"@layout/toolbar_loadmore\" />\n    </android.support.v7.widget.Toolbar>-->\n\n    <ListView\n        android:id=\"@android:id/list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n</FrameLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/countable_rv_adp.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/itemview\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <TextView\n        android:id=\"@+id/textview\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginLeft=\"2dp\"\n        android:layout_marginRight=\"2dp\"\n        android:text=\"test2\"\n        android:textSize=\"18sp\" />\n\n    <RelativeLayout\n        android:id=\"@+id/hkbox\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"120dp\"\n        android:layout_below=\"@id/textview\">\n\n\n        <TextView\n            android:id=\"@+id/numb_coun\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"match_parent\"\n            android:layout_marginLeft=\"2dp\"\n            android:gravity=\"center_vertical\"\n            android:text=\"99+\"\n            android:textSize=\"23sp\" />\n\n        <ImageView\n            android:id=\"@+id/imageview\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_marginRight=\"2dp\"\n            android:layout_toRightOf=\"@id/numb_coun\"\n            android:scaleType=\"centerCrop\"\n            android:src=\"@drawable/jr14\" />\n    </RelativeLayout>\n\n\n    <ProgressBar\n        android:id=\"@+id/progressbar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerHorizontal=\"true\"\n        android:visibility=\"gone\" />\n</RelativeLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/custom_bottom_progressbar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n    <ProgressBar\n        android:id=\"@+id/bottom_progress_bar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerHorizontal=\"true\" />\n\n    <TextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/bottom_progress_bar\"\n        android:layout_marginTop=\"2dp\"\n        android:gravity=\"center_horizontal\"\n        android:text=\"Loading\" />\n</RelativeLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/custom_refresh_activity.xml",
    "content": "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    tools:context=\".MainActivity\">\n\n    <androidx.appcompat.widget.Toolbar\n        android:id=\"@+id/tool_bar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"#ff009688\">\n\n        <RelativeLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n            <Spinner\n                android:id=\"@+id/spinner\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\" />\n\n            <TextView\n                android:id=\"@+id/del\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_alignParentRight=\"true\"\n                android:layout_centerInParent=\"true\"\n                android:background=\"?attr/selectableItemBackground\"\n                android:padding=\"10dp\"\n                android:text=\"Del\" />\n\n            <TextView\n                android:id=\"@+id/add\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_toLeftOf=\"@id/del\"\n                android:layout_centerInParent=\"true\"\n                android:background=\"?attr/selectableItemBackground\"\n                android:padding=\"10dp\"\n                android:text=\"Add\" />\n        </RelativeLayout>\n\n    </androidx.appcompat.widget.Toolbar>\n\n    <com.marshalchen.ultimaterecyclerview.CustomUltimateRecyclerview\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:id=\"@+id/custom_ultimate_recycler_view\"\n        app:recyclerviewClipToPadding=\"true\"\n        app:recyclerviewPadding=\"2dp\"\n        app:recyclerviewEmptyView=\"@layout/empty_view\"\n        app:recyclerviewFloatingActionView=\"@layout/floating_view\"\n        android:layout_marginTop=\"?attr/actionBarSize\"/>\n\n    <com.marshalchen.ultimaterecyclerview.ui.floatingactionbutton.AddFloatingActionButton\n        android:layout_width=\"wrap_content\"\n        android:id=\"@+id/custom_urv_add_floating_button\"\n        android:layout_alignParentRight=\"true\"\n        android:layout_alignParentBottom=\"true\"\n        xmlns:fab=\"http://schemas.android.com/apk/res-auto\"\n        fab:plusIconColor=\"#808080\"\n        fab:urv_fab_colorNormal=\"#aaffff\"\n        android:layout_height=\"wrap_content\"/>\n</RelativeLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/empty_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:text=\"No data here - This is the custom empty view\" />\n</RelativeLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/empty_view_v2.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <ImageView\n        android:id=\"@id/empty_view_loc\"\n        android:layout_width=\"60dp\"\n        android:layout_height=\"60dp\"\n        android:layout_centerInParent=\"true\"\n        android:src=\"@drawable/ic_bug_report_24dp\" />\n\n    <TextView\n        android:id=\"@id/exp_section_title\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/empty_view_loc\"\n        android:layout_centerInParent=\"true\"\n        android:text=\"This is the custom layout\" />\n</RelativeLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/exp_child.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@id/exp_section_ripple_wrapper_click\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"@dimen/sectionNormalHeight\"\n    android:layout_margin=\"0dp\"\n    android:padding=\"0dp\">\n\n    <RelativeLayout\n        android:id=\"@id/exp_section_adjustment_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_margin=\"0dp\"\n        android:clickable=\"false\"\n        android:focusable=\"false\"\n        android:foreground=\"?android:attr/selectableItemBackground\"\n        android:orientation=\"horizontal\"\n        android:padding=\"0dp\">\n\n        <TextView\n            android:id=\"@id/exp_section_title\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:lines=\"1\"\n            android:textAppearance=\"@style/TextAppearance.AppCompat.Body2\"\n            android:textColor=\"@android:color/black\"\n            android:textSize=\"@dimen/sectionSize\" />\n\n\n    </RelativeLayout>\n</RelativeLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/exp_parent.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@id/exp_section_ripple_wrapper_click\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"@dimen/sectionNormalHeight\"\n    android:layout_margin=\"0dp\"\n    android:background=\"@color/red\"\n    android:padding=\"0dp\">\n\n    <RelativeLayout\n        android:id=\"@id/exp_section_adjustment_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_margin=\"0dp\"\n        android:clickable=\"false\"\n        android:focusable=\"false\"\n        android:padding=\"0dp\">\n        <!-- android:foreground=\"?android:attr/selectableItemBackground\"\n        -->\n        <TextView\n            android:id=\"@id/exp_section_title\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"16dp\"\n            android:layout_marginRight=\"8dp\"\n            android:layout_toLeftOf=\"@id/exp_section_notification_number\"\n            android:layout_toStartOf=\"@id/exp_section_notification_number\"\n            android:gravity=\"left\"\n            android:lines=\"1\"\n            android:text=\"sample menu item parent\"\n            android:textAlignment=\"viewStart\"\n            android:textAppearance=\"@style/TextAppearance.AppCompat.Body2\"\n            android:textColor=\"@android:color/black\"\n            android:textSize=\"@dimen/sectionSize\" />\n\n        <TextView\n            android:id=\"@id/exp_section_notification_number\"\n\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginRight=\"8dp\"\n            android:layout_toLeftOf=\"@id/exp_indication_arrow\"\n            android:elegantTextHeight=\"false\"\n            android:gravity=\"center_horizontal\"\n            android:maxLength=\"5\"\n            android:singleLine=\"true\"\n            android:text=\"(99)\"\n            android:textAlignment=\"center\"\n            android:textColor=\"@android:color/black\"\n            android:textSize=\"@dimen/sectionNotificationSize\"\n            android:textStyle=\"bold\" />\n\n        <ImageView\n            android:id=\"@id/exp_indication_arrow\"\n            android:layout_width=\"@dimen/sectionSquareIconSize\"\n            android:layout_height=\"@dimen/sectionSquareIconSize\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginRight=\"@dimen/sectionRowMarginHorizontal\"\n            android:scaleType=\"fitCenter\"\n            android:src=\"@drawable/ic_item_swipe_right\" />\n    </RelativeLayout>\n\n</RelativeLayout>\n\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/floating_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n\n<com.marshalchen.ultimaterecyclerview.ui.floatingactionbutton.FloatingActionsMenu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:fab=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/customfloatingActionMenu\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    fab:addButtonColorNormal=\"#ffffff\"\n    fab:addButtonColorPressed=\"#f1f1f1\"\n    fab:addButtonPlusIconColor=\"#808080\"\n    fab:urv_fab_colorPressed=\"#f1f1f1\"\n    android:layout_alignParentRight=\"true\"\n    android:layout_alignParentBottom=\"true\"\n    android:layout_marginRight=\"15dp\"\n    android:layout_marginBottom=\"15dp\"\n    android:visibility=\"gone\">\n\n    <com.marshalchen.ultimaterecyclerview.ui.floatingactionbutton.AddFloatingActionButton\n\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"right|bottom\"\n        fab:plusIconColor=\"#808080\"\n        fab:urv_fab_colorNormal=\"#ffffff\" />\n\n    <com.marshalchen.ultimaterecyclerview.ui.floatingactionbutton.FloatingActionButton\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        fab:icon=\"@drawable/urv_floating_action_button_ic_fab_star\"\n        fab:urv_fab_colorNormal=\"#ff5f9a\"\n        fab:urv_fab_colorPressed=\"#ec407a\" />\n\n</com.marshalchen.ultimaterecyclerview.ui.floatingactionbutton.FloatingActionsMenu>\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/floatingbutton_grid_layout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.appcompat.widget.Toolbar\n        android:id=\"@+id/tool_bar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"?attr/actionBarSize\"\n        android:background=\"#bceeeeee\">\n\n        <RelativeLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n            <Spinner\n                android:id=\"@+id/spinner\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\" />\n\n            <LinearLayout\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"match_parent\"\n                android:layout_alignParentRight=\"true\"\n                android:orientation=\"horizontal\">\n\n                <ImageButton\n                    android:id=\"@+id/refresh\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:background=\"?attr/selectableItemBackground\"\n                    android:padding=\"13dp\"\n                    android:src=\"@drawable/ic_autorenew_24dp\" />\n\n                <ImageButton\n                    android:id=\"@+id/delall\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:background=\"?attr/selectableItemBackground\"\n                    android:padding=\"13dp\"\n                    android:src=\"@drawable/ic_blur_linear_24dp\" />\n\n                <ImageButton\n                    android:id=\"@+id/del\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:background=\"?attr/selectableItemBackground\"\n                    android:padding=\"13dp\"\n                    android:src=\"@drawable/ic_remove_24dp\" />\n\n                <ImageButton\n                    android:id=\"@+id/add\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:background=\"?attr/selectableItemBackground\"\n                    android:padding=\"13dp\"\n                    android:src=\"@drawable/ic_add_24dp\" />\n\n                <ImageButton\n                    android:id=\"@+id/add_one\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:background=\"?attr/selectableItemBackground\"\n                    android:padding=\"13dp\"\n                    android:src=\"@drawable/ic_exposure_plus_1_24dp\" />\n\n\n            </LinearLayout>\n\n\n        </RelativeLayout>\n\n    </androidx.appcompat.widget.Toolbar>\n\n    <com.marshalchen.ultimaterecyclerview.UltimateRecyclerView\n        android:id=\"@+id/ultimate_recycler_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginTop=\"?attr/actionBarSize\"\n        app:recyclerviewClipToPadding=\"true\"\n        app:recyclerviewDefaultSwipeColor=\"@array/google_colors\"\n        app:recyclerviewEmptyView=\"@layout/empty_view\"\n        app:recyclerviewScrollbars=\"vertical\" />\n\n    <com.marshalchen.ultimaterecyclerview.ui.floatingactionbutton.JellyBeanFloatingActionButton\n        android:id=\"@+id/custom_urv_add_floating_button\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_alignParentRight=\"true\"\n        app:icon=\"@drawable/ic_floppy\"\n        app:urv_fab_colorNormal=\"@color/button_d_normal\"\n        app:urv_fab_colorPressed=\"@color/button_d_active\" />\n\n</RelativeLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/grid_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/planview\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n    <ImageView\n        android:id=\"@+id/example_row_iv_image\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentTop=\"true\"\n        android:scaleType=\"centerCrop\"\n        android:src=\"@drawable/jr16\" />\n\n    <TextView\n        android:id=\"@+id/example_row_tv_title\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/example_row_iv_image\" />\n\n\n</RelativeLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/header_love.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <ImageView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:src=\"@drawable/jr1\"\n        />\n</RelativeLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/item_node.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"horizontal\">\n\n    <com.marshalchen.ultimaterecyclerview.ui.timelineview.TimelineView\n        android:id=\"@+id/time_marker\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:paddingBottom=\"30dp\"\n        android:paddingLeft=\"10dp\"\n        android:paddingRight=\"10dp\"\n        android:paddingTop=\"30dp\"\n        app:tls_line=\"@color/button_d_normal\"\n        app:tls_line_size=\"2dp\"\n        app:tls_marker_size=\"25dp\" />\n\n    <androidx.appcompat.widget.CardView\n        android:layout_width=\"300dp\"\n        android:layout_height=\"50dp\"\n        android:layout_gravity=\"center_vertical\">\n\n        <TextView\n            android:id=\"@+id/tx_name\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_vertical\"\n            android:layout_marginLeft=\"20dp\"\n            android:text=\"Random\" />\n\n    </androidx.appcompat.widget.CardView>\n\n</LinearLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/item_swipeable.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n    <com.marshalchen.ultimaterecyclerview.swipe.SwipeLayout\n        android:id=\"@id/recyclerview_swipe\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n        <LinearLayout\n            android:layout_width=\"210dp\"\n            android:layout_height=\"92dp\"\n            android:background=\"#FF5534\"\n            android:gravity=\"center\"\n            android:tag=\"Bottom3\"\n            android:weightSum=\"10\">\n\n            <ImageView\n                android:id=\"@+id/trash\"\n                android:layout_width=\"24dp\"\n                android:layout_height=\"24dp\"\n                android:layout_weight=\"1\"\n                android:gravity=\"center\"\n                android:src=\"@drawable/test\" />\n\n            <TextView\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"5\"\n                android:text=\"Delete Item?\"\n                android:textColor=\"#fff\"\n                android:textSize=\"18sp\" />\n\n            <Button\n                android:id=\"@+id/delete\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"48dp\"\n                android:layout_weight=\"4\"\n                android:background=\"#ffffff\"\n                android:text=\"Yes,Delete\"\n                android:textColor=\"#FF5534\" />\n\n        </LinearLayout>\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"@drawable/item_selector\"\n            android:clickable=\"true\"\n            android:padding=\"16dp\">\n\n            <TextView\n                android:id=\"@+id/position\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:textColor=\"#cccccc\" />\n\n            <TextView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:tag=\"Hover\" />\n        </LinearLayout>\n\n    </com.marshalchen.ultimaterecyclerview.swipe.SwipeLayout>\n</LinearLayout>\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/list_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.viewpager.widget.ViewPager xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/viewPager\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"100dp\"\n    android:overScrollMode=\"never\">\n\n    <androidx.appcompat.widget.CardView\n        android:id=\"@+id/primaryContentCardView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"50dp\">\n\n        <TextView\n            android:id=\"@+id/txt\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:gravity=\"center\"\n            android:text=\"demo\" />\n\n    </androidx.appcompat.widget.CardView>\n\n    <LinearLayout\n        android:id=\"@+id/secondaryContentFrameLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:gravity=\"center\"\n        android:orientation=\"horizontal\">\n\n        <Button\n            android:id=\"@+id/btn1\"\n            android:layout_width=\"100dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:text=\"Button1\" />\n\n        <Button\n            android:id=\"@+id/btn2\"\n            android:layout_width=\"100dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:text=\"Button2\" />\n\n        <Button\n            android:id=\"@+id/btn3\"\n            android:layout_width=\"100dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:text=\"Button3\" />\n\n\n    </LinearLayout>\n    <!--</LinearLayout>-->\n</androidx.viewpager.widget.ViewPager><!--</FrameLayout>-->\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/list_item_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:MaterialTabHost=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:slide=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"@dimen/header_bar_height\">\n\n    <com.hkm.slider.SliderLayout\n        android:id=\"@id/header_slider\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/header_bar_height\"\n        slide:auto_cycle=\"false\"\n        slide:lns_use_presentation=\"Dots\"\n        slide:pager_animation=\"Default\"\n        slide:slide_dot_limit=\"5\"\n        slide:slider_side_buttons=\"false\" />\n\n\n</LinearLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/listurv.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.marshalchen.ultimaterecyclerview.UltimateRecyclerView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:layout_marginTop=\"?attr/actionBarSize\"\n    app:recyclerviewClipToPadding=\"true\"\n    app:recyclerviewEmptyView=\"@layout/empty_view\"\n    app:recyclerviewPadding=\"2dp\"\n    android:id=\"@+id/scroll\"/>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/package_row.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n  ~ Copyright (C) 2013 47 Degrees, LLC\n  ~  http://47deg.com\n  ~  hello@47deg.com\n  ~\n  ~  Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~  you may not use this file except in compliance with the License.\n  ~  You may obtain a copy of the License at\n  ~\n  ~      http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~  Unless required by applicable law or agreed to in writing, software\n  ~  distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~  See the License for the specific language governing permissions and\n  ~  limitations under the License.\n  -->\n\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <LinearLayout\n        android:id=\"@+id/back\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:tag=\"back\">\n\n        <Button\n            android:id=\"@+id/example_row_b_action_1\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"open\" />\n\n        <Button\n            android:id=\"@+id/example_row_b_action_2\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"googlePlay\" />\n\n\n    </LinearLayout>\n\n    <RelativeLayout\n        android:id=\"@+id/frontItemLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\" android:background=\"@color/bg_item_normal_state\"\n        android:tag=\"front\">\n\n        <ImageView\n            android:id=\"@+id/example_row_iv_image\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" android:src=\"@drawable/jr16\" />\n\n\n        <TextView\n            android:id=\"@+id/example_row_tv_title\"\n\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_toRightOf=\"@id/example_row_iv_image\" />\n\n\n    </RelativeLayout>\n\n</FrameLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/parallax_recyclerview_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <ImageView\n        android:id=\"@id/str_sticky_headr_img\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"180dp\"\n        android:adjustViewBounds=\"true\"\n        android:scaleType=\"centerCrop\"\n        android:src=\"@drawable/jr15\" />\n\n    <TextView\n        android:id=\"@id/str_sticky_headr_tv\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_alignParentLeft=\"true\"\n        android:text=\"JR\"\n        android:textColor=\"@color/bg_item_swiping_state\"\n        android:textSize=\"30sp\" />\n</RelativeLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/recycler_view_adapter.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\" android:id=\"@+id/itemview\">\n\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:textSize=\"18sp\"\n        android:layout_marginLeft=\"2dp\"\n        android:layout_marginRight=\"2dp\"\n        android:layout_height=\"wrap_content\"\n        android:id=\"@+id/textview\" android:text=\"test2\"/>\n\n    <ImageView\n        android:layout_marginTop=\"2dp\"\n        android:layout_below=\"@id/textview\"\n        android:layout_marginLeft=\"2dp\"\n        android:layout_marginRight=\"2dp\"\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"120dp\"\n        android:scaleType=\"centerCrop\"\n        android:id=\"@+id/imageview\"\n        android:src=\"@drawable/jr1\" />\n\n    <ProgressBar\n        android:layout_width=\"wrap_content\"\n        android:id=\"@+id/progressbar\" android:visibility=\"gone\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerHorizontal=\"true\" />\n</RelativeLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/rv_item_linear.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@id/str_item_view\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n    <TextView\n        android:id=\"@id/str_textview_holder\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginLeft=\"2dp\"\n        android:layout_marginRight=\"2dp\"\n        android:text=\"test2\"\n        android:textSize=\"18sp\" />\n\n    <ImageView\n        android:id=\"@id/str_image_holder\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"120dp\"\n        android:layout_below=\"@id/str_textview_holder\"\n        android:layout_marginLeft=\"2dp\"\n        android:layout_marginRight=\"2dp\"\n        android:layout_marginTop=\"2dp\"\n        android:scaleType=\"centerCrop\"\n        android:src=\"@drawable/jr14\" />\n\n    <ProgressBar\n        android:id=\"@id/str_progress_holder\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerHorizontal=\"true\"\n        android:visibility=\"gone\" />\n\n</RelativeLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/rv_item_stagger.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@id/str_item_view\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n\n    <ImageView\n        android:id=\"@id/str_image_holder\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginLeft=\"2dp\"\n        android:layout_marginRight=\"2dp\"\n        android:layout_marginTop=\"2dp\"\n        android:scaleType=\"centerCrop\"\n        android:src=\"@drawable/jr14\" />\n\n\n    <TextView\n        android:id=\"@id/str_textview_holder\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_marginLeft=\"2dp\"\n        android:layout_marginRight=\"2dp\"\n        android:background=\"@drawable/toptint\"\n        android:text=\"test2\"\n        android:textColor=\"@color/accentLight\"\n        android:textSize=\"18sp\" />\n\n    <ProgressBar\n        android:id=\"@id/str_progress_holder\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerHorizontal=\"true\"\n        android:visibility=\"gone\" />\n\n</RelativeLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/rv_sample_1.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:orientation=\"vertical\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\">\n    <TextView\n        android:id=\"@+id/title_type1\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"View Type 1\"\n        android:background=\"@android:color/holo_green_dark\"\n        android:textColor=\"@android:color/white\"\n        android:textSize=\"40sp\"/>\n\n    <ImageView\n        android:id=\"@+id/image_type1\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"300dp\"\n        android:adjustViewBounds=\"true\"\n        android:contentDescription=\"@null\"\n        android:scaleType=\"centerCrop\" android:src=\"@drawable/scn2\"\n        android:layout_margin=\"12dp\"/>\n\n    <TextView\n        android:id=\"@+id/content_type1\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"This is sample data for view type 1\"\n        android:textSize=\"16sp\"\n        android:layout_margin=\"12dp\"/>\n</LinearLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/rv_sample_2.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:orientation=\"vertical\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\">\n    <TextView\n        android:id=\"@+id/title_type2\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"View Type 1\"\n        android:background=\"@android:color/holo_green_dark\"\n        android:textColor=\"@android:color/white\"\n        android:textSize=\"40sp\"/>\n\n\n</LinearLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/simple_scroll_activity.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@color/material_deep_teal_200\">\n\n    <FrameLayout\n        android:id=\"@+id/fragment\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <androidx.appcompat.widget.Toolbar\n        android:id=\"@+id/toolbar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"?attr/colorPrimary\"\n        android:minHeight=\"?attr/actionBarSize\"\n        app:popupTheme=\"@style/Theme.AppCompat.Light.DarkActionBar\"\n        app:theme=\"@style/Toolbar\" />\n\n</FrameLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/simplefragment_viewpager_tabhost.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.marshalchen.ultimaterecyclerview.uiUtils.TouchInterceptionLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/container\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@color/primary\"\n    android:orientation=\"vertical\"\n    android:paddingTop=\"?attr/actionBarSize\">\n\n\n    <FrameLayout\n        android:id=\"@+id/pager_wrapper\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:paddingTop=\"@dimen/tab_height\">\n\n        <androidx.viewpager.widget.ViewPager\n            android:id=\"@+id/pager\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:background=\"@android:color/white\" />\n    </FrameLayout>\n\n    <com.google.samples.apps.iosched.ui.widget.SlidingTabLayout\n        android:id=\"@+id/sliding_tabs\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/tab_height\"\n        android:background=\"@color/primary\" />\n\n\n</com.marshalchen.ultimaterecyclerview.uiUtils.TouchInterceptionLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/simplefragment_viewpaper_fragment_parent.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  Copyright 2014 Soichiro Kashima\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n      http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n-->\n<com.marshalchen.ultimaterecyclerview.uiUtils.TouchInterceptionLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/container\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@color/secondary_text_disabled_material_dark\"\n    android:paddingTop=\"?attr/actionBarSize\">\n\n    <!--\n    Padding for ViewPager must be set outside the ViewPager itself\n    because with padding, EdgeEffect of ViewPager become strange.\n    -->\n\n\n    <FrameLayout\n        android:id=\"@+id/pager_wrapper\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"bottom\">\n\n        <androidx.viewpager.widget.ViewPager\n            android:id=\"@+id/pager\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:background=\"@android:color/white\" />\n    </FrameLayout>\n\n    <FrameLayout\n        android:id=\"@+id/header\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:clipChildren=\"false\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:minHeight=\"@dimen/header_bar_height\"\n            android:orientation=\"vertical\">\n\n\n            <ImageView\n                android:id=\"@+id/header_background\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"@dimen/header_bar_height\"\n                android:background=\"@color/primaryDark\"\n                android:scaleType=\"centerCrop\"\n                android:src=\"@drawable/scn1\" />\n\n            <!--\n                        <View\n                            android:id=\"@+id/header_background\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"@dimen/header_bar_height\" />-->\n\n            <com.marshalchen.ultimaterecyclerview.demo.scrollableobservable.widget.SlidingTabLayout\n                android:id=\"@+id/sliding_tabs\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"@dimen/tab_height\"\n                android:background=\"@color/primary\" />\n        </LinearLayout>\n    </FrameLayout>\n</com.marshalchen.ultimaterecyclerview.uiUtils.TouchInterceptionLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/stick_header_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n    <com.marshalchen.ultimaterecyclerview.demo.modules.CircularImageView\n        android:id=\"@+id/stick_img\"\n        android:layout_width=\"48dp\"\n        android:layout_marginLeft=\"20dp\"\n        android:layout_height=\"48dp\" android:layout_centerVertical=\"true\"/>\n\n    <TextView\n        android:layout_toRightOf=\"@id/stick_img\"\n        android:layout_marginLeft=\"20dp\"\n        android:id=\"@+id/stick_text\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"start\"\n        android:padding=\"16dip\"\n        android:text=\"Header Item\"\n        android:textDirection=\"locale\"\n        android:textSize=\"24sp\" />\n</RelativeLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/swipe_list_view_activity.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"#FFFFFF\"\n    android:orientation=\"vertical\">\n\n    <com.marshalchen.ultimaterecyclerview.UltimateRecyclerView\n        android:id=\"@+id/example_lv_list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\" />\n\n</LinearLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/tab_indicator.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@android:id/text1\"\n    style=\"@style/ThemeOverlay.AppCompat.Light\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"48dp\"\n    android:gravity=\"center\"\n    android:paddingLeft=\"16dp\"\n    android:paddingRight=\"16dp\"\n    android:textColor=\"@color/tab_text_color\"\n    android:textSize=\"14sp\" />"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/layout/toolbar_loadmore.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n    <Spinner\n        android:id=\"@+id/spinner\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\" />\n\n    <TextView\n        android:id=\"@+id/del\"\n        style=\"@style/TextButtonToolBar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignParentRight=\"true\"\n        android:layout_centerInParent=\"true\"\n        android:text=\"Del\" />\n\n    <TextView\n        android:id=\"@+id/add\"\n        style=\"@style/TextButtonToolBar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:layout_centerInParent=\"true\"\n        android:layout_toLeftOf=\"@id/del\"\n        android:text=\"Add\" />\n\n    <ImageButton\n        android:id=\"@+id/toggle\"\n        style=\"@style/TextButtonToolBar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:layout_centerInParent=\"true\"\n        android:layout_toLeftOf=\"@id/add\"\n        android:src=\"@drawable/ic_autorenew_24dp\" />\n\n</RelativeLayout>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/menu/admenu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n</menu>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/menu/menu_main.xml",
    "content": "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:context=\".MainActivity\">\n    <item\n        android:id=\"@+id/action_bottom\"\n        android:orderInCategory=\"100\"\n        android:title=\"MultiViewType\"\n        app:showAsAction=\"never\" />\n    <item\n        android:id=\"@+id/action_custom\"\n        android:title=\"CustomRefreshActivity\" />\n    <item\n        android:id=\"@+id/admob\"\n        android:orderInCategory=\"100\"\n        android:title=\"ADMob ListView Test\"\n        app:showAsAction=\"never\" />\n    <item\n        android:id=\"@+id/adv_admob\"\n        android:orderInCategory=\"105\"\n        android:title=\"Switchable Admob Test\"\n        app:showAsAction=\"never\" />\n    <item\n        android:id=\"@+id/scrollactivity\"\n        android:orderInCategory=\"100\"\n        android:title=\"Scroll observables\"\n        app:showAsAction=\"never\" />\n    <item\n        android:id=\"@+id/swipe_and_drag\"\n        android:orderInCategory=\"105\"\n        android:title=\"Swipe Drag Activity\"\n        app:showAsAction=\"never\" />\n\n    <item\n        android:id=\"@+id/debug_load_more\"\n        android:orderInCategory=\"105\"\n        android:title=\"Load More Test\"\n        app:showAsAction=\"never\" />\n\n    <item\n        android:id=\"@+id/expandmenu\"\n        android:orderInCategory=\"105\"\n        android:title=\"expX Test\"\n        app:showAsAction=\"never\" />\n    <item\n        android:id=\"@+id/gridlayoutperformance\"\n        android:orderInCategory=\"105\"\n        android:title=\"Grid Layout\"\n        app:showAsAction=\"never\" />\n\n\n</menu>\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/values/CirclarImageViewCustomStyle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <declare-styleable name=\"CircularImageViewStyle\">\n        <attr name=\"circularImageViewDefault\" format=\"reference\" />\n    </declare-styleable>\n\n\n    <!-- CircularImageView Custom Styling -->\n    <declare-styleable name=\"CircularImageView\">\n\n        <!-- Whether or not to draw a circular border around the image. -->\n        <attr name=\"civ_border\" format=\"boolean\" />\n        <!-- The color of the border draw around the image. (if enabled) -->\n        <attr name=\"civ_borderColor\" format=\"color\" />\n        <!-- Makes the border this pixels wide. (if enabled) -->\n        <attr name=\"civ_borderWidth\" format=\"dimension\" />\n        <!-- Whether or not to draw a selector on this view upon touch events. -->\n        <attr name=\"civ_selector\" format=\"boolean\" />\n        <!-- The color of the selector draw on top of the image upon touch events. (if enabled) -->\n        <attr name=\"civ_selectorColor\" format=\"color\" />\n        <!-- The color of the selector stroke drawn around the image upon touch events. Be sure to provide some opacity. (if enabled) -->\n        <attr name=\"civ_selectorStrokeColor\" format=\"color\" />\n        <!-- The selector stroke drawn around the image upon touch events this pixels wide. (if enabled) -->\n        <attr name=\"civ_selectorStrokeWidth\" format=\"dimension\" />\n        <!-- Whether or not to draw a shadow around your circular image. -->\n        <attr name=\"civ_shadow\" format=\"boolean\" />\n        <!-- The radius for the shadow to extend to. (if enabled) -->\n        <attr name=\"civ_shadowRadius\" format=\"float\" />\n        <!-- Horizontal shadow offset. (if enabled) -->\n        <attr name=\"civ_shadowDx\" format=\"float\" />\n        <!-- Vertical shadow offset. (if enabled) -->\n        <attr name=\"civ_shadowDy\" format=\"float\" />\n        <!-- The color of the shadow drawn around your circular image. (if enabled) -->\n        <attr name=\"civ_shadowColor\" format=\"color\" />\n    </declare-styleable>\n</resources>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/values/arrays.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string-array name=\"akta\">\n        <item>22,0,0,30,</item>\n        <item>22,0,30,0,</item>\n        <item>30,0,52,30,</item>\n        <item>0,30,26,30,</item>\n        <item>60,0,60,15,</item>\n        <item>60,15,60,30,</item>\n        <item>60,15,85,15,</item>\n        <item>85,15,108,0,</item>\n        <item>85,15,108,30,</item>\n        <item>117,0,147,0,</item>\n        <item>147,0,177,0,</item>\n        <item>147,0,147,32,</item>\n        <item>198,0,176,30,</item>\n        <item>198,0,206,0,</item>\n        <item>206,0,228,30,</item>\n        <item>176,30,202,30,</item>\n    </string-array>\n\n    <string-array name=\"storehouse\">\n        <item>0,35,12,42,</item>\n        <item>12,42,24,35,</item>\n        <item>24,35,12,28,</item>\n        <item>0,35,12,28,</item>\n        <item>0,21,12,28,</item>\n        <item>12,28,24,21,</item>\n        <item>24,35,24,21,</item>\n        <item>24,21,12,14,</item>\n        <item>0,21,12,14,</item>\n        <item>0,21,0,7,</item>\n        <item>12,14,0,7,</item>\n        <item>12,14,24,7,</item>\n        <item>24,7,12,0,</item>\n        <item>0,7,12,0,</item>\n    </string-array>\n\n    <integer-array name=\"google_colors\">\n        <item>@color/red</item>\n        <item>@color/blue</item>\n        <item>@color/yellow</item>\n        <item>@color/green</item>\n    </integer-array>\n\n    <color name=\"red\">#FFC93437</color>\n    <color name=\"blue\">#FF375BF1</color>\n    <color name=\"yellow\">#FFF7D23E</color>\n    <color name=\"green\">#FF34A350</color>\n\n</resources>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"bg_swipe_item_neutral\">#ffffffff</color>\n    <color name=\"bg_swipe_item_left\">#fff9930d</color>\n    <color name=\"bg_swipe_item_right\">#ff2f8b2a</color>\n    <color name=\"bg_swipe_group_item_left\">#fff45f30</color>\n    <color name=\"bg_swipe_group_item_right\">#ff295db3</color>\n    <color name=\"bg_item_normal_state\">#fff0f0f0</color>\n    <color name=\"bg_item_normal_pressed_state\">#ffe0e0e0</color>\n    <color name=\"bg_item_swiping_state\">#ffddddff</color>\n    <color name=\"bg_item_swiping_active_state\">#ff9999ff</color>\n    <color name=\"bg_item_dragging_state\">#ffffdddd</color>\n    <color name=\"bg_item_dragging_active_state\">#ffff9999</color>\n    <color name=\"button_d_active\">#5d1c23</color>\n    <color name=\"button_d_normal\">#793042</color>\n\n\n    <color name=\"primary\">#009688</color>\n    <color name=\"primaryDark\">#00796b</color>\n    <color name=\"accent\">#eeff41</color>\n    <color name=\"accentLight\">#F4FF81</color>\n    <color name=\"tab_text_color\">#ffff3abb</color>\n\n    <color name=\"backgroundColor\">@color/background_material_dark</color>\n    <color name=\"backgroundColorPress\">@color/accent_material_dark</color>\n\n</resources>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n\n\n    <dimen name=\"margin_standard\">16dp</dimen>\n    <dimen name=\"margin_short\">8dp</dimen>\n    <dimen name=\"margin_extra_short\">4dp</dimen>\n\n    <dimen name=\"toolbar_elevation\">4dp</dimen>\n\n    <dimen name=\"toolbar_margin_start\">72dp</dimen>\n    <dimen name=\"flexible_space_height\">72dp</dimen>\n    <dimen name=\"flexible_space_image_height\">240dp</dimen>\n    <dimen name=\"flexible_space_show_fab_offset\">120dp</dimen>\n\n    <dimen name=\"parallax_image_height\">180dp</dimen>\n    <dimen name=\"tab_height\">48dp</dimen>\n    <dimen name=\"header_height\">100dp</dimen>\n\n    <dimen name=\"header_bar_height\">200dp</dimen>\n    <dimen name=\"intersection_height\">16dp</dimen>\n\n    <dimen name=\"sliding_slop\">32dp</dimen>\n    <dimen name=\"sliding_overlay_blur_size\">4dp</dimen>\n    <dimen name=\"sectionNormalHeight\">48dp</dimen>\n    <dimen name=\"sectionSquareIconSize\">40dp</dimen>\n    <dimen name=\"sectionNotificationSize\">10sp</dimen>\n    <dimen name=\"sectionSize\">15sp</dimen>\n    <dimen name=\"sectionRowMarginHorizontal\">16sp</dimen>\n</resources>\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/values/ids.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <item name=\"str_textview_holder\" type=\"id\" />\n    <item name=\"str_image_holder\" type=\"id\" />\n    <item name=\"str_progress_holder\" type=\"id\" />\n    <item name=\"str_item_view\" type=\"id\" />\n    <item name=\"str_sticky_headr_img\" type=\"id\" />\n    <item name=\"str_sticky_headr_tv\" type=\"id\" />\n    <item name=\"empty_view_loc\" type=\"id\" />\n    <item name=\"header_slider\" type=\"id\" />\n</resources>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/values/scollables.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n\n    <style name=\"Toolbar\" parent=\"Theme.AppCompat\">\n        <item name=\"colorPrimary\">@color/primary</item>\n        <item name=\"colorPrimaryDark\">@color/primaryDark</item>\n        <item name=\"colorAccent\">@color/accent</item>\n    </style>\n\n\n</resources>"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"app_name\">UltimateRecyclerView</string>\n    <string name=\"hello_world\">Hello world!</string>\n    <string name=\"action_settings\">Settings</string>\n    <string name=\"urlgithub\">https://github.com/cymcsg/UltimateRecyclerView</string>\n\n</resources>\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"windowActionModeOverlay\">true</item>\n    </style>\n\n    <style name=\"TextButtonToolBar\">\n        <item name=\"android:background\">?attr/selectableItemBackground</item>\n        <item name=\"android:paddingLeft\">10dp</item>\n        <item name=\"android:paddingRight\">10dp</item>\n        <item name=\"android:textSize\">20sp</item>\n        <item name=\"android:gravity\">center_vertical</item>\n        <item name=\"android:clickable\">true</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "UltimateRecyclerView/app/src/main/res/values-w820dp/dimens.xml",
    "content": "<resources>\n    <!-- Example customization of dimensions originally defined in res/values/dimens.xml\n         (such as screen margins) for screens with more than 820dp of available width. This\n         would include 7\" and 10\" devices in landscape (~960dp and ~1280dp respectively). -->\n    <dimen name=\"activity_horizontal_margin\">64dp</dimen>\n</resources>\n"
  },
  {
    "path": "UltimateRecyclerView/build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    repositories {\n        mavenCentral()\n        google()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:8.2.2'\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.22\"\n\n    }\n}\n\nallprojects {\n    repositories {\n        mavenCentral()\n        google()\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n\n\next {\n    //Library configurations\n    PUBLISH_GROUP_ID = 'com.marshalchen.ultimaterecyclerview'\n    PUBLISH_ARTIFACT_ID = 'library'\n    PUBLISH_VERSION = '0.9.1'\n    VERSION_CODE = 31\n\n    //Application\n    app_demo_versionCode = 31\n    app_demo_versionName = '1.7.6'\n\n    IS_UPLOADING = project.getGradle().startParameter.taskNames.any { it.contains('bintrayUpload') }\n}\n\n"
  },
  {
    "path": "UltimateRecyclerView/gradle/wrapper/gradle-wrapper.properties",
    "content": "#Wed Jun 26 23:30:04 PDT 2019\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-6.5.1-all.zip\n"
  },
  {
    "path": "UltimateRecyclerView/gradle.properties",
    "content": "ANDROID_BUILD_MIN_SDK_VERSION=21\nANDROID_BUILD_TARGET_SDK_VERSION=34\nANDROID_BUILD_SDK_VERSION=34\n## Project-wide Gradle settings.\n#\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n#\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\n# Default value: -Xmx1024m -XX:MaxPermSize=256m\n# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8\n#\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n#Wed Feb 28 11:28:49 CST 2018\nPOM_DEVELOPER_ID=cymcsg\nPOM_SCM_URL=https\\://github.com/cymcsg/UltimateRecyclerView\nSNAPSHOT_REPOSITORY_URL=https\\://oss.sonatype.org/content/repositories/snapshots\nPOM_LICENCE_DIST=repo\norg.gradle.jvmargs=-Xmx1536M\n#version check on @link https://github.com/square/leakcanary\n#systemProp.http.proxyHost=127.0.0.1\nPOM_ARTIFACT_ID=library\nPOM_DEVELOPER_NAME=marshalchen\nPOM_LICENCE_URL=http\\://www.apache.org/licenses/LICENSE-2.0.txt\nPOM_DESCRIPTION=A RecyclerView(advanced and flexible version of ListView) with refreshing,loading more,animation and many other features.\nPOM_LICENCE_NAME=The Apache Software License, Version 2.0\nPOM_NAME=ultimaterecyclerview\nPOM_PACKAGING=aar\nLEAKCANARY=2.13\nVERSION_NAME=0.8.1\nVERSION_CODE=77\nPOM_SCM_DEV_CONNECTION=https\\://github.com/cymcsg/UltimateRecyclerView.git\nPOM_URL=https\\://github.com/cymcsg/UltimateRecyclerView\nRELEASE_REPOSITORY_URL=https\\://oss.sonatype.org/service/local/staging/deploy/maven2\nPOM_SCM_CONNECTION=https\\://github.com/cymcsg/UltimateRecyclerView.git\nGROUP=com.marshalchen.ultimaterecyclerview\nsystemProp.http.proxyPort=1087\n\nandroid.useAndroidX=true\nandroid.enableJetifier=true\n"
  },
  {
    "path": "UltimateRecyclerView/gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# For Cygwin, ensure paths are in UNIX format before anything is touched.\nif $cygwin ; then\n    [ -n \"$JAVA_HOME\" ] && JAVA_HOME=`cygpath --unix \"$JAVA_HOME\"`\nfi\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >&-\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >&-\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "UltimateRecyclerView/gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windowz variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\ngoto execute\r\n\r\n:4NT_args\r\n@rem Get arguments from the 4NT Shell from JP Software\r\nset CMD_LINE_ARGS=%$\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "UltimateRecyclerView/settings.gradle",
    "content": "include ':app', ':ultimaterecyclerview'\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/android-release-aar.gradle",
    "content": "// ./gradlew clean build generateRelease\napply plugin: 'maven'\n\n\ndef groupId = project.PUBLISH_GROUP_ID\ndef artifactId = project.PUBLISH_ARTIFACT_ID\ndef version = project.VERSION_NAME\n\ndef localReleaseDest = \"${buildDir}/release/${version}\"\n\ntask androidJavadocs(type: Javadoc) {\n    source = android.sourceSets.main.java.srcDirs\n    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))\n}\n\ntask androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {\n    classifier = 'javadoc'\n    from androidJavadocs.destinationDir\n}\n\ntask androidSourcesJar(type: Jar) {\n    classifier = 'sources'\n    from android.sourceSets.main.java.srcDirs\n}\n\n\nuploadArchives {\n    repositories.mavenDeployer {\n        pom.groupId = groupId\n        pom.artifactId = artifactId\n        pom.version = version\n        // Add other pom properties here if you want (developer details / licenses)\n        repository(url: \"file://${localReleaseDest}\")\n    }\n}\n\ntask zipRelease(type: Zip) {\n    from localReleaseDest\n    destinationDir buildDir\n    archiveName \"release-${version}.zip\"\n}\n\ntask generateRelease {\n    println \"Release ${version} can be found at ${localReleaseDest}/\"\n    println \"Release ${version} zipped can be found ${buildDir}/release-${version}.zip\"\n}\n\ngenerateRelease.dependsOn(uploadArchives)\ngenerateRelease.dependsOn(zipRelease)\n\n\nartifacts {\n    archives androidSourcesJar\n    //archives androidJavadocsJar\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/bintray-release-aar.gradle",
    "content": "apply plugin: 'bintray-release'\n\nsubprojects {\n    group = GROUP_NAME\n    version = VERSION_NAME\n\n    if (IS_UPLOADING && project.name in [MODULE_NAME]) {\n        println project.name\n        apply plugin: 'maven'\n\n        gradle.taskGraph.whenReady { taskGraph ->\n            taskGraph.getAllTasks().find {\n                it.path == \":$project.name:generatePomFileForMavenPublication\"\n            }.doLast {\n                file(\"build/publications/maven/pom-default.xml\").delete()\n                println 'Overriding pom-file to make sure we can sync to maven central!'\n                pom {\n                    //noinspection GroovyAssignabilityCheck\n                    project {\n                        name \"$project.name\"\n                        artifactId ARTIFACT_ID\n                        packaging project.name == 'compiler' ? 'jar' : 'aar'\n                        description DESCRIPTION\n                        url SITE_URL\n                        version VERSION_NAME\n\n                        scm {\n                            url GIT_URL\n                            connection GIT_URL\n                            developerConnection GIT_URL\n                        }\n\n                        licenses {\n                            license {\n                                name LICENSE\n                            }\n                        }\n\n                        developers {\n                            developer {\n                                id DEVELOPER_ID\n                                name DEVELOPER_NAME\n                                email DEVELOPER_EMAIL\n                            }\n                        }\n                    }\n                }.writeTo(\"build/publications/maven/pom-default.xml\")\n            }\n        }\n    }\n}"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/bintray_3_4.gradle",
    "content": "//apply plugin: 'bintray-release'\napply plugin: 'com.novoda.bintray-release'\n\npublish {\n    userOrg = 'jjhesk'\n    groupId = 'com.hkm.ui'\n    artifactId = 'ultimaterecyclerview'\n    version = project.VERSION_NAME\n    uploadName = 'MenuURV'\n    description = \"The super recycler for the menu\"\n    website = 'https://github.com/jjhesk/BringItBackAdvanceSlidingMenu'\n    autoPublish = true\n    dryRun = false\n    issueTracker = \"${website}/issues\"\n    licences = [project.POM_LICENCE_NAME]\n    bintrayUser = userOrg\n}\n\n\nif (hasProperty('APIBKI')) {\n    publish.bintrayKey = property('APIBKI')\n} else {\n    publish.bintrayKey = '17479d176480ed0232fe101b6555654a2624d7a0'\n}\n\napply plugin: 'maven'"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/build.gradle",
    "content": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion project.ANDROID_BUILD_SDK_VERSION as int\n\n    defaultConfig {\n        versionCode project.VERSION_CODE as int\n        versionName project.VERSION_NAME\n        minSdkVersion project.ANDROID_BUILD_MIN_SDK_VERSION as int\n        targetSdkVersion project.ANDROID_BUILD_TARGET_SDK_VERSION as int\n\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n    lintOptions {\n        abortOnError false\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    namespace 'com.marshalchen.ultimaterecyclerview'\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    api 'androidx.appcompat:appcompat:1.6.1'\n    api 'androidx.recyclerview:recyclerview:1.3.2'\n    api \"androidx.swiperefreshlayout:swiperefreshlayout:1.1.0\"\n    api 'in.srain.cube:ultra-ptr:1.0.11'\n    api 'com.github.bumptech.glide:glide:4.16.0'\n    annotationProcessor 'com.github.bumptech.glide:compiler:4.16.0'\n    api 'jp.wasabeef:recyclerview-animators:4.0.2'\n}\n\napply from: 'android-release-aar.gradle'\n//apply from: 'maven-push.gradle'\n//apply from: 'bintray-release-aar.gradle'\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/gradle.properties",
    "content": "POM_NAME=ultimaterecyclerview\nPOM_ARTIFACT_ID=library\nPOM_PACKAGING=aar\nVERSION_NAME=0.9.1\nVERSION_CODE=79\nGROUP=com.marshalchen.ultimaterecyclerview\nPOM_DESCRIPTION=A RecyclerView(advanced and flexible version of ListView) with refreshing,loading more,animation and many other features.\nPOM_URL=https://github.com/cymcsg/UltimateRecyclerView\nPOM_SCM_URL=https://github.com/cymcsg/UltimateRecyclerView\nPOM_SCM_CONNECTION=https://github.com/cymcsg/UltimateRecyclerView.git\nPOM_SCM_DEV_CONNECTION=https://github.com/cymcsg/UltimateRecyclerView.git\nPOM_LICENCE_NAME=The Apache Software License, Version 2.0\nPOM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt\nPOM_LICENCE_DIST=repo\nPOM_DEVELOPER_ID=cymcsg\nPOM_DEVELOPER_NAME=marshalchen\n\nSNAPSHOT_REPOSITORY_URL=https://oss.sonatype.org/content/repositories/snapshots\nRELEASE_REPOSITORY_URL=https://oss.sonatype.org/service/local/staging/deploy/maven2\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/maven-push.gradle",
    "content": "/*\n * Copyright 2013 Chris Banes\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\napply plugin: 'maven'\napply plugin: 'signing'\n\ndef isReleaseBuild() {\n    return VERSION_NAME.contains(\"SNAPSHOT\") == false\n}\n\ndef getReleaseRepositoryUrl() {\n    return hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL\n            : \"https://oss.sonatype.org/service/local/staging/deploy/maven2/\"\n}\n\ndef getSnapshotRepositoryUrl() {\n    return hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL\n            : \"https://oss.sonatype.org/content/repositories/snapshots/\"\n}\n\ndef getRepositoryUsername() {\n    return hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : \"\"\n}\n\ndef getRepositoryPassword() {\n    return hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : \"\"\n}\n\nafterEvaluate { project ->\n    uploadArchives {\n        repositories {\n            mavenDeployer {\n                beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }\n\n                pom.groupId = GROUP\n                pom.artifactId = POM_ARTIFACT_ID\n                pom.version = VERSION_NAME\n\n                repository(url: getReleaseRepositoryUrl()) {\n                    authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())\n                }\n                snapshotRepository(url: getSnapshotRepositoryUrl()) {\n                    authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())\n                }\n\n                pom.project {\n                    name POM_NAME\n                    packaging POM_PACKAGING\n                    description POM_DESCRIPTION\n                    url POM_URL\n\n                    scm {\n                        url POM_SCM_URL\n                        connection POM_SCM_CONNECTION\n                        developerConnection POM_SCM_DEV_CONNECTION\n                    }\n\n                    licenses {\n                        license {\n                            name POM_LICENCE_NAME\n                            url POM_LICENCE_URL\n                            distribution POM_LICENCE_DIST\n                        }\n                    }\n\n                    developers {\n                        developer {\n                            id POM_DEVELOPER_ID\n                            name POM_DEVELOPER_NAME\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    signing {\n        required { isReleaseBuild() && gradle.taskGraph.hasTask(\"uploadArchives\") }\n        sign configurations.archives\n    }\n\n    task androidJavadocs(type: Javadoc) {\n        source = android.sourceSets.main.java.srcDirs\n        classpath += project.files(android.getBootClasspath().join(File.pathSeparator))\n    }\n\n    task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {\n        classifier = 'javadoc'\n        from androidJavadocs.destinationDir\n    }\n\n    task androidSourcesJar(type: Jar) {\n        classifier = 'sources'\n        from android.sourceSets.main.java.sourceFiles\n    }\n\n    artifacts {\n        archives androidSourcesJar\n      //  archives androidJavadocsJar\n    }\n}"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /Volumes/MAC3/adt/sdk/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/androidTest/java/com/marshalchen/ultimaterecyclerview/ApplicationTest.java",
    "content": "package com.marshalchen.ultimaterecyclerview;\n\nimport android.app.Application;\nimport android.test.ApplicationTestCase;\n\n/**\n * <a href=\"http://d.android.com/tools/testing/testing_android.html\">Testing Fundamentals</a>\n */\npublic class ApplicationTest extends ApplicationTestCase<Application> {\n    public ApplicationTest() {\n        super(Application.class);\n    }\n}"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.marshalchen.ultimaterecyclerview\">\n</manifest>\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/CustomUltimateRecyclerview.java",
    "content": "package com.marshalchen.ultimaterecyclerview;\n\nimport android.content.Context;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.util.AttributeSet;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewStub;\n\nimport com.marshalchen.ultimaterecyclerview.ui.floatingactionbutton.FloatingActionButton;\n\nimport in.srain.cube.views.ptr.PtrFrameLayout;\n\n/**\n * Created by cym on 15/3/21.\n */\npublic class CustomUltimateRecyclerview extends UltimateRecyclerView {\n\n    public PtrFrameLayout mPtrFrameLayout;\n\n    public CustomUltimateRecyclerview(Context context) {\n        super(context);\n    }\n\n    public CustomUltimateRecyclerview(Context context, AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    public CustomUltimateRecyclerview(Context context, AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n    }\n\n    @Override\n    protected void initViews() {\n        //super.initViews();\n        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n        View view = inflater.inflate(R.layout.custom_recycler_view_layout, this);\n        mRecyclerView = (RecyclerView) view.findViewById(R.id.ultimate_list);\n        mSwipeRefreshLayout = null;\n\n        if (mRecyclerView != null) {\n\n            mRecyclerView.setClipToPadding(mClipToPadding);\n            if (mPadding != -1.1f) {\n                mRecyclerView.setPadding(mPadding, mPadding, mPadding, mPadding);\n            } else {\n                mRecyclerView.setPadding(mPaddingLeft, mPaddingTop, mPaddingRight, mPaddingBottom);\n            }\n        }\n\n        defaultFloatingActionButton = (FloatingActionButton) view.findViewById(R.id.defaultFloatingActionButton);\n        setDefaultScrollListener();\n\n        mEmpty = (ViewStub) view.findViewById(R.id.emptyview);\n        mFloatingButtonViewStub = (ViewStub) view.findViewById(R.id.floatingActionViewStub);\n\n        mEmpty.setLayoutResource(mEmptyId);\n\n        mFloatingButtonViewStub.setLayoutResource(mFloatingButtonId);\n\n        if (mEmptyId != 0)\n            mEmptyView = mEmpty.inflate();\n        mEmpty.setVisibility(View.GONE);\n\n        if (mFloatingButtonId != 0) {\n            mFloatingButtonView = mFloatingButtonViewStub.inflate();\n            mFloatingButtonView.setVisibility(View.VISIBLE);\n        }\n\n    }\n\n    public void setCustomSwipeToRefresh() {\n        mPtrFrameLayout = (PtrFrameLayout) findViewById(R.id.store_house_ptr_frame);\n        mPtrFrameLayout.setResistance(1.7f);\n        mPtrFrameLayout.setRatioOfHeaderHeightToRefresh(1.2f);\n        mPtrFrameLayout.setDurationToClose(200);\n        mPtrFrameLayout.setDurationToCloseHeader(1000);\n        mPtrFrameLayout.setPullToRefresh(false);\n        mPtrFrameLayout.setKeepHeaderWhenRefresh(true);\n    }\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/DragDropTouchListener.java",
    "content": "/*\n *  Licensed under the Apache License, Version 2.0 (the \"License\");\n *  you may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS,\n *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n */\n\npackage com.marshalchen.ultimaterecyclerview;\n\nimport android.animation.Animator;\nimport android.animation.AnimatorListenerAdapter;\nimport android.app.Activity;\nimport android.graphics.Bitmap;\nimport android.graphics.Canvas;\nimport android.graphics.drawable.Drawable;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.util.DisplayMetrics;\nimport android.util.Log;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.FrameLayout;\nimport android.widget.ImageView;\n\n/**\n * Implementation of RecyclerView.OnItemTouchListener that allows reordering items in RecyclerView by dragging and dropping.\n * Instance of this class should be added to RecylcerView using {@link RecyclerView#addOnItemTouchListener(RecyclerView.OnItemTouchListener)} method.\n * Use something like this:\n * dragDropTouchListener = new DragDropTouchListener(recyclerView, this) {\n *       Override\n *       protected void onItemSwitch(RecyclerView recyclerView, int from, int to) {\n *           adapter.swapPositions(from, to);\n *           adapter.notifyItemChanged(to);\n *           adapter.notifyItemChanged(from);\n *        Override\n *        protected void onItemDrop(RecyclerView recyclerView, int position) {\n *       }\n *  };\n *  }\n * recyclerView.addOnItemTouchListener(dragDropTouchListener);\n *\n * Actual drag is started by calling {@link #startDrag()} somewhere later, for eg. in long touch listener\n */\npublic abstract class DragDropTouchListener implements RecyclerView.OnItemTouchListener {\n    private static final String LOG_TAG = \"DRAG-DROP\";\n    private static final int MOVE_DURATION = 150;\n\n    private RecyclerView recyclerView;\n    private Activity activity;\n    private Drawable dragHighlight;\n    private DisplayMetrics displayMetrics;\n\n    private final int scrollAmount;\n    private int downY = -1;\n    private int downX = -1;\n    private View mobileView;\n    private int mobileViewStartY = -1;\n    private int mobileViewCurrentPos = -1;\n    private int activePointerId;\n    private boolean dragging;\n    private boolean enabled = true;\n\n\n    public DragDropTouchListener(RecyclerView recyclerView, Activity activity) {\n        this.recyclerView = recyclerView;\n        this.activity = activity;\n        this.displayMetrics = recyclerView.getResources().getDisplayMetrics();\n        this.scrollAmount = (int) (50 / displayMetrics.density);\n        this.dragHighlight = recyclerView.getResources().getDrawable(R.drawable.drag_frame);\n\n    }\n\n    public DragDropTouchListener(RecyclerView recyclerView, Activity activity, Drawable dragHighlight) {\n        this(recyclerView, activity);\n        this.dragHighlight = dragHighlight;\n    }\n\n    @Override\n    public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent event) {\n        if (!enabled) return false;\n\n        switch (event.getAction() & MotionEvent.ACTION_MASK) {\n            case MotionEvent.ACTION_DOWN:\n                return down(event);\n\n            case MotionEvent.ACTION_MOVE:\n                return dragging && move(event);\n\n            case MotionEvent.ACTION_UP:\n                return up(event);\n\n            case MotionEvent.ACTION_CANCEL:\n                return cancel(event);\n\n        }\n        return false;\n    }\n\n    @Override\n    public void onTouchEvent(RecyclerView view, MotionEvent event) {\n        if (!dragging) return;\n\n        switch (event.getAction() & MotionEvent.ACTION_MASK) {\n            case MotionEvent.ACTION_MOVE:\n                move(event);\n                break;\n\n            case MotionEvent.ACTION_UP:\n                up(event);\n                break;\n\n            case MotionEvent.ACTION_CANCEL:\n                cancel(event);\n                break;\n\n        }\n    }\n\n\n    /**\n     * Call this to indicate drag start\n     */\n    public void startDrag() {\n        View viewUnder = recyclerView.findChildViewUnder(downX, downY);\n        if (viewUnder == null) return;\n        dragging = true;\n\n        mobileViewCurrentPos = recyclerView.getChildPosition(viewUnder);\n\n        int[] viewRawCoords = getViewRawCoords(viewUnder);\n        mobileView = copyViewAsImage(viewUnder);\n        mobileView.setX(viewRawCoords[0]);\n        mobileView.setY(viewRawCoords[1]);\n        mobileViewStartY = viewRawCoords[1];\n\n        ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);\n        activity.addContentView(mobileView, lp);\n        mobileView.bringToFront();\n        viewUnder.setVisibility(View.INVISIBLE);\n\n    }\n\n    private boolean down(MotionEvent event) {\n        activePointerId = event.getPointerId(0);\n        downY = (int) event.getY();\n        downX = (int) event.getX();\n        return false;\n    }\n\n\n    private boolean move(MotionEvent event) {\n        if (activePointerId == -1) {\n            return false;\n        }\n\n        int pointerIndex = event.findPointerIndex(activePointerId);\n        int currentY = (int) event.getY(pointerIndex);\n        int deltaY = currentY - downY;\n        int mobileViewY = mobileViewStartY + deltaY;\n        mobileView.setY(mobileViewY);\n\n        switchViewsIfNeeded();\n        scrollIfNeeded();\n        return true;\n    }\n\n    private void switchViewsIfNeeded() {\n        int pos = mobileViewCurrentPos;\n        int abovePos = pos - 1;\n        int belowPos = pos + 1;\n\n        View aboveView = getViewByPosition(abovePos);\n        View belowView = getViewByPosition(belowPos);\n\n        int mobileViewY = (int) mobileView.getY();\n\n        if (aboveView != null && aboveView.getTop() > -1 && mobileViewY < aboveView.getTop()) {\n            Log.d(LOG_TAG, String.format(\"Got aboveView with top = %s, for position = %s, %s\", aboveView.getTop(), abovePos, aboveView));\n            doSwitch(aboveView, pos, abovePos);\n        }\n        if (belowView != null && belowView.getTop() > -1 && mobileViewY > belowView.getTop()) {\n            Log.d(LOG_TAG, String.format(\"Got belowView with top = %s, for position = %s, %s\", belowView.getTop(), belowPos, belowView));\n            doSwitch(belowView, pos, belowPos);\n        }\n\n    }\n\n    private void doSwitch(final View switchView, final int originalViewPos, final int switchViewPos) {\n        View originalView = getViewByPosition(originalViewPos);\n        int switchViewTop = switchView.getTop();\n        int originalViewTop = originalView.getTop();\n        int delta = originalViewTop - switchViewTop;\n\n        onItemSwitch(recyclerView, originalViewPos, switchViewPos);\n\n        switchView.setVisibility(View.INVISIBLE);\n        originalView.setVisibility(View.VISIBLE);\n\n        originalView.setTranslationY(-delta);\n        originalView.animate().translationYBy(delta).setDuration(MOVE_DURATION);\n\n        mobileViewCurrentPos = switchViewPos;\n\n    }\n\n    private boolean up(MotionEvent event) {\n        if (dragging) {\n            onItemDrop(recyclerView, mobileViewCurrentPos);\n        }\n        reset();\n        return false;\n    }\n\n    private boolean cancel(MotionEvent event) {\n        reset();\n        return false;\n    }\n\n    private void reset() {\n        //Animate mobile view back to original position\n        final View view = getViewByPosition(mobileViewCurrentPos);\n        if (view != null && mobileView != null) {\n            float y = getViewRawCoords(view)[1];\n            mobileView.animate().y(y).setDuration(MOVE_DURATION).setListener(new AnimatorListenerAdapter() {\n                @Override\n                public void onAnimationEnd(Animator animation) {\n                    view.setVisibility(View.VISIBLE);\n                    if (mobileView != null) {\n                        ViewGroup parent = (ViewGroup) mobileView.getParent();\n                        parent.removeView(mobileView);\n                        mobileView = null;\n                    }\n\n                }\n            });\n\n        }\n\n        dragging = false;\n        mobileViewStartY = -1;\n        mobileViewCurrentPos = -1;\n\n    }\n\n    private View getViewByPosition(int position) {\n        RecyclerView.ViewHolder viewHolder = recyclerView.findViewHolderForPosition(position);\n        return viewHolder == null ? null : viewHolder.itemView;\n    }\n\n\n    private boolean scrollIfNeeded() {\n        int height = recyclerView.getHeight();\n        int hoverViewTop = (int) mobileView.getY();\n        int hoverHeight = mobileView.getHeight();\n\n        if (hoverViewTop <= 0) {\n            recyclerView.scrollBy(0, -scrollAmount);\n            return true;\n        }\n\n        if (hoverViewTop + hoverHeight >= height) {\n            recyclerView.scrollBy(0, scrollAmount);\n            return true;\n        }\n\n        return false;\n    }\n\n\n    //Creates screenshot of a view\n    private ImageView copyViewAsImage(View v) {\n        //Clear ripple effect to not get into screenshot,\n        // need something more clever here\n        if (v instanceof FrameLayout) {\n            FrameLayout frameLayout = (FrameLayout) v;\n            Drawable foreground = frameLayout.getForeground();\n            if (foreground != null) foreground.setVisible(false, false);\n        } else {\n            if (v.getBackground() != null) v.getBackground().setVisible(false, false);\n        }\n\n\n        Bitmap bitmap = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);\n        Canvas canvas = new Canvas(bitmap);\n        v.draw(canvas);\n\n        //Drag highlight, usually border\n        if (dragHighlight != null) {\n            dragHighlight.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());\n            dragHighlight.draw(canvas);\n        }\n\n        ImageView imageView = new ImageView(recyclerView.getContext());\n        imageView.setImageBitmap(bitmap);\n        return imageView;\n    }\n\n\n    private int[] getViewRawCoords(View locateView) {\n        View globalView = activity.findViewById(android.R.id.content);\n        int topOffset = displayMetrics.heightPixels - globalView.getMeasuredHeight();\n        int[] loc = new int[2];\n        locateView.getLocationOnScreen(loc);\n        loc[1] = loc[1] - topOffset;\n        return loc;\n    }\n\n\n    /**\n     * Enable/disable drag/drop\n     *\n     * @param enabled     na\n     */\n    public void setEnabled(boolean enabled) {\n        this.enabled = enabled;\n    }\n\n    /**\n     * Implementation usually do 2 things: change positions of items in RecyclerView.Adapter and notify it about changes\n     *\n     * @param recyclerView view the item is being dragged in\n     * @param from         original (start) drag position within adapter\n     * @param to           new drag position withing adapter\n     */\n    protected abstract void onItemSwitch(RecyclerView recyclerView, int from, int to);\n\n    /**\n     * Item is dropped at given position\n     *\n     * @param recyclerView view the item is being dropped in\n     * @param position     position of a drop within adapter\n     */\n    protected abstract void onItemDrop(RecyclerView recyclerView, int position);\n\n\n    public void setCustomDragHighlight(Drawable dragHighlight) {\n        this.dragHighlight = dragHighlight;\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/ItemTouchListenerAdapter.java",
    "content": "/*\n *  Licensed under the Apache License, Version 2.0 (the \"License\");\n *  you may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS,\n *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n * /\n */\n\npackage com.marshalchen.ultimaterecyclerview;\n\nimport androidx.annotation.Nullable;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.GestureDetector;\nimport android.view.MotionEvent;\nimport android.view.View;\n\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.AdmobAdapter;\n\n/**\n * As RecyclerView does not have standard way to add click listeners to the items,\n * this RecyclerView.OnItemTouchListener intercepts touch events and translates them to simple\n * Simply add it as follows:\n *\n * {@code\n *     recyclerView.addOnItemTouchListener(new ItemTouchListenerAdapter(recyclerView, this));\n *\n * }\n *\n */\npublic  class ItemTouchListenerAdapter extends GestureDetector.SimpleOnGestureListener implements RecyclerView.OnItemTouchListener {\n\n\n    public interface RecyclerViewOnItemClickListener {\n        void onItemClick(RecyclerView parent, View clickedView, int position);\n\n        void onItemLongClick(RecyclerView parent, View clickedView, int position);\n    }\n\n    private RecyclerViewOnItemClickListener listener;\n    private RecyclerView recyclerView;\n    private GestureDetector gestureDetector;\n\n    public ItemTouchListenerAdapter(\n            RecyclerView recyclerView,\n            RecyclerViewOnItemClickListener listener) {\n        if (recyclerView == null || listener == null) {\n            throw new IllegalArgumentException(\"RecyclerView and Listener arguments can not be null\");\n        }\n        this.recyclerView = recyclerView;\n        this.listener = listener;\n        this.gestureDetector = new GestureDetector(recyclerView.getContext(), this);\n    }\n\n    @Override\n    public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {\n        gestureDetector.onTouchEvent(motionEvent);\n        return false;\n    }\n\n    @Override\n    public void onTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {\n\n    }\n\n    @Override\n    public void  onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {\n\n    }\n    @Override\n    public void onShowPress(MotionEvent e) {\n        View view = getChildViewUnder(e);\n        if (view != null) {\n            view.setPressed(true);\n        }\n    }\n\n    /**\n     * case out and fix the bug from offseted number from AdmobAdapter\n     * fixed by jjhesk\n     * one more thing is that the first item display in the list got to be clickable. \n     * \n     * @param position input position\n     * @return AdmobAdapter.POSITION_ON_AD meaning that the touch position is on the position of Adview\n     */\n    private int shiftAdjustInt(int position) {\n        if (recyclerView.getAdapter() instanceof AdmobAdapter && position > 0 ) {\n            AdmobAdapter adp = (AdmobAdapter) recyclerView.getAdapter();\n            return adp.isPosOnAdView(position) ? AdmobAdapter.POSITION_ON_AD : adp.getFinalShiftPosition(position);\n        } else {\n            return position;\n        }\n    }\n\n    @Override\n    public boolean onSingleTapUp(MotionEvent e) {\n        View view = getChildViewUnder(e);\n        if (view == null) return false;\n\n        view.setPressed(false);\n        int position = shiftAdjustInt(recyclerView.getChildAdapterPosition(view));\n\n        if (position != AdmobAdapter.POSITION_ON_AD) {\n            listener.onItemClick(recyclerView, view, position);\n        }\n        return true;\n    }\n\n    public void onLongPress(MotionEvent e) {\n        View view = getChildViewUnder(e);\n        if (view == null) return;\n        int position = shiftAdjustInt(recyclerView.getChildAdapterPosition(view));\n        if (position != AdmobAdapter.POSITION_ON_AD) {\n            listener.onItemLongClick(recyclerView, view, position);\n        }\n        view.setPressed(false);\n    }\n\n    @Nullable\n    private View getChildViewUnder(MotionEvent e) {\n        return recyclerView.findChildViewUnder(e.getX(), e.getY());\n    }\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/NormalUltimateViewAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview;\n\nimport android.animation.Animator;\nimport android.animation.ObjectAnimator;\nimport android.annotation.TargetApi;\nimport android.os.Build;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.marshalchen.ultimaterecyclerview.itemTouchHelper.ItemTouchHelperAdapter;\nimport com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.StickyRecyclerHeadersAdapter;\n\nimport java.util.Collections;\nimport java.util.List;\n\n/**\n * An abstract adapter which can be extended for Recyclerview\n */\npublic abstract class NormalUltimateViewAdapter extends RecyclerView.Adapter<UltimateRecyclerviewViewHolder>\n        implements StickyRecyclerHeadersAdapter<RecyclerView.ViewHolder>, ItemTouchHelperAdapter {\n\n\n    protected View customLoadMoreView = null;\n\n    /**\n     * Set the header view of the adapter.\n     *\n     * @param customHeaderView na\n     */\n    public void setCustomHeaderView(UltimateRecyclerView.CustomRelativeWrapper customHeaderView) {\n        this.customHeaderView = customHeaderView;\n    }\n\n    public UltimateRecyclerView.CustomRelativeWrapper getCustomHeaderView() {\n        return customHeaderView;\n    }\n\n    protected UltimateRecyclerView.CustomRelativeWrapper customHeaderView = null;\n\n    @Override\n    public UltimateRecyclerviewViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n\n        if (viewType == VIEW_TYPES.FOOTER) {\n            UltimateRecyclerviewViewHolder viewHolder = new UltimateRecyclerviewViewHolder(customLoadMoreView);\n            if (getAdapterItemCount() == 0)\n                viewHolder.itemView.setVisibility(View.GONE);\n            return viewHolder;\n        } else if (viewType == VIEW_TYPES.HEADER) {\n            if (customHeaderView != null)\n                return new UltimateRecyclerviewViewHolder(customHeaderView);\n        } else if (viewType == VIEW_TYPES.CHANGED_FOOTER) {\n            UltimateRecyclerviewViewHolder viewHolder = new UltimateRecyclerviewViewHolder(customLoadMoreView);\n            if (getAdapterItemCount() == 0)\n                viewHolder.itemView.setVisibility(View.GONE);\n            return viewHolder;\n        }\n//        else if (viewType==VIEW_TYPES.STICKY_HEADER){\n//            return new UltimateRecyclerviewViewHolder(LayoutInflater.from(parent.getContext())\n//                    .inflate(R.layout.stick_header_item, parent, false));\n//        }\n\n        return onCreateViewHolder(parent);\n\n    }\n\n\n    public abstract UltimateRecyclerviewViewHolder onCreateViewHolder(ViewGroup parent);\n\n    /**\n     * Using a custom LoadMoreView\n     *\n     * @param customview the inflated view\n     */\n    public void setCustomLoadMoreView(View customview) {\n        customLoadMoreView = customview;\n    }\n\n    /**\n     * Changing the loadmore view\n     *\n     * @param customview the inflated view\n     */\n    public void swipeCustomLoadMoreView(View customview) {\n        customLoadMoreView = customview;\n        isLoadMoreChanged = true;\n    }\n\n    public View getCustomLoadMoreView() {\n        return customLoadMoreView;\n    }\n\n    public boolean isLoadMoreChanged = false;\n\n    @Override\n    public int getItemViewType(int position) {\n        if (position == getItemCount() - 1 && customLoadMoreView != null) {\n            if (isLoadMoreChanged) {\n                return VIEW_TYPES.CHANGED_FOOTER;\n            } else {\n                return VIEW_TYPES.FOOTER;\n            }\n\n\n        } else if (position == 0 && customHeaderView != null) {\n            return VIEW_TYPES.HEADER;\n        } else\n            return VIEW_TYPES.NORMAL;\n    }\n\n\n    /**\n     * Returns the total number of items in the data set hold by the adapter.\n     *\n     * @return The total number of items in this adapter.\n     */\n    @Override\n    public int getItemCount() {\n        int headerOrFooter = 0;\n        if (customHeaderView != null) headerOrFooter++;\n        if (customLoadMoreView != null) headerOrFooter++;\n        return getAdapterItemCount() + headerOrFooter;\n    }\n\n    /**\n     * Returns the number of items in the adapter bound to the parent RecyclerView.\n     *\n     * @return The number of items in the bound adapter\n     */\n    public abstract int getAdapterItemCount();\n\n    public void toggleSelection(int pos) {\n        notifyItemChanged(pos);\n    }\n\n    public void clearSelection(int pos) {\n        notifyItemChanged(pos);\n    }\n\n    public void setSelected(int pos) {\n        notifyItemChanged(pos);\n    }\n\n    /**\n     * Swap the item of list\n     *\n     * @param list data list\n     * @param from position from\n     * @param to   position to\n     */\n    public void swapPositions(List<?> list, int from, int to) {\n        if (customHeaderView != null) {\n            from--;\n            to--;\n        }\n        Collections.swap(list, from, to);\n    }\n\n\n    /**\n     * Insert a item to the list of the adapter\n     *\n     * @param list     data list\n     * @param object   object T\n     * @param position position\n     * @param <T>      in T\n     */\n    public <T> void insert(List<T> list, T object, int position) {\n        list.add(position, object);\n        if (customHeaderView != null) position++;\n        notifyItemInserted(position);\n    }\n\n    /**\n     * Remove a item of  the list of the adapter\n     *\n     * @param list     data list\n     * @param position position\n     */\n    public void remove(List<?> list, int position) {\n        if (list.size() > 0) {\n            list.remove(customHeaderView != null ? position - 1 : position);\n            notifyItemRemoved(position);\n        }\n    }\n\n    /**\n     * Clear the list of the adapter\n     *\n     * @param list data list\n     */\n    public void clear(List<?> list) {\n        int size = list.size();\n        list.clear();\n        notifyItemRangeRemoved(0, size);\n    }\n\n    @Override\n    public long getHeaderId(int position) {\n        if (customHeaderView != null && position == 0) return -1;\n        if (customLoadMoreView != null && position >= getItemCount() - 1) return -1;\n        if (getAdapterItemCount() > 0)\n            return generateHeaderId(position);\n        else return -1;\n    }\n\n    public abstract long generateHeaderId(int position);\n\n\n    protected class VIEW_TYPES {\n        public static final int NORMAL = 0;\n        public static final int HEADER = 1;\n        public static final int FOOTER = 2;\n        public static final int CHANGED_FOOTER = 3;\n    }\n\n    protected enum AdapterAnimationType {\n        AlphaIn,\n        SlideInBottom,\n        ScaleIn,\n        SlideInLeft,\n        SlideInRight,\n    }\n\n    /**\n     * Animations when loading the adapter\n     *\n     * @param view the view\n     * @param type the type of the animation\n     * @return the animator in array\n     */\n    @TargetApi(Build.VERSION_CODES.HONEYCOMB)\n    protected Animator[] getAdapterAnimations(View view, AdapterAnimationType type) {\n        if (type == AdapterAnimationType.ScaleIn) {\n            ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, \"scaleX\", .5f, 1f);\n            ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, \"scaleY\", .5f, 1f);\n            return new ObjectAnimator[]{scaleX, scaleY};\n        } else if (type == AdapterAnimationType.AlphaIn) {\n            return new Animator[]{ObjectAnimator.ofFloat(view, \"alpha\", .5f, 1f)};\n        } else if (type == AdapterAnimationType.SlideInBottom) {\n            return new Animator[]{\n                    ObjectAnimator.ofFloat(view, \"translationY\", view.getMeasuredHeight(), 0)\n            };\n        } else if (type == AdapterAnimationType.SlideInLeft) {\n            return new Animator[]{\n                    ObjectAnimator.ofFloat(view, \"translationX\", -view.getRootView().getWidth(), 0)\n            };\n        } else if (type == AdapterAnimationType.SlideInRight) {\n            return new Animator[]{\n                    ObjectAnimator.ofFloat(view, \"translationX\", view.getRootView().getWidth(), 0)\n            };\n        }\n        return null;\n    }\n\n    @Override\n    public void onItemMove(int fromPosition, int toPosition) {\n        notifyItemMoved(fromPosition, toPosition);\n    }\n\n    @Override\n    public void onItemDismiss(int position) {\n        notifyDataSetChanged();\n    }\n\n\n    protected OnStartDragListener mDragStartListener = null;\n\n    /**\n     * Listener for manual initiation of a drag.\n     */\n    public interface OnStartDragListener {\n\n        /**\n         * Called when a view is requesting a start of a drag.\n         *\n         * @param viewHolder The holder of the view to drag.\n         */\n        void onStartDrag(RecyclerView.ViewHolder viewHolder);\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/ObservableScrollState.java",
    "content": "/*\n * Copyright 2014 Soichiro Kashima\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.marshalchen.ultimaterecyclerview;\n\n/**\n * Constants that indicates the scroll state of the Scrollable widgets.\n */\npublic enum ObservableScrollState {\n    /**\n     * Widget is stopped.\n     * This state does not always mean that this widget have never been scrolled.\n     */\n    STOP,\n\n    /**\n     * Widget is scrolled up by swiping it down.\n     */\n    UP,\n\n    /**\n     * Widget is scrolled down by swiping it up.\n     */\n    DOWN,\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/ObservableScrollViewCallbacks.java",
    "content": "/*\n * Copyright 2014 Soichiro Kashima\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.marshalchen.ultimaterecyclerview;\n\n/**\n * Callbacks for Scrollable widgets.\n */\npublic interface ObservableScrollViewCallbacks {\n    /**\n     * Called when the scroll change events occurred.\n     * This won't be called just after the view is laid out, so if you'd like to\n     * initialize the position of your views with this method, you should call this manually\n     * or invoke scroll as appropriate.\n     *\n     * @param scrollY     scroll position in Y axis\n     * @param firstScroll true when this is called for the first time in the consecutive motion events\n     * @param dragging    true when the view is dragged and false when the view is scrolled in the inertia\n     */\n    void onScrollChanged(int scrollY, boolean firstScroll, boolean dragging);\n\n    /**\n     * Called when the down motion event occurred.\n     */\n    void onDownMotionEvent();\n\n    /**\n     * Called when the dragging ended or canceled.\n     *\n     * @param observableScrollState state to indicate the scroll direction\n     */\n    void onUpOrCancelMotionEvent(ObservableScrollState observableScrollState);\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/RecyclerItemClickListener.java",
    "content": "/*\n * Copyright(c) 2015 Marshal Chen\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.marshalchen.ultimaterecyclerview;\n\nimport android.content.Context;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.GestureDetector;\nimport android.view.MotionEvent;\nimport android.view.View;\n\npublic class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {\n    private OnItemClickListener mListener;\n\n    public interface OnItemClickListener {\n        public void onItemClick(View view, int position);\n    }\n\n    GestureDetector mGestureDetector;\n\n    public RecyclerItemClickListener(Context context, OnItemClickListener listener) {\n        mListener = listener;\n        mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {\n            @Override public boolean onSingleTapUp(MotionEvent e) {\n                return true;\n            }\n        });\n    }\n\n    @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {\n        View childView = view.findChildViewUnder(e.getX(), e.getY());\n        if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {\n            mListener.onItemClick(childView, view.getChildPosition(childView));\n            return true;\n        }\n        return false;\n    }\n\n    @Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { }\n\n    @Override\n    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {\n\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/Scrollable.java",
    "content": "package com.marshalchen.ultimaterecyclerview;\n\nimport android.view.ViewGroup;\n\nimport com.marshalchen.ultimaterecyclerview.ObservableScrollViewCallbacks;\n\n/**\n * Provides common API for observable and scrollable widgets.\n */\npublic interface Scrollable {\n    /**\n     * Sets a callback listener.\n     *\n     * @param listener listener to set\n     */\n    void setScrollViewCallbacks(ObservableScrollViewCallbacks listener);\n\n    /**\n     * Scrolls vertically to the absolute Y.\n     * Implemented classes are expected to scroll to the exact Y pixels from the top,\n     * but it depends on the type of the widget.\n     *\n     * @param y vertical position to scroll to\n     */\n    void scrollVerticallyTo(int y);\n\n    /**\n     * Returns the current Y of the scrollable view.\n     *\n     * @return current Y pixel\n     */\n    int getCurrentScrollY();\n\n    /**\n     * Sets a touch motion event delegation ViewGroup.\n     * This is used to pass motion events back to parent view.\n     * It's up to the implementation classes whether or not it works.\n     *\n     * @param viewGroup ViewGroup object to dispatch motion events\n     */\n    void setTouchInterceptionViewGroup(ViewGroup viewGroup);\n}"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/SwipeDismissTouchListener.java",
    "content": "/*\n * Copyright 2013 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.marshalchen.ultimaterecyclerview;\n\nimport android.animation.Animator;\nimport android.animation.AnimatorListenerAdapter;\nimport android.animation.ValueAnimator;\nimport android.view.MotionEvent;\nimport android.view.VelocityTracker;\nimport android.view.View;\nimport android.view.ViewConfiguration;\nimport android.view.ViewGroup;\n\n@Deprecated\npublic class SwipeDismissTouchListener implements View.OnTouchListener {\n    // Cached ViewConfiguration and system-wide constant values\n    private int mSlop;\n    private int mMinFlingVelocity;\n    private int mMaxFlingVelocity;\n    private long mAnimationTime;\n\n    // Fixed properties\n    private View mView;\n    private SwipeDismissCallbacks mCallbacks;\n    private int mViewWidth = 1; // 1 and not 0 to prevent dividing by zero\n\n    // Transient properties\n    private float mDownX;\n    private float mDownY;\n    private boolean mSwiping;\n    private int mSwipingSlop;\n    private Object mToken;\n    private VelocityTracker mVelocityTracker;\n    private float mTranslationX;\n\n    /**\n     * The callback interface used by {@link com.marshalchen.ultimaterecyclerview.SwipeDismissTouchListener} to inform its client\n     * about a successful dismissal of the view for which it was created.\n     */\n    public interface SwipeDismissCallbacks {\n        /**\n         * Called to determine whether the view can be dismissed.\n         *\n         * @param token na\n         * @return na\n         */\n        boolean canDismiss(Object token);\n\n        /**\n         * Called when the user has indicated they she would like to dismiss the view.\n         *\n         * @param view  The originating {@link android.view.View} to be dismissed.\n         * @param token The optional token passed to this object's constructor.\n         */\n        void onDismiss(View view, Object token);\n    }\n\n    /**\n     * Constructs a new swipe-to-dismiss touch listener for the given view.\n     *\n     * @param view      The view to make dismissable.\n     * @param token     An optional token/cookie object to be passed through to the callback.\n     * @param callbacks The callback to trigger when the user has indicated that she would like to\n     *                  dismiss this view.\n     */\n    public SwipeDismissTouchListener(View view, Object token, SwipeDismissCallbacks callbacks) {\n        ViewConfiguration vc = ViewConfiguration.get(view.getContext());\n        mSlop = vc.getScaledTouchSlop();\n        mMinFlingVelocity = vc.getScaledMinimumFlingVelocity() * 16;\n        mMaxFlingVelocity = vc.getScaledMaximumFlingVelocity();\n        mAnimationTime = view.getContext().getResources().getInteger(\n                android.R.integer.config_shortAnimTime);\n        mView = view;\n        mToken = token;\n        mCallbacks = callbacks;\n    }\n\n    @Override\n    public boolean onTouch(View view, MotionEvent motionEvent) {\n        // offset because the view is translated during swipe\n        motionEvent.offsetLocation(mTranslationX, 0);\n\n        if (mViewWidth < 2) {\n            mViewWidth = mView.getWidth();\n        }\n\n        switch (motionEvent.getActionMasked()) {\n            case MotionEvent.ACTION_DOWN: {\n                // TODO: ensure this is a finger, and set a flag\n                mDownX = motionEvent.getRawX();\n                mDownY = motionEvent.getRawY();\n                if (mCallbacks.canDismiss(mToken)) {\n                    mVelocityTracker = VelocityTracker.obtain();\n                    mVelocityTracker.addMovement(motionEvent);\n                }\n                return true;\n            }\n\n            case MotionEvent.ACTION_UP: {\n                if (mVelocityTracker == null) {\n                    break;\n                }\n\n                float deltaX = motionEvent.getRawX() - mDownX;\n                mVelocityTracker.addMovement(motionEvent);\n                mVelocityTracker.computeCurrentVelocity(1000);\n                float velocityX = mVelocityTracker.getXVelocity();\n                float absVelocityX = Math.abs(velocityX);\n                float absVelocityY = Math.abs(mVelocityTracker.getYVelocity());\n                boolean dismiss = false;\n                boolean dismissRight = false;\n                if (Math.abs(deltaX) > mViewWidth / 2 && mSwiping) {\n                    dismiss = true;\n                    dismissRight = deltaX > 0;\n                } else if (mMinFlingVelocity <= absVelocityX && absVelocityX <= mMaxFlingVelocity\n                        && absVelocityY < absVelocityX\n                        && absVelocityY < absVelocityX && mSwiping) {\n                    // dismiss only if flinging in the same direction as dragging\n                    dismiss = (velocityX < 0) == (deltaX < 0);\n                    dismissRight = mVelocityTracker.getXVelocity() > 0;\n                }\n                if (dismiss) {\n                    // dismiss\n                    mView.animate()\n                            .translationX(dismissRight ? mViewWidth : -mViewWidth)\n                            .alpha(0)\n                            .setDuration(mAnimationTime)\n                            .setListener(new AnimatorListenerAdapter() {\n                                @Override\n                                public void onAnimationEnd(Animator animation) {\n                                    performDismiss();\n                                }\n                            });\n                } else if (mSwiping) {\n                    // cancel\n                    mView.animate()\n                            .translationX(0)\n                            .alpha(1)\n                            .setDuration(mAnimationTime)\n                            .setListener(null);\n                }\n                mVelocityTracker.recycle();\n                mVelocityTracker = null;\n                mTranslationX = 0;\n                mDownX = 0;\n                mDownY = 0;\n                mSwiping = false;\n                break;\n            }\n\n            case MotionEvent.ACTION_CANCEL: {\n                if (mVelocityTracker == null) {\n                    break;\n                }\n\n                mView.animate()\n                        .translationX(0)\n                        .alpha(1)\n                        .setDuration(mAnimationTime)\n                        .setListener(null);\n                mVelocityTracker.recycle();\n                mVelocityTracker = null;\n                mTranslationX = 0;\n                mDownX = 0;\n                mDownY = 0;\n                mSwiping = false;\n                break;\n            }\n\n            case MotionEvent.ACTION_MOVE: {\n                if (mVelocityTracker == null) {\n                    break;\n                }\n\n                mVelocityTracker.addMovement(motionEvent);\n                float deltaX = motionEvent.getRawX() - mDownX;\n                float deltaY = motionEvent.getRawY() - mDownY;\n                if (Math.abs(deltaX) > mSlop && Math.abs(deltaY) < Math.abs(deltaX) / 2) {\n                    mSwiping = true;\n                    mSwipingSlop = (deltaX > 0 ? mSlop : -mSlop);\n                    mView.getParent().requestDisallowInterceptTouchEvent(true);\n\n                    // Cancel listview's touch\n                    MotionEvent cancelEvent = MotionEvent.obtain(motionEvent);\n                    cancelEvent.setAction(MotionEvent.ACTION_CANCEL |\n                            (motionEvent.getActionIndex() <<\n                                    MotionEvent.ACTION_POINTER_INDEX_SHIFT));\n                    mView.onTouchEvent(cancelEvent);\n                    cancelEvent.recycle();\n                }\n\n                if (mSwiping) {\n                    mTranslationX = deltaX;\n                    mView.setTranslationX(deltaX - mSwipingSlop);\n                    // TODO: use an ease-out interpolator or such\n                    mView.setAlpha(Math.max(0f, Math.min(1f,\n                            1f - 2f * Math.abs(deltaX) / mViewWidth)));\n                    return true;\n                }\n                break;\n            }\n        }\n        return false;\n    }\n\n    private void performDismiss() {\n        // Animate the dismissed view to zero-height and then fire the dismiss callback.\n        // This triggers layout on each animation frame; in the future we may want to do something\n        // smarter and more performant.\n        URLogs.d(\"performDismiss\");\n        final ViewGroup.LayoutParams lp = mView.getLayoutParams();\n        final int originalHeight = mView.getHeight();\n\n        ValueAnimator animator = ValueAnimator.ofInt(originalHeight, 1).setDuration(mAnimationTime);\n\n        animator.addListener(new AnimatorListenerAdapter() {\n            @Override\n            public void onAnimationEnd(Animator animation) {\n                mCallbacks.onDismiss(mView, mToken);\n                // Reset view presentation\n                mView.setAlpha(1f);\n                mView.setTranslationX(0);\n                lp.height = originalHeight;\n                mView.setLayoutParams(lp);\n            }\n        });\n\n        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator valueAnimator) {\n                lp.height = (Integer) valueAnimator.getAnimatedValue();\n                // if (lp.height > 100)\n                mView.setLayoutParams(lp);\n                //  mView.setVisibility(View.GONE);\n            }\n        });\n\n        animator.start();\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/SwipeableUltimateRecyclerview.java",
    "content": "package com.marshalchen.ultimaterecyclerview;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewStub;\n\nimport com.marshalchen.ultimaterecyclerview.swipelistview.SwipeListView;\nimport com.marshalchen.ultimaterecyclerview.swipelistview.SwipeListViewListener;\nimport com.marshalchen.ultimaterecyclerview.ui.VerticalSwipeRefreshLayout;\nimport com.marshalchen.ultimaterecyclerview.ui.floatingactionbutton.FloatingActionButton;\n\n/**\n * Created by MarshalChen on 15-6-5.\n */\npublic class SwipeableUltimateRecyclerview extends UltimateRecyclerView  {\n    public SwipeableUltimateRecyclerview(Context context) {\n        super(context);\n    }\n\n    public SwipeableUltimateRecyclerview(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        ((SwipeListView)mRecyclerView).init(attrs);\n    }\n\n    public SwipeableUltimateRecyclerview(Context context, AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n        ((SwipeListView)mRecyclerView).init(attrs);\n    }\n\n    @Override\n    protected void initViews() {\n        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n        View view = inflater.inflate(R.layout.swipeable_ultimate_recycler_view_layout, this);\n        mRecyclerView = (SwipeListView) view.findViewById(R.id.ultimate_list);\n\n        mSwipeRefreshLayout = (VerticalSwipeRefreshLayout) view.findViewById(R.id.swipe_refresh_layout);\n        setScrollbars();\n        mSwipeRefreshLayout.setEnabled(false);\n\n        if (mRecyclerView != null) {\n\n            mRecyclerView.setClipToPadding(mClipToPadding);\n            if (mPadding != -1.1f) {\n                mRecyclerView.setPadding(mPadding, mPadding, mPadding, mPadding);\n            } else {\n                mRecyclerView.setPadding(mPaddingLeft, mPaddingTop, mPaddingRight, mPaddingBottom);\n            }\n        }\n\n        defaultFloatingActionButton = (FloatingActionButton) view.findViewById(R.id.defaultFloatingActionButton);\n        setDefaultScrollListener();\n\n        mEmpty = (ViewStub) view.findViewById(R.id.emptyview);\n        mFloatingButtonViewStub = (ViewStub) view.findViewById(R.id.floatingActionViewStub);\n\n        mEmpty.setLayoutResource(mEmptyId);\n\n        mFloatingButtonViewStub.setLayoutResource(mFloatingButtonId);\n\n        if (mEmptyId != 0)\n            mEmptyView = mEmpty.inflate();\n        mEmpty.setVisibility(View.GONE);\n\n        if (mFloatingButtonId != 0) {\n            mFloatingButtonView = mFloatingButtonViewStub.inflate();\n            mFloatingButtonView.setVisibility(View.VISIBLE);\n        }\n\n\n    }\n\n    public void setSwipeListViewListener(SwipeListViewListener swipeListViewListener) {\n        ((SwipeListView)mRecyclerView).swipeListViewListener = swipeListViewListener;\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/SwipeableUltimateViewAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview;\n\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.View;\n\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.easyRegularAdapter;\nimport com.marshalchen.ultimaterecyclerview.swipe.SwipeItemManagerImpl;\nimport com.marshalchen.ultimaterecyclerview.swipe.SwipeItemManagerInterface;\nimport com.marshalchen.ultimaterecyclerview.swipe.SwipeLayout;\n\nimport java.util.List;\n\n/**\n * An abstract adapter which can be extended for Recyclerview\n */\npublic abstract class SwipeableUltimateViewAdapter<T>\n        extends easyRegularAdapter<T, UltimateRecyclerviewViewHolder>\n        implements SwipeItemManagerInterface {\n\n    public SwipeableUltimateViewAdapter(List<T> list) {\n        super(list);\n    }\n\n\n    protected SwipeItemManagerImpl mItemManger = new SwipeItemManagerImpl(this);\n\n    /**\n     * binding normal view holder\n     *\n     * @param holder   holder class\n     * @param data     data\n     * @param position position\n     */\n    @Override\n    protected void withBindHolder(UltimateRecyclerviewViewHolder holder, T data, int position) {\n        mItemManger.updateConvertView(holder, position);\n    }\n\n    @Override\n    protected void onBindAdViewHolder(RecyclerView.ViewHolder holder, int pos) {\n        mItemManger.updateConvertView((UltimateRecyclerviewViewHolder) holder, pos);\n    }\n\n    @Override\n    protected void onBindCustomViewHolder(RecyclerView.ViewHolder holder, int pos) {\n        mItemManger.updateConvertView((UltimateRecyclerviewViewHolder) holder, pos);\n    }\n\n    @Override\n    protected void onBindFooterViewHolder(RecyclerView.ViewHolder holder, int pos) {\n      //  mItemManger.updateConvertView((UltimateRecyclerviewViewHolder) holder, pos);\n    }\n\n    @Override\n    public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder, int pos) {\n       // mItemManger.updateConvertView((UltimateRecyclerviewViewHolder) holder, pos);\n    }\n\n    @Override\n    public void openItem(int position) {\n        mItemManger.openItem(position);\n    }\n\n    @Override\n    public void closeItem(int position) {\n        mItemManger.closeItem(position);\n    }\n\n    @Override\n    public void closeAllExcept(SwipeLayout layout) {\n        mItemManger.closeAllExcept(layout);\n    }\n\n    @Override\n    public List<Integer> getOpenItems() {\n        return mItemManger.getOpenItems();\n    }\n\n    @Override\n    public List<SwipeLayout> getOpenLayouts() {\n        return mItemManger.getOpenLayouts();\n    }\n\n    @Override\n    public void removeShownLayouts(SwipeLayout layout) {\n        mItemManger.removeShownLayouts(layout);\n    }\n\n    @Override\n    public boolean isOpen(int position) {\n        return mItemManger.isOpen(position);\n    }\n\n    @Override\n    public SwipeItemManagerImpl.Mode getMode() {\n        return mItemManger.getMode();\n    }\n\n    @Override\n    public void setMode(SwipeItemManagerImpl.Mode mode) {\n        mItemManger.setMode(mode);\n    }\n\n    public static class BaseSwipeableViewHolder extends RecyclerView.ViewHolder {\n\n        public SwipeLayout swipeLayout = null;\n        public SwipeLayout.OnLayout onLayoutListener = null;\n        public SwipeLayout.SwipeListener swipeMemory = null;\n        public int position = -1;\n\n        public BaseSwipeableViewHolder(View itemView) {\n            super(itemView);\n\n            swipeLayout = (SwipeLayout) itemView.findViewById(R.id.recyclerview_swipe);\n        }\n    }\n\n\n    @Override\n    public void insert(List<T> new_data) {\n        super.insert(new_data);\n        closeAllExcept(null);\n    }\n\n\n    @Override\n    public void removeAll() {\n        super.removeAll();\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/URLogs.java",
    "content": "package com.marshalchen.ultimaterecyclerview;\n\nimport android.util.Log;\n\n/**\n * Only for debug\n */\npublic final class URLogs {\n    private static boolean sIsLogEnabled = true;\n\n    private static String sApplicationTag = \"Chen\";\n\n    private static final String TAG_CONTENT_PRINT = \"%s:%s.%s:%d\";\n\n    private static StackTraceElement getCurrentStackTraceElement() {\n        return Thread.currentThread().getStackTrace()[4];\n\n    }\n\n\n    public static void trace() {\n        if (sIsLogEnabled) {\n            Log.d(sApplicationTag,\n                    getContent(getCurrentStackTraceElement()));\n        }\n    }\n\n    private static String getContent(StackTraceElement trace) {\n        return String.format(TAG_CONTENT_PRINT, sApplicationTag,\n                trace.getClassName(), trace.getMethodName(),\n                trace.getLineNumber());\n    }\n\n    private static String getContents(StackTraceElement trace) {\n        return String.format(\"%s:%s:%d\", sApplicationTag,\n                trace.getMethodName(),\n                trace.getLineNumber());\n    }\n\n    public static void traceStack() {\n        if (sIsLogEnabled) {\n            traceStack(sApplicationTag, Log.ERROR);\n        }\n    }\n\n    public static void traceStack(String tag, int priority) {\n\n        if (sIsLogEnabled) {\n            StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();\n            Log.println(priority, tag, stackTrace[4].toString());\n            StringBuilder str = new StringBuilder();\n            String prevClass = null;\n            for (int i = 5; i < stackTrace.length; i++) {\n                String className = stackTrace[i].getFileName();\n                int idx = className.indexOf(\".java\");\n                if (idx >= 0) {\n                    className = className.substring(0, idx);\n                }\n                if (prevClass == null || !prevClass.equals(className)) {\n\n                    str.append(className.substring(0, idx));\n\n                }\n                prevClass = className;\n                str.append(\".\").append(stackTrace[i].getMethodName())\n                        .append(\":\").append(stackTrace[i].getLineNumber())\n                        .append(\"->\");\n            }\n            Log.println(priority, tag, str.toString());\n        }\n    }\n\n    /**\n     * Send a VERBOSE log message.\n     *\n     * @param msg na\n     */\n    public static void v(String msg) {\n        if (sIsLogEnabled) {\n            Log.v(sApplicationTag, getContents(getCurrentStackTraceElement()) + \">\" + msg);\n        }\n    }\n\n    /**\n     * Send a DEBUG log message.\n     *\n     * @param tag na\n     * @param msg na\n     */\n    public static void d(String tag, String msg) {\n        if (sIsLogEnabled) {\n            Log.d(tag, getContent(getCurrentStackTraceElement()) + \">\" + msg);\n        }\n    }\n\n    /**\n     * Send a DEBUG log message.\n     *\n     * @param msg na\n     */\n    public static void d(String msg) {\n        if (sIsLogEnabled) {\n            Log.d(sApplicationTag, getContents(getCurrentStackTraceElement()) + \">\" + msg);\n        }\n    }\n\n    /**\n     * Send an INFO log message.\n     *\n     * @param tag na\n     * @param msg na\n     */\n    public static void i(String tag, String msg) {\n        if (sIsLogEnabled) {\n            Log.i(tag, getContent(getCurrentStackTraceElement()) + \">\" + msg);\n        }\n    }\n\n    /**\n     * @param message na\n     * @param args    na\n     */\n    public static void d(String message, Object... args) {\n        if (sIsLogEnabled) {\n            d(String.format(message, args));\n        }\n    }\n\n    /**\n     * Send a WARN log message.\n     *\n     * @param tag na\n     * @param msg na\n     */\n    public static void w(String tag, String msg) {\n        if (sIsLogEnabled) {\n            Log.w(tag, getContent(getCurrentStackTraceElement()) + \">\" + msg);\n        }\n    }\n\n    /**\n     * Send an ERROR log message.\n     *\n     * @param tag na\n     * @param msg na\n     */\n    public static void e(String tag, String msg) {\n        if (sIsLogEnabled) {\n            Log.e(tag, getContent(getCurrentStackTraceElement()) + \">\" + msg);\n        }\n    }\n\n    /**\n     * Send an INFO log message.\n     *\n     * @param msg na\n     */\n    public static void i(String msg) {\n        if (sIsLogEnabled) {\n            Log.i(sApplicationTag, getContent(getCurrentStackTraceElement()) + \">\" + msg);\n        }\n    }\n\n    /**\n     * Send a WARN log message.\n     *\n     * @param msg na\n     */\n    public static void w(String msg) {\n        if (sIsLogEnabled) {\n            Log.w(sApplicationTag, getContent(getCurrentStackTraceElement()) + \">\" + msg);\n        }\n    }\n\n    /**\n     * Send an ERROR log message.\n     *\n     * @param msg na\n     */\n    public static void e(String msg) {\n        if (sIsLogEnabled) {\n            Log.e(sApplicationTag, getContent(getCurrentStackTraceElement()) + \"\\n>\" + msg);\n\n        }\n    }\n\n    /**\n     * Send an ERROR log message.\n     *\n     * @param exception na\n     */\n    public static void e(Exception exception) {\n        if (sIsLogEnabled) {\n            Log.e(sApplicationTag, getContent(getCurrentStackTraceElement()) + \"\\n>\" + exception.getMessage());\n            exception.printStackTrace();\n        }\n    }\n\n    /**\n     * Send an ERROR log message.\n     *\n     * @param exception na\n     * @param string    na\n     */\n    public static void e(Exception exception, String string) {\n        if (sIsLogEnabled) {\n            Log.e(sApplicationTag, getContent(getCurrentStackTraceElement()) + \"\\n>\" + exception.getMessage() + \"\\n>\" + exception.getStackTrace() + \"   \" + string);\n            exception.printStackTrace();\n        }\n    }\n\n    /**\n     * Send an ERROR log message.\n     *\n     * @param string    na\n     * @param exception na\n     */\n    public static void e(String string, Exception exception) {\n        if (sIsLogEnabled) {\n            Log.e(sApplicationTag, getContent(getCurrentStackTraceElement()) + \"\\n>\" + exception.getMessage() + \"\\n>\" + exception.getStackTrace() + \"   \" + string);\n            exception.printStackTrace();\n        }\n    }\n\n    /**\n     * Send an ERROR log message.\n     *\n     * @param tag       na\n     * @param message   na\n     * @param exception na\n     */\n    public static void e(String tag, String message, Exception exception) {\n        if (sIsLogEnabled) {\n            Log.e(tag, getContent(getCurrentStackTraceElement()) + \"\\n>\" + exception.getMessage() + \"\\n>\" + exception.getStackTrace() + \"   \" + message);\n            exception.printStackTrace();\n        }\n    }\n\n\n    public static boolean issIsLogEnabled() {\n        return sIsLogEnabled;\n    }\n\n\n    /**\n     * Set if the Logs print log or not\n     *\n     * @param sIsLogEnabled na\n     */\n    public static void setsIsLogEnabled(boolean sIsLogEnabled) {\n        URLogs.sIsLogEnabled = sIsLogEnabled;\n    }\n\n\n    public static String getsApplicationTag() {\n        return sApplicationTag;\n    }\n\n    public static void setsApplicationTag(String sApplicationTag) {\n        URLogs.sApplicationTag = sApplicationTag;\n    }\n\n    public static String getTagContentPrint() {\n        return TAG_CONTENT_PRINT;\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/UltimateDifferentViewTypeAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview;\n\n\nimport android.view.ViewGroup;\n\nimport com.marshalchen.ultimaterecyclerview.multiViewTypes.DataBinder;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * An adapter which support different layout\n */\npublic abstract class UltimateDifferentViewTypeAdapter<E extends Enum<E>> extends UltimateViewAdapter<UltimateRecyclerviewViewHolder> {\n    private Map<E, DataBinder> mBinderMap = new HashMap<>();\n\n    protected class VIEW_TYPES extends UltimateViewAdapter.VIEW_TYPES {\n        public static final int MULTI_VIEWS = 5;\n    }\n\n    @Override\n    public UltimateRecyclerviewViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n//        if (viewType == VIEW_TYPES.HEADER||viewType ==VIEW_TYPES.FOOTER\n//                ||viewType==VIEW_TYPES.CHANGED_FOOTER) {\n//            return super.onCreateViewHolder(parent, viewType);\n//        } else\n            return getDataBinder(viewType).newViewHolder(parent);\n    }\n\n    @Override\n    public void onBindViewHolder(UltimateRecyclerviewViewHolder viewHolder, int position) {\n        //int binderPosition = getBinderPosition(position);\n        getDataBinder(viewHolder.getItemViewType()).bindViewHolder(viewHolder, position);\n\n    }\n\n    @Override\n    public int getItemCount() {\n        int itemCount = 0;\n        for (DataBinder binder : mBinderMap.values()) {\n            itemCount += binder.getItemCount();\n        }\n        return itemCount;\n    }\n\n    @Override\n    public int getItemViewType(int position) {\n//        int type = super.getItemViewType(position);\n//        if (type == VIEW_TYPES.NORMAL) {\n//            return getEnumFromPosition(position).ordinal();\n//        } else {\n//            return type;\n//        }\n        return getEnumFromPosition(position).ordinal();\n\n    }\n\n    public <T extends DataBinder> T getDataBinder(int viewType) {\n        return getDataBinder(getEnumFromOrdinal(viewType));\n    }\n\n    public int getPosition(DataBinder binder, int binderPosition) {\n        E targetViewType = getEnumFromBinder(binder);\n        for (int i = 0; i < getItemCount(); i++) {\n            if (targetViewType == getEnumFromPosition(i)) {\n                binderPosition--;\n                if (binderPosition <= 0) {\n                    return i;\n                }\n            }\n        }\n        return getItemCount();\n    }\n\n    public int getBinderPosition(int position) {\n        E targetViewType = getEnumFromPosition(position);\n        int binderPosition = -1;\n        for (int i = 0; i <= position; i++) {\n            if (targetViewType == getEnumFromPosition(i)) {\n                binderPosition++;\n            }\n        }\n\n        if (binderPosition == -1) {\n            throw new IllegalArgumentException(\"Invalid Argument\");\n        }\n        return binderPosition;\n    }\n\n    public void notifyBinderItemRangeChanged(DataBinder binder, int positionStart, int itemCount) {\n        for (int i = positionStart; i <= itemCount; i++) {\n            notifyItemChanged(getPosition(binder, i));\n        }\n    }\n\n    public void notifyBinderItemRangeInserted(DataBinder binder, int positionStart, int itemCount) {\n        for (int i = positionStart; i <= itemCount; i++) {\n            notifyItemInserted(getPosition(binder, i));\n        }\n    }\n\n    public void notifyBinderItemRangeRemoved(DataBinder binder, int positionStart, int itemCount) {\n        for (int i = positionStart; i <= itemCount; i++) {\n            notifyItemRemoved(getPosition(binder, i));\n        }\n    }\n\n    public void notifyBinderItemChanged(DataBinder binder, int binderPosition) {\n        notifyItemChanged(getPosition(binder, binderPosition));\n    }\n\n\n    public void notifyBinderItemInserted(DataBinder binder, int binderPosition) {\n        notifyItemInserted(getPosition(binder, binderPosition));\n    }\n\n    public void notifyBinderItemMoved(DataBinder binder, int fromPosition, int toPosition) {\n        notifyItemMoved(getPosition(binder, fromPosition), getPosition(binder, toPosition));\n    }\n\n\n    public void notifyBinderItemRemoved(DataBinder binder, int binderPosition) {\n        notifyItemRemoved(getPosition(binder, binderPosition));\n    }\n\n\n    public abstract E getEnumFromPosition(int position);\n\n    public abstract E getEnumFromOrdinal(int ordinal);\n\n    public E getEnumFromBinder(DataBinder binder) {\n        for (Map.Entry<E, DataBinder> entry : mBinderMap.entrySet()) {\n            if (entry.getValue().equals(binder)) {\n                return entry.getKey();\n            }\n        }\n        throw new IllegalArgumentException(\"Invalid Data Binder\");\n    }\n\n    public <T extends DataBinder> T getDataBinder(E e) {\n        return (T) mBinderMap.get(e);\n    }\n\n    public Map<E, DataBinder> getBinderMap() {\n        return mBinderMap;\n    }\n\n    public void putBinder(E e, DataBinder binder) {\n        mBinderMap.put(e, binder);\n    }\n\n    public void removeBinder(E e) {\n        mBinderMap.remove(e);\n    }\n\n    public void clearBinderMap() {\n        mBinderMap.clear();\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/UltimateGridLayoutAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview;\n\nimport android.annotation.TargetApi;\nimport android.os.Build;\nimport androidx.annotation.LayoutRes;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.easyRegularAdapter;\n\nimport java.util.List;\n\n/**\n * Created by hesk on 27/1/16.\n */\npublic abstract class UltimateGridLayoutAdapter<DATA, BINDER extends UltimateRecyclerviewViewHolder> extends easyRegularAdapter<DATA, BINDER> {\n    private boolean mValid = true;\n    private int span_columns;\n\n    public UltimateGridLayoutAdapter(List<DATA> items) {\n        super(items);\n        span_columns = 1;\n    }\n\n    public void setSpanColumns(int columns) {\n        span_columns = columns;\n    }\n\n\n    private int normalDataConv(final int rpos) {\n        int orgin = rpos;\n        int size = getAdapterItemCount();\n        if (hasHeaderView()) orgin -= 1;\n        int out = orgin >= size - 1 ? size - 1 : orgin;\n        return out;\n    }\n\n\n\n    protected View getViewById(@LayoutRes final int layoutId, ViewGroup parent) {\n        View view = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);\n        return view;\n    }\n\n    @Override\n    public UltimateRecyclerviewViewHolder onCreateHeaderViewHolder(ViewGroup parent) {\n        return new UltimateRecyclerviewViewHolder(parent);\n    }\n\n    @Override\n    public int getAdapterItemCount() {\n        return mValid ? super.getAdapterItemCount() : 0;\n    }\n\n    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)\n    @Override\n    public long generateHeaderId(int position) {\n        return View.generateViewId();\n    }\n\n    @Override\n    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {\n        final int current_type = getItemViewType(position);\n        if (VIEW_TYPES.HEADER == current_type) {\n            onBindHeaderViewHolder(holder, position);\n        } else if (VIEW_TYPES.NORMAL == current_type) {\n            bindNormal((BINDER) holder, getItem(getItemDataPosFromInternalPos(position)), position);\n        } else if (VIEW_TYPES.FOOTER == current_type) {\n            onFooterCustomerization(holder, position);\n        }\n    }\n\n    protected void onFooterCustomerization(RecyclerView.ViewHolder view, int position) {\n\n    }\n\n    /**\n     * normally you dont need to do anything for this implementation.\n     *\n     * @param holder   the data holder\n     * @param position position to render\n     */\n    @Override\n    public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder, int position) {\n        // Log.d(\"ascc\", position + \" : \");\n    }\n\n    protected abstract void bindNormal(BINDER b, DATA data, final int position);\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/UltimateRecyclerView.java",
    "content": "/*\n * Copyright(c) 2015 Marshal Chen\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.marshalchen.ultimaterecyclerview;\n\nimport android.animation.ValueAnimator;\nimport android.annotation.TargetApi;\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.Canvas;\nimport android.graphics.Rect;\nimport android.os.Build;\nimport android.os.Parcelable;\nimport androidx.annotation.ColorInt;\nimport androidx.annotation.LayoutRes;\nimport androidx.annotation.Nullable;\nimport androidx.core.view.ViewCompat;\nimport androidx.recyclerview.widget.DefaultItemAnimator;\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout;\nimport androidx.recyclerview.widget.GridLayoutManager;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\nimport androidx.recyclerview.widget.StaggeredGridLayoutManager;\nimport androidx.appcompat.widget.Toolbar;\nimport android.util.AttributeSet;\nimport android.util.Log;\nimport android.util.SparseIntArray;\nimport android.view.LayoutInflater;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.ViewStub;\nimport android.view.animation.TranslateAnimation;\nimport android.widget.FrameLayout;\nimport android.widget.RelativeLayout;\n\nimport com.marshalchen.ultimaterecyclerview.ui.DividerItemDecoration;\nimport com.marshalchen.ultimaterecyclerview.ui.VerticalSwipeRefreshLayout;\nimport com.marshalchen.ultimaterecyclerview.ui.emptyview.emptyViewOnShownListener;\nimport com.marshalchen.ultimaterecyclerview.ui.floatingactionbutton.FloatingActionButton;\nimport com.marshalchen.ultimaterecyclerview.ui.floatingactionbutton.FloatingActionsMenu;\nimport com.marshalchen.ultimaterecyclerview.uiUtils.RecyclerViewPositionHelper;\nimport com.marshalchen.ultimaterecyclerview.uiUtils.SavedStateScrolling;\n\n\n/**\n * UltimateRecyclerView is a recyclerview which contains many features like  swipe to dismiss,animations,drag drop etc.\n */\npublic class UltimateRecyclerView extends FrameLayout implements Scrollable {\n    /**\n     * TRIGGERED ON NOTIFIY ITEMS\n     */\n    public static int EMPTY_CLEAR_ALL = 0;\n    public static int EMPTY_SHOW_LOADMORE_ONLY = 1;\n    public static int EMPTY_KEEP_HEADER = 2;\n    public static int EMPTY_KEEP_HEADER_AND_LOARMORE = 3;\n\n    /**\n     * TRIGGERED ON SETTING ADAPTER TO THE URV\n     */\n    public static int STARTWITH_OFFLINE_ITEMS = 0;\n    public static int STARTWITH_ONLINE_ITEMS = 1;\n\n    private int policy_empty, policy_init;\n    public RecyclerView mRecyclerView;\n    protected FloatingActionButton defaultFloatingActionButton;\n    private OnLoadMoreListener onLoadMoreListener;\n    private int lastVisibleItemPosition;\n    protected RecyclerView.OnScrollListener mOnScrollListener;\n    protected LAYOUT_MANAGER_TYPE layoutManagerType;\n    private boolean automaticLoadMoreEnabled = false;\n    protected int mPadding;\n    protected int mPaddingTop;\n    protected int mPaddingBottom;\n    protected int mPaddingLeft;\n    protected int mPaddingRight;\n    //protected int mEmptyViewPolicy;\n    protected boolean mClipToPadding;\n    private UltimateViewAdapter mAdapter;\n    // Fields that should be saved onSaveInstanceState\n    private int mPrevFirstVisiblePosition;\n    private int mPrevFirstVisibleChildHeight = -1;\n    private int mPrevScrolledChildrenHeight;\n    private int mPrevScrollY;\n    private int mScrollY;\n    private SparseIntArray mChildrenHeights = new SparseIntArray();\n\n    // Fields that don't need to be saved onSaveInstanceState\n    private ObservableScrollState mObservableScrollState;\n    private ObservableScrollViewCallbacks mCallbacks;\n    //private ScrollState mScrollState;\n    private boolean mFirstScroll;\n    private boolean mDragging;\n    private boolean mIntercepted;\n    private boolean mIsLoadMoreWidgetEnabled = false;\n    private MotionEvent mPrevMoveEvent;\n    private ViewGroup mTouchInterceptionViewGroup;\n    /**\n     * custom load more progress bar\n     */\n    private View mLoadMoreView;\n    /**\n     * empty view group\n     */\n    protected ViewStub mEmpty;\n    protected View mEmptyView;\n    protected int mEmptyId;\n    protected emptyViewOnShownListener mEmptyViewListener;\n\n\n    /**\n     * the floating button group\n     */\n    protected ViewStub mFloatingButtonViewStub;\n    protected View mFloatingButtonView;\n    protected int mFloatingButtonId;\n\n    protected int[] defaultSwipeToDismissColors = null;\n    public int showLoadMoreItemNum = 3;\n\n    public VerticalSwipeRefreshLayout mSwipeRefreshLayout;\n\n    private RecyclerViewPositionHelper mRecyclerViewHelper;\n    private CustomRelativeWrapper mHeader;\n    private int mTotalYScrolled;\n\n    private final float SCROLL_MULTIPLIER = 0.5f;\n    private OnParallaxScroll mParallaxScroll;\n    private static boolean isParallaxHeader = false;\n    private LayoutInflater inflater;\n\n    /**\n     * control to show the loading view first when list is initiated at the beginning\n     * true - assume there is a buffer to load things before and the adapter suppose zero data at the beignning\n     * false - assume there is data to show at the beginning level\n     */\n    private boolean isFirstLoadingOnlineAdapter = false;\n    // added by Sevan Joe to support scrollbars\n    private static final int SCROLLBARS_NONE = 0;\n    private static final int SCROLLBARS_VERTICAL = 1;\n    private static final int SCROLLBARS_HORIZONTAL = 2;\n    private int mScrollbarsStyle;\n    private int mVisibleItemCount = 0;\n    private int mTotalItemCount = 0;\n    private int previousTotal = 0;\n    private int mFirstVisibleItem;\n\n    public UltimateRecyclerView(Context context) {\n        super(context);\n        initViews();\n    }\n\n    public UltimateRecyclerView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        initAttrs(attrs);\n        initViews();\n    }\n\n    public UltimateRecyclerView(Context context, AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n        initAttrs(attrs);\n        initViews();\n    }\n\n    public void setRecylerViewBackgroundColor(@ColorInt int color) {\n        mRecyclerView.setBackgroundColor(color);\n    }\n\n    protected void initViews() {\n        inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n        View view = inflater.inflate(R.layout.ultimate_recycler_view_layout, this);\n        mRecyclerView = (RecyclerView) view.findViewById(R.id.ultimate_list);\n        mSwipeRefreshLayout = (VerticalSwipeRefreshLayout) view.findViewById(R.id.swipe_refresh_layout);\n        setScrollbars();\n        mSwipeRefreshLayout.setEnabled(false);\n\n        if (mRecyclerView != null) {\n            mRecyclerView.setClipToPadding(mClipToPadding);\n            if (mPadding != -1.1f) {\n                mRecyclerView.setPadding(mPadding, mPadding, mPadding, mPadding);\n            } else {\n                mRecyclerView.setPadding(mPaddingLeft, mPaddingTop, mPaddingRight, mPaddingBottom);\n            }\n        }\n\n        defaultFloatingActionButton = (FloatingActionButton) view.findViewById(R.id.defaultFloatingActionButton);\n        setDefaultScrollListener();\n\n        /**\n         * empty view setup\n         */\n        mEmpty = (ViewStub) view.findViewById(R.id.emptyview);\n        if (mEmptyId != 0) {\n            mEmpty.setLayoutResource(mEmptyId);\n            mEmptyView = mEmpty.inflate();\n            mEmpty.setVisibility(View.GONE);\n        }\n\n        /**\n         * floating button setup\n         */\n        mFloatingButtonViewStub = (ViewStub) view.findViewById(R.id.floatingActionViewStub);\n        mFloatingButtonViewStub.setLayoutResource(mFloatingButtonId);\n    }\n\n    /**\n     * retrieve the empty view from the core\n     *\n     * @return the view item\n     */\n    public View getEmptyView() {\n        return mEmptyView;\n    }\n\n    private void setPolicies(final int policyEmtpyView, final int policyInitialization) {\n        //  setPolices(policyEmtpyView, policyInitialization);\n        policy_empty = policyEmtpyView;\n        policy_init = policyInitialization;\n    }\n\n    public void setInflater(LayoutInflater inflater) {\n        this.inflater = inflater;\n    }\n\n    private void setEmptyView(@LayoutRes final int emptyResourceId) {\n        if (mEmptyView == null && emptyResourceId > 0) {\n            mEmptyId = emptyResourceId;\n            mEmpty.setLayoutResource(emptyResourceId);\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {\n                mEmpty.setLayoutInflater(inflater);\n            }\n            mEmptyView = mEmpty.inflate();\n        } else {\n            Log.d(VIEW_LOG_TAG, \"unabled to set empty view because the empty has been set\");\n        }\n    }\n\n    private void setEmptyView(@Nullable View mInflatedView) {\n        if (mInflatedView != null)\n            mEmptyView = mInflatedView;\n    }\n\n    /**\n     * Set custom empty view.The view will be shown if the adapter is null or the size of the adapter is zero.\n     * You can customize it as loading view.\n     *\n     * @param emptyResourceId the Resource Id from the empty view\n     * @param emptyViewPolicy the Resource Id from the empty view\n     */\n    public final void setEmptyView(@LayoutRes int emptyResourceId, final int emptyViewPolicy) {\n        //  mEmptyViewPolicy = emptyViewPolicy;\n        setEmptyView(emptyResourceId);\n        setPolicies(emptyViewPolicy, UltimateRecyclerView.STARTWITH_OFFLINE_ITEMS);\n        mEmpty.setVisibility(View.GONE);\n    }\n\n    public final void setEmptyView(@LayoutRes int emptyResourceId, final int emptyViewPolicy, final int mEmptyViewInitPolicy) {\n        setEmptyView(emptyResourceId);\n        setPolicies(emptyViewPolicy, mEmptyViewInitPolicy);\n    }\n\n    public final void setEmptyView(@LayoutRes int emptyResourceId, final int emptyViewPolicy, final emptyViewOnShownListener listener) {\n        setEmptyView(emptyResourceId);\n        setPolicies(emptyViewPolicy, UltimateRecyclerView.STARTWITH_OFFLINE_ITEMS);\n        mEmptyViewListener = listener;\n    }\n\n    public final void setEmptyView(@LayoutRes int emptyResourceId, final int emptyViewPolicy, final int emptyViewInitPolicy, final emptyViewOnShownListener listener) {\n        setEmptyView(emptyResourceId);\n        setPolicies(emptyViewPolicy, emptyViewInitPolicy);\n        mEmptyViewListener = listener;\n    }\n\n    /**\n     * Show the custom or default empty view\n     * You can customize it as loading view\n     *\n     * @return is the empty shown\n     */\n    public boolean showEmptyView() {\n        if (mEmpty != null && mEmptyView != null && mAdapter != null) {\n            if (mAdapter.getEmptyViewPolicy() == EMPTY_CLEAR_ALL || mAdapter.getEmptyViewPolicy() == EMPTY_KEEP_HEADER) {\n                mEmpty.setVisibility(View.VISIBLE);\n                if (mEmptyViewListener != null) {\n                    mEmptyViewListener.onEmptyViewShow(mEmptyView);\n                }\n            }\n            return true;\n        } else {\n            Log.d(VIEW_LOG_TAG, \"it is unable to show empty view\");\n            return false;\n        }\n    }\n\n    /**\n     * Hide the custom or default empty view\n     */\n    public void hideEmptyView() {\n        if (mEmpty != null && mEmptyView != null) {\n            mEmpty.setVisibility(View.GONE);\n        } else {\n            Log.d(VIEW_LOG_TAG, \"there is no such empty view\");\n        }\n    }\n\n    public void setLoadMoreView(View mlayoutView) {\n        if (mLoadMoreView != null) {\n            Log.d(VIEW_LOG_TAG, \"The loading more layout has already been initiated.\");\n            return;\n        }\n        if (mlayoutView == null) {\n            mLoadMoreView = LayoutInflater.from(getContext()).inflate(R.layout.bottom_progressbar, null);\n            Log.d(VIEW_LOG_TAG, \"Layout Resource view is null. This system will use the default loading view instead.\");\n        } else {\n            mLoadMoreView = mlayoutView;\n        }\n    }\n\n    /**\n     * setting up the loading more layout\n     *\n     * @param layout the res layout\n     */\n    public void setLoadMoreView(@LayoutRes final int layout) {\n        if (layout > 0) {\n            mLoadMoreView = LayoutInflater.from(getContext()).inflate(layout, null);\n        } else {\n            Log.d(VIEW_LOG_TAG, \"Layout Resource Id is not found for load more view for ulitmaterecyclerview\");\n        }\n    }\n\n    /**\n     * Show the custom floating button view.\n     */\n    public void showFloatingButtonView() {\n        if (mFloatingButtonId != 0 && mFloatingButtonView == null) {\n            mFloatingButtonView = mFloatingButtonViewStub.inflate();\n            mFloatingButtonView.setVisibility(View.VISIBLE);\n        } else {\n            Log.d(VIEW_LOG_TAG, \"floating button cannot be inflated because it has inflated already\");\n        }\n    }\n\n    /**\n     * Add ScrollBar of Recyclerview\n     */\n    protected void setScrollbars() {\n        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n        switch (mScrollbarsStyle) {\n            case SCROLLBARS_VERTICAL:\n                mSwipeRefreshLayout.removeView(mRecyclerView);\n                View verticalView = inflater.inflate(R.layout.vertical_recycler_view, mSwipeRefreshLayout, true);\n                mRecyclerView = (RecyclerView) verticalView.findViewById(R.id.ultimate_list);\n                break;\n            case SCROLLBARS_HORIZONTAL:\n                mSwipeRefreshLayout.removeView(mRecyclerView);\n                View horizontalView = inflater.inflate(R.layout.horizontal_recycler_view, mSwipeRefreshLayout, true);\n                mRecyclerView = (RecyclerView) horizontalView.findViewById(R.id.ultimate_list);\n                break;\n            default:\n                break;\n        }\n    }\n\n    protected void initAttrs(AttributeSet attrs) {\n        TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.UltimateRecyclerview);\n\n        try {\n            mPadding = (int) typedArray.getDimension(R.styleable.UltimateRecyclerview_recyclerviewPadding, -1.1f);\n            mPaddingTop = (int) typedArray.getDimension(R.styleable.UltimateRecyclerview_recyclerviewPaddingTop, 0.0f);\n            mPaddingBottom = (int) typedArray.getDimension(R.styleable.UltimateRecyclerview_recyclerviewPaddingBottom, 0.0f);\n            mPaddingLeft = (int) typedArray.getDimension(R.styleable.UltimateRecyclerview_recyclerviewPaddingLeft, 0.0f);\n            mPaddingRight = (int) typedArray.getDimension(R.styleable.UltimateRecyclerview_recyclerviewPaddingRight, 0.0f);\n            mClipToPadding = typedArray.getBoolean(R.styleable.UltimateRecyclerview_recyclerviewClipToPadding, false);\n            mEmptyId = typedArray.getResourceId(R.styleable.UltimateRecyclerview_recyclerviewEmptyView, 0);\n            mFloatingButtonId = typedArray.getResourceId(R.styleable.UltimateRecyclerview_recyclerviewFloatingActionView, 0);\n            mScrollbarsStyle = typedArray.getInt(R.styleable.UltimateRecyclerview_recyclerviewScrollbars, SCROLLBARS_NONE);\n            int colorList = typedArray.getResourceId(R.styleable.UltimateRecyclerview_recyclerviewDefaultSwipeColor, 0);\n            if (colorList != 0) {\n                defaultSwipeToDismissColors = getResources().getIntArray(colorList);\n            }\n            //mEmptyViewPolicy = EMPTY_VIEW_POLICY_EMPTY_SHOW;\n        } finally {\n            typedArray.recycle();\n        }\n    }\n\n\n    private void setObserableScrollListener() {\n        mRecyclerView.removeOnScrollListener(mOnScrollListener);\n        mOnScrollListener = new RecyclerView.OnScrollListener() {\n            @Override\n            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {\n                super.onScrolled(recyclerView, dx, dy);\n                enableShoworHideToolbarAndFloatingButton(recyclerView);\n            }\n        };\n        mRecyclerView.addOnScrollListener(mOnScrollListener);\n    }\n\n    private int[] mlastPositionsStaggeredGridLayout;\n\n    private void scroll_load_more_detection(RecyclerView recyclerView) {\n\n        RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();\n\n        if (layoutManagerType == null) {\n            if (layoutManager instanceof GridLayoutManager) {\n                layoutManagerType = LAYOUT_MANAGER_TYPE.GRID;\n            } else if (layoutManager instanceof StaggeredGridLayoutManager) {\n                layoutManagerType = LAYOUT_MANAGER_TYPE.STAGGERED_GRID;\n            } else if (layoutManager instanceof LinearLayoutManager) {\n                layoutManagerType = LAYOUT_MANAGER_TYPE.LINEAR;\n            } else {\n                throw new RuntimeException(\"Unsupported LayoutManager used. Valid ones are LinearLayoutManager, GridLayoutManager and StaggeredGridLayoutManager\");\n            }\n        }\n\n        mTotalItemCount = layoutManager.getItemCount();\n        mVisibleItemCount = layoutManager.getChildCount();\n\n        switch (layoutManagerType) {\n            case LINEAR:\n                mFirstVisibleItem = mRecyclerViewHelper.findFirstVisibleItemPosition();\n                lastVisibleItemPosition = mRecyclerViewHelper.findLastVisibleItemPosition();\n                break;\n            case GRID:\n                if (layoutManager instanceof GridLayoutManager) {\n                    GridLayoutManager ly = (GridLayoutManager) layoutManager;\n                    lastVisibleItemPosition = ly.findLastVisibleItemPosition();\n                    mFirstVisibleItem = ly.findFirstVisibleItemPosition();\n                }\n                break;\n            case STAGGERED_GRID:\n                if (layoutManager instanceof StaggeredGridLayoutManager) {\n                    StaggeredGridLayoutManager sy = (StaggeredGridLayoutManager) layoutManager;\n\n                    if (mlastPositionsStaggeredGridLayout == null)\n                        mlastPositionsStaggeredGridLayout = new int[sy.getSpanCount()];\n\n                    sy.findLastVisibleItemPositions(mlastPositionsStaggeredGridLayout);\n                    lastVisibleItemPosition = findMax(mlastPositionsStaggeredGridLayout);\n\n                    sy.findFirstVisibleItemPositions(mlastPositionsStaggeredGridLayout);\n                    mFirstVisibleItem = findMin(mlastPositionsStaggeredGridLayout);\n                }\n                break;\n        }\n\n        if (automaticLoadMoreEnabled) {\n\n            if (mTotalItemCount > previousTotal) {\n                automaticLoadMoreEnabled = false;\n                previousTotal = mTotalItemCount;\n            }\n        }\n\n        boolean bottomEdgeHit = (mTotalItemCount - mVisibleItemCount) <= mFirstVisibleItem;\n\n        if (bottomEdgeHit) {\n            if (mIsLoadMoreWidgetEnabled) {\n                /**auto activate load more**/\n                if (!automaticLoadMoreEnabled) {\n                    onLoadMoreListener.loadMore(mRecyclerView.getAdapter().getItemCount(), lastVisibleItemPosition);\n                    automaticLoadMoreEnabled = true;\n                }\n            }\n            mAdapter.internalExecuteLoadingView();\n            previousTotal = mTotalItemCount;\n        }\n    }\n\n    protected void setDefaultScrollListener() {\n        mRecyclerView.removeOnScrollListener(mOnScrollListener);\n        mOnScrollListener = new RecyclerView.OnScrollListener() {\n\n            @Override\n            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {\n                super.onScrolled(recyclerView, dx, dy);\n                if (mHeader != null) {\n                    mTotalYScrolled += dy;\n                    if (isParallaxHeader)\n                        translateHeader(mTotalYScrolled);\n                }\n\n                scroll_load_more_detection(recyclerView);\n\n                enableShoworHideToolbarAndFloatingButton(recyclerView);\n            }\n        };\n\n        mRecyclerView.addOnScrollListener(mOnScrollListener);\n    }\n\n\n    /**\n     * If you have used {@link #disableLoadmore()} and want to enable loading more again,you can use this method.\n     */\n    public void reenableLoadmore() {\n        if (mAdapter != null && mLoadMoreView != null) {\n            mAdapter.enableLoadMore(true);\n        }\n        mIsLoadMoreWidgetEnabled = true;\n    }\n\n    public boolean isLoadMoreEnabled() {\n        return mIsLoadMoreWidgetEnabled;\n    }\n\n    /**\n     * Remove loading more scroll listener\n     */\n    public void disableLoadmore() {\n        mIsLoadMoreWidgetEnabled = false;\n        if (mAdapter != null && mLoadMoreView != null) {\n            mAdapter.enableLoadMore(false);\n        }\n    }\n\n\n    protected void enableShoworHideToolbarAndFloatingButton(RecyclerView recyclerView) {\n        if (mCallbacks != null) {\n            if (getChildCount() > 0) {\n                int firstVisiblePosition = recyclerView.getChildAdapterPosition(recyclerView.getChildAt(0));\n                int lastVisiblePosition = recyclerView.getChildAdapterPosition(recyclerView.getChildAt(recyclerView.getChildCount() - 1));\n                try {\n                    for (int i = firstVisiblePosition, j = 0; i <= lastVisiblePosition; i++, j++) {\n                        int childHeight = 0;\n                        View child = recyclerView.getChildAt(j);\n                        if (mChildrenHeights.indexOfKey(i) < 0 || (child != null && child.getHeight() != mChildrenHeights.get(i))) {\n                            if (child != null)\n                                childHeight = child.getHeight();\n                        }\n                        mChildrenHeights.put(i, childHeight);\n                    }\n\n                } catch (NullPointerException e) {\n                    e.printStackTrace();\n                    //todo: need to solve this issue when the first child is missing from the scroll. Please also see the debug from the RV error.\n                    //todo: 07-01 11:50:36.359  32348-32348/com.marshalchen.ultimaterecyclerview.demo D/RVerror? Attempt to invoke virtual method 'int android.view.View.getHeight()' on a null object reference\n                    URLogs.e(e, \"\");\n                }\n\n                View firstVisibleChild = recyclerView.getChildAt(0);\n                if (firstVisibleChild != null) {\n                    if (mPrevFirstVisiblePosition < firstVisiblePosition) {\n                        // scroll down\n                        int skippedChildrenHeight = 0;\n                        if (firstVisiblePosition - mPrevFirstVisiblePosition != 1) {\n                            for (int i = firstVisiblePosition - 1; i > mPrevFirstVisiblePosition; i--) {\n                                if (0 < mChildrenHeights.indexOfKey(i)) {\n                                    skippedChildrenHeight += mChildrenHeights.get(i);\n                                } else {\n                                    // Approximate each item's height to the first visible child.\n                                    // It may be incorrect, but without this, scrollY will be broken\n                                    // when scrolling from the bottom.\n                                    skippedChildrenHeight += firstVisibleChild.getHeight();\n                                }\n                            }\n                        }\n                        mPrevScrolledChildrenHeight += mPrevFirstVisibleChildHeight + skippedChildrenHeight;\n                        mPrevFirstVisibleChildHeight = firstVisibleChild.getHeight();\n                    } else if (firstVisiblePosition < mPrevFirstVisiblePosition) {\n                        // scroll up\n                        int skippedChildrenHeight = 0;\n                        if (mPrevFirstVisiblePosition - firstVisiblePosition != 1) {\n                            for (int i = mPrevFirstVisiblePosition - 1; i > firstVisiblePosition; i--) {\n                                if (0 < mChildrenHeights.indexOfKey(i)) {\n                                    skippedChildrenHeight += mChildrenHeights.get(i);\n                                } else {\n                                    // Approximate each item's height to the first visible child.\n                                    // It may be incorrect, but without this, scrollY will be broken\n                                    // when scrolling from the bottom.\n                                    skippedChildrenHeight += firstVisibleChild.getHeight();\n                                }\n                            }\n                        }\n                        mPrevScrolledChildrenHeight -= firstVisibleChild.getHeight() + skippedChildrenHeight;\n                        mPrevFirstVisibleChildHeight = firstVisibleChild.getHeight();\n                    } else if (firstVisiblePosition == 0) {\n                        mPrevFirstVisibleChildHeight = firstVisibleChild.getHeight();\n                        mPrevScrolledChildrenHeight = 0;\n                    }\n                    if (mPrevFirstVisibleChildHeight < 0) {\n                        mPrevFirstVisibleChildHeight = 0;\n                    }\n                    mScrollY = mPrevScrolledChildrenHeight - firstVisibleChild.getTop();\n                    mPrevFirstVisiblePosition = firstVisiblePosition;\n\n                    mCallbacks.onScrollChanged(mScrollY, mFirstScroll, mDragging);\n\n                    if (mPrevScrollY < mScrollY) {\n                        //down\n                        if (mFirstScroll) { // first scroll down , mPrevScrollY == 0, reach here.\n                            mFirstScroll = false;\n                            mObservableScrollState = ObservableScrollState.STOP;\n                        }\n                        mObservableScrollState = ObservableScrollState.UP;\n                    } else if (mScrollY < mPrevScrollY) {\n                        //up\n                        mObservableScrollState = ObservableScrollState.DOWN;\n                    } else {\n                        mObservableScrollState = ObservableScrollState.STOP;\n                    }\n                    if (mFirstScroll) {\n                        mFirstScroll = false;\n                    }\n                    mPrevScrollY = mScrollY;\n                }\n            }\n        }\n    }\n\n    /**\n     * Set a listener that will be notified of any changes in scroll state or position.\n     *\n     * @param customOnScrollListener to set or null to clear\n     * @deprecated Use {@link #addOnScrollListener(RecyclerView.OnScrollListener)} and\n     * {@link #removeOnScrollListener(RecyclerView.OnScrollListener)}\n     */\n    public void setOnScrollListener(RecyclerView.OnScrollListener customOnScrollListener) {\n        mRecyclerView.setOnScrollListener(customOnScrollListener);\n    }\n\n    public void addOnScrollListener(RecyclerView.OnScrollListener customOnScrollListener) {\n        mRecyclerView.addOnScrollListener(customOnScrollListener);\n    }\n\n    public void removeOnScrollListener(RecyclerView.OnScrollListener customOnScrollListener) {\n        mRecyclerView.removeOnScrollListener(customOnScrollListener);\n    }\n\n    public void addItemDividerDecoration(Context context) {\n        RecyclerView.ItemDecoration itemDecoration =\n                new DividerItemDecoration(context, DividerItemDecoration.VERTICAL_LIST);\n        mRecyclerView.addItemDecoration(itemDecoration);\n    }\n\n\n    /**\n     * Swaps the current adapter with the provided one. It is similar to\n     * {@link #setAdapter(UltimateViewAdapter)} but assumes existing adapter and the new adapter uses the same\n     * ViewHolder and does not clear the RecycledViewPool.\n     * Note that it still calls onAdapterChanged callbacks.\n     *\n     * @param adapter                       The new adapter to set, or null to set no adapter.\n     * @param removeAndRecycleExistingViews If set to true, RecyclerView will recycle all existing Views. If adapters have stable ids and/or you want to animate the disappearing views, you may prefer to set this to false.\n     */\n    public void swapAdapter(UltimateViewAdapter adapter, boolean removeAndRecycleExistingViews) {\n        mRecyclerView.swapAdapter(adapter, removeAndRecycleExistingViews);\n        setAdapterInternal(adapter);\n    }\n\n    public void setAdapter(UltimateViewAdapter adapter) {\n        mRecyclerView.setAdapter(adapter);\n        setAdapterInternal(adapter);\n    }\n\n    /**\n     * Add an {@link RecyclerView.ItemDecoration} to this RecyclerView. Item decorations can affect both measurement and drawing of individual item views. Item decorations are ordered. Decorations placed earlier in the list will be run/queried/drawn first for their effects on item views. Padding added to views will be nested; a padding added by an earlier decoration will mean further item decorations in the list will be asked to draw/pad within the previous decoration's given area.\n     *\n     * @param itemDecoration Decoration to add\n     */\n    public void addItemDecoration(RecyclerView.ItemDecoration itemDecoration) {\n        mRecyclerView.addItemDecoration(itemDecoration);\n    }\n\n    /**\n     * Add an {@link RecyclerView.ItemDecoration} to this RecyclerView. Item decorations can affect both measurement and drawing of individual item views.\n     * <p>Item decorations are ordered. Decorations placed earlier in the list will be run/queried/drawn first for their effects on item views. Padding added to views will be nested; a padding added by an earlier decoration will mean further item decorations in the list will be asked to draw/pad within the previous decoration's given area.</p>\n     *\n     * @param itemDecoration Decoration to add\n     * @param index          Position in the decoration chain to insert this decoration at. If this value is negative the decoration will be added at the end.\n     */\n    public void addItemDecoration(RecyclerView.ItemDecoration itemDecoration, int index) {\n        mRecyclerView.addItemDecoration(itemDecoration, index);\n    }\n\n    /**\n     * Sets the {@link RecyclerView.ItemAnimator} that will handle animations involving changes\n     * to the items in this RecyclerView. By default, RecyclerView instantiates and\n     * uses an instance of {@link DefaultItemAnimator}. Whether item animations are enabled for the RecyclerView depends on the ItemAnimator and whether\n     * the LayoutManager {@link RecyclerView.LayoutManager#supportsPredictiveItemAnimations()\n     * supports item animations}.\n     *\n     * @param animator The ItemAnimator being set. If null, no animations will occur\n     *                 when changes occur to the items in this RecyclerView.\n     */\n    public void setItemAnimator(RecyclerView.ItemAnimator animator) {\n        mRecyclerView.setItemAnimator(animator);\n    }\n\n    /**\n     * Gets the current ItemAnimator for this RecyclerView. A null return value\n     * indicates that there is no animator and that item changes will happen without\n     * any animations. By default, RecyclerView instantiates and\n     * uses an instance of {@link DefaultItemAnimator}.\n     *\n     * @return ItemAnimator The current ItemAnimator. If null, no animations will occur\n     * when changes occur to the items in this RecyclerView.\n     */\n    public RecyclerView.ItemAnimator getItemAnimator() {\n        return mRecyclerView.getItemAnimator();\n    }\n\n    /**\n     * Set the listener when refresh is triggered and enable the SwipeRefreshLayout\n     *\n     * @param listener SwipeRefreshLayout\n     */\n    public void setDefaultOnRefreshListener(SwipeRefreshLayout.OnRefreshListener listener) {\n\n        mSwipeRefreshLayout.setEnabled(true);\n        if (defaultSwipeToDismissColors != null && defaultSwipeToDismissColors.length > 0) {\n            mSwipeRefreshLayout.setColorSchemeColors(defaultSwipeToDismissColors);\n        } else {\n            mSwipeRefreshLayout.setColorSchemeResources(\n                    android.R.color.holo_blue_bright,\n                    android.R.color.holo_green_light,\n                    android.R.color.holo_orange_light,\n                    android.R.color.holo_red_light);\n\n        }\n\n        mSwipeRefreshLayout.setOnRefreshListener(listener);\n    }\n\n    /**\n     * Set the color resources used in the progress animation from color resources. The first color will also be the color of the bar that grows in response to a user swipe gesture.\n     *\n     * @param colors colors in array\n     */\n    public void setDefaultSwipeToRefreshColorScheme(int... colors) {\n        mSwipeRefreshLayout.setColorSchemeColors(colors);\n    }\n\n    /**\n     * Set the load more listener of recyclerview\n     *\n     * @param onLoadMoreListener load listen\n     */\n    public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) {\n        this.onLoadMoreListener = onLoadMoreListener;\n    }\n\n\n    /**\n     * Set the layout manager to the recycler\n     *\n     * @param manager lm\n     */\n    public void setLayoutManager(RecyclerView.LayoutManager manager) {\n        mRecyclerView.setLayoutManager(manager);\n    }\n\n    /**\n     * Get the adapter of UltimateRecyclerview\n     *\n     * @return ad\n     */\n    public RecyclerView.Adapter getAdapter() {\n        return mRecyclerView.getAdapter();\n    }\n\n\n    /**\n     * Set a UltimateViewAdapter or the subclass of UltimateViewAdapter to the recyclerview\n     *\n     * @param adapter the adapter in normal\n     */\n    private void setAdapterInternal(UltimateViewAdapter adapter) {\n        mAdapter = adapter;\n        if (mSwipeRefreshLayout != null)\n            mSwipeRefreshLayout.setRefreshing(false);\n        if (mAdapter != null)\n            mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {\n                @Override\n                public void onItemRangeChanged(int positionStart, int itemCount) {\n                    super.onItemRangeChanged(positionStart, itemCount);\n                    updateHelperDisplays();\n                }\n\n                @Override\n                public void onItemRangeInserted(int positionStart, int itemCount) {\n                    super.onItemRangeInserted(positionStart, itemCount);\n                    updateHelperDisplays();\n                }\n\n                @Override\n                public void onItemRangeRemoved(int positionStart, int itemCount) {\n                    super.onItemRangeRemoved(positionStart, itemCount);\n                    updateHelperDisplays();\n                }\n\n                @Override\n                public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {\n                    super.onItemRangeMoved(fromPosition, toPosition, itemCount);\n                    updateHelperDisplays();\n                }\n\n                @Override\n                public void onChanged() {\n                    super.onChanged();\n                    updateHelperDisplays();\n                }\n            });\n\n        mRecyclerViewHelper = RecyclerViewPositionHelper.createHelper(mRecyclerView);\n\n        mAdapter.setEmptyViewPolicy(policy_empty);\n        mAdapter.setEmptyViewOnInitPolicy(policy_init);\n\n        if (mAdapter.getAdapterItemCount() == 0 && policy_init == UltimateRecyclerView.STARTWITH_OFFLINE_ITEMS) {\n            showEmptyView();\n        }\n\n        if (policy_init == UltimateRecyclerView.STARTWITH_ONLINE_ITEMS) {\n            hideEmptyView();\n        }\n\n        if (mAdapter.getCustomLoadMoreView() == null && mLoadMoreView != null) {\n            mAdapter.setCustomLoadMoreView(mLoadMoreView);\n            mAdapter.enableLoadMore(true);\n            mAdapter.notifyDataSetChanged();\n            mIsLoadMoreWidgetEnabled = true;\n        }\n\n        if (mHeader != null) {\n            mAdapter.setCustomHeaderView(mHeader);\n            //getLayoutManager().ignoreView(mHeader);\n        }\n    }\n\n\n    private void updateHelperDisplays() {\n        automaticLoadMoreEnabled = false;\n        if (mSwipeRefreshLayout != null)\n            mSwipeRefreshLayout.setRefreshing(false);\n        if (mAdapter == null)\n            return;\n        /**\n         * fixed by jjHesk\n         * + empty layout is NONE\n         * + getItemCount is zero\n         */\n        if (!isFirstLoadingOnlineAdapter) {\n            isFirstLoadingOnlineAdapter = true;\n            if (mAdapter.getAdapterItemCount() == 0) {\n\n                mEmpty.setVisibility(mEmptyView == null ? View.VISIBLE : View.GONE);\n\n\n            } else if (mEmptyId != 0) {\n                implementLoadMorebehavior();\n                mEmpty.setVisibility(View.GONE);\n            }\n        } else {\n            //isFirstLoadingOnlineAdapter = false;\n            setRefreshing(false);\n            implementLoadMorebehavior();\n        }\n\n    }\n\n    private void implementLoadMorebehavior() {\n        if (mAdapter.getCustomLoadMoreView() != null) {\n            if (mAdapter.enableLoadMore()) {\n                mAdapter.getCustomLoadMoreView().setVisibility(View.VISIBLE);\n            } else {\n                mAdapter.getCustomLoadMoreView().setVisibility(View.GONE);\n            }\n        }\n    }\n\n    public void setHasFixedSize(boolean hasFixedSize) {\n        mRecyclerView.setHasFixedSize(hasFixedSize);\n    }\n\n    /**\n     * Notify the widget that refresh state has changed. Do not call this when refresh is triggered by a swipe gesture.\n     *\n     * @param refreshing enable the refresh loading icon\n     */\n    public void setRefreshing(boolean refreshing) {\n        if (mSwipeRefreshLayout != null)\n            mSwipeRefreshLayout.setRefreshing(refreshing);\n    }\n\n\n    /**\n     * Enable or disable the SwipeRefreshLayout.\n     * Default is false\n     *\n     * @param isSwipeRefresh is now operating in refresh\n     */\n    public void enableDefaultSwipeRefresh(boolean isSwipeRefresh) {\n        if (mSwipeRefreshLayout != null)\n            mSwipeRefreshLayout.setEnabled(isSwipeRefresh);\n    }\n\n\n    public interface OnLoadMoreListener {\n        void loadMore(int itemsCount, final int maxLastVisiblePosition);\n    }\n\n    public enum LAYOUT_MANAGER_TYPE {\n        LINEAR,\n        GRID,\n        STAGGERED_GRID,\n        PUZZLE,\n    }\n\n    private int findMax(int[] lastPositions) {\n        int max = Integer.MIN_VALUE;\n        for (int value : lastPositions) {\n            if (value > max)\n                max = value;\n        }\n        return max;\n    }\n\n    private int findMin(int[] lastPositions) {\n        int min = Integer.MAX_VALUE;\n        for (int value : lastPositions) {\n            if (value != RecyclerView.NO_POSITION && value < min)\n                min = value;\n        }\n        return min;\n    }\n\n\n    /**\n     * allow resource layout id to be introduced\n     *\n     * @param mLayout res id\n     */\n    public void setParallaxHeader(@LayoutRes int mLayout) {\n        View h_layout = LayoutInflater.from(getContext()).inflate(mLayout, null);\n        setParallaxHeader(h_layout);\n    }\n\n    /**\n     * Set the parallax header of the recyclerview\n     *\n     * @param header the view\n     */\n    public void setParallaxHeader(View header) {\n        mHeader = new CustomRelativeWrapper(header.getContext());\n        mHeader.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));\n        mHeader.addView(header, new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));\n        isParallaxHeader = true;\n    }\n\n\n    /**\n     * Set the normal header of the recyclerview\n     *\n     * @param header na\n     */\n    public void setNormalHeader(View header) {\n        setParallaxHeader(header);\n        isParallaxHeader = false;\n    }\n\n    /**\n     * Set the on scroll method of parallax header\n     *\n     * @param parallaxScroll na\n     */\n    public void setOnParallaxScroll(OnParallaxScroll parallaxScroll) {\n        mParallaxScroll = parallaxScroll;\n        mParallaxScroll.onParallaxScroll(0, 0, mHeader);\n    }\n\n\n    private float mScrollMultiplier = 0.5f;\n\n    /**\n     * Translates the adapter in Y\n     *\n     * @param of offset in px\n     */\n    public void translateHeader(float of) {\n        float ofCalculated = of * mScrollMultiplier;\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB && of < mHeader.getHeight()) {\n            mHeader.setTranslationY(ofCalculated);\n        } else if (of < mHeader.getHeight()) {\n            TranslateAnimation anim = new TranslateAnimation(0, 0, ofCalculated, ofCalculated);\n            anim.setFillAfter(true);\n            anim.setDuration(0);\n            mHeader.startAnimation(anim);\n        }\n        mHeader.setClipY(Math.round(ofCalculated));\n        if (mParallaxScroll != null) {\n            final RecyclerView.ViewHolder holder = mRecyclerView.findViewHolderForAdapterPosition(0);\n            float left;\n            if (holder != null) {\n                left = Math.min(1, ((ofCalculated) / (mHeader.getHeight() * mScrollMultiplier)));\n            }else {\n                left = 1;\n            }\n            mParallaxScroll.onParallaxScroll(left, of, mHeader);\n        }\n    }\n\n    /**\n     * Set parallax scroll multiplier.\n     *\n     * @param mul The multiplier\n     */\n    public void setScrollMultiplier(float mul) {\n        this.mScrollMultiplier = mul;\n    }\n\n    /**\n     * Get the current parallax scroll multiplier.\n     *\n     */\n    public float getScrollMultiplier() {\n        return this.mScrollMultiplier;\n    }\n\n\n    public interface OnParallaxScroll {\n        void onParallaxScroll(float percentage, float offset, View parallax);\n    }\n\n    /**\n     * Custom layout for the Parallax Header.\n     */\n    public static class CustomRelativeWrapper extends RelativeLayout {\n\n        private int mOffset;\n\n        public CustomRelativeWrapper(Context context) {\n            super(context);\n        }\n\n        @Override\n        protected void dispatchDraw(Canvas canvas) {\n            if (isParallaxHeader)\n                canvas.clipRect(new Rect(getLeft(), getTop(), getRight(), getBottom() + mOffset));\n            super.dispatchDraw(canvas);\n        }\n\n        public void setClipY(int offset) {\n            mOffset = offset;\n            invalidate();\n        }\n\n    }\n\n    /**\n     * the observable scroll view call backs\n     *\n     * @param listener listener to set\n     */\n    public void setScrollViewCallbacks(ObservableScrollViewCallbacks listener) {\n        mCallbacks = listener;\n    }\n\n    public void setItemViewCacheSize(final int off_screen_items) {\n        mRecyclerView.setItemViewCacheSize(off_screen_items);\n    }\n\n    @Override\n    public void onRestoreInstanceState(Parcelable state) {\n        SavedStateScrolling ss = (SavedStateScrolling) state;\n        mPrevFirstVisiblePosition = ss.prevFirstVisiblePosition;\n        mPrevFirstVisibleChildHeight = ss.prevFirstVisibleChildHeight;\n        mPrevScrolledChildrenHeight = ss.prevScrolledChildrenHeight;\n        mPrevScrollY = ss.prevScrollY;\n        mScrollY = ss.scrollY;\n        mChildrenHeights = ss.childrenHeights;\n        RecyclerView.LayoutManager layoutManager = getLayoutManager();\n\n        /**\n         * enhanced and store the previous scroll position\n         */\n        if (layoutManager != null) {\n            int count = layoutManager.getChildCount();\n            if (mPrevScrollY != RecyclerView.NO_POSITION && mPrevScrollY < count) {\n                layoutManager.scrollToPosition(mPrevScrollY);\n            }\n        }\n\n        super.onRestoreInstanceState(ss.getSuperState());\n    }\n\n    @Override\n    public Parcelable onSaveInstanceState() {\n        Parcelable superState = super.onSaveInstanceState();\n        SavedStateScrolling ss = new SavedStateScrolling(superState);\n        ss.prevFirstVisiblePosition = mPrevFirstVisiblePosition;\n        ss.prevFirstVisibleChildHeight = mPrevFirstVisibleChildHeight;\n        ss.prevScrolledChildrenHeight = mPrevScrolledChildrenHeight;\n        ss.prevScrollY = mPrevScrollY;\n        ss.scrollY = mScrollY;\n        ss.childrenHeights = mChildrenHeights;\n        return ss;\n    }\n\n    @Override\n    public boolean onInterceptTouchEvent(MotionEvent ev) {\n        if (mCallbacks != null) {\n            switch (ev.getActionMasked()) {\n                case MotionEvent.ACTION_DOWN:\n                    mFirstScroll = mDragging = true;\n                    mCallbacks.onDownMotionEvent();\n                    break;\n                case MotionEvent.ACTION_UP:\n                case MotionEvent.ACTION_CANCEL:\n                    mIntercepted = false;\n                    mDragging = false;\n                    mCallbacks.onUpOrCancelMotionEvent(mObservableScrollState);\n                    break;\n            }\n        }\n        return super.onInterceptTouchEvent(ev);\n\n    }\n\n\n    @Override\n    public void setTouchInterceptionViewGroup(ViewGroup viewGroup) {\n        mTouchInterceptionViewGroup = viewGroup;\n        setObserableScrollListener();\n    }\n\n    @Override\n    public void scrollVerticallyTo(int y) {\n        URLogs.d(\"vertically\");\n        View firstVisibleChild = getChildAt(0);\n        if (firstVisibleChild != null) {\n            int baseHeight = firstVisibleChild.getHeight();\n            int position = y / baseHeight;\n            scrollVerticallyToPosition(position);\n        }\n    }\n\n    public void scrollVerticallyToPosition(int position) {\n        RecyclerView.LayoutManager lm = getLayoutManager();\n\n        if (lm != null && lm instanceof LinearLayoutManager) {\n            ((LinearLayoutManager) lm).scrollToPositionWithOffset(position, 0);\n        } else {\n            lm.scrollToPosition(position);\n        }\n    }\n\n    @Override\n    public int getCurrentScrollY() {\n        return mScrollY;\n    }\n\n    @Override\n    public boolean onTouchEvent(MotionEvent ev) {\n        URLogs.d(\"ev---\" + ev);\n        if (mCallbacks != null) {\n\n            switch (ev.getActionMasked()) {\n                case MotionEvent.ACTION_UP:\n                case MotionEvent.ACTION_CANCEL:\n                    mIntercepted = false;\n                    mDragging = false;\n                    mCallbacks.onUpOrCancelMotionEvent(mObservableScrollState);\n                    break;\n                case MotionEvent.ACTION_MOVE:\n                    if (mPrevMoveEvent == null) {\n                        mPrevMoveEvent = ev;\n                    }\n                    float diffY = ev.getY() - mPrevMoveEvent.getY();\n                    mPrevMoveEvent = MotionEvent.obtainNoHistory(ev);\n                    if (getCurrentScrollY() - diffY <= 0) {\n                        // Can't scroll anymore.\n\n                        if (mIntercepted) {\n                            // Already dispatched ACTION_DOWN event to parents, so stop here.\n                            return false;\n                        }\n\n                        // Apps can set the interception target other than the direct parent.\n                        final ViewGroup parent;\n                        if (mTouchInterceptionViewGroup == null) {\n                            parent = (ViewGroup) getParent();\n                        } else {\n                            parent = mTouchInterceptionViewGroup;\n                        }\n\n                        // Get offset to parents. If the parent is not the direct parent,\n                        // we should aggregate offsets from all of the parents.\n                        float offsetX = 0;\n                        float offsetY = 0;\n                        for (View v = this; v != null && v != parent; v = (View) v.getParent()) {\n                            offsetX += v.getLeft() - v.getScrollX();\n                            offsetY += v.getTop() - v.getScrollY();\n                        }\n                        final MotionEvent event = MotionEvent.obtainNoHistory(ev);\n                        event.offsetLocation(offsetX, offsetY);\n\n                        if (parent.onInterceptTouchEvent(event)) {\n                            mIntercepted = true;\n\n                            // If the parent wants to intercept ACTION_MOVE events,\n                            // we pass ACTION_DOWN event to the parent\n                            // as if these touch events just have began now.\n                            event.setAction(MotionEvent.ACTION_DOWN);\n\n                            // Return this onTouchEvent() first and set ACTION_DOWN event for parent\n                            // to the queue, to keep events sequence.\n                            post(new Runnable() {\n                                @Override\n                                public void run() {\n                                    parent.dispatchTouchEvent(event);\n                                }\n                            });\n                            return false;\n                        }\n                        // Even when this can't be scrolled anymore,\n                        // simply returning false here may cause subView's click,\n                        // so delegate it to super.\n                        return super.onTouchEvent(ev);\n                    }\n                    break;\n            }\n        }\n        return super.onTouchEvent(ev);\n    }\n\n    public boolean toolbarIsShown(Toolbar mToolbar) {\n        return ViewCompat.getTranslationY(mToolbar) == 0;\n    }\n\n    public boolean toolbarIsHidden(Toolbar mToolbar) {\n        return ViewCompat.getTranslationY(mToolbar) == -mToolbar.getHeight();\n    }\n\n    @Deprecated\n    public void showToolbarAndFAB(Toolbar mToolbar, UltimateRecyclerView ultimateRecyclerView, int screenHeight) {\n        showToolbar(mToolbar, ultimateRecyclerView, screenHeight);\n        showDefaultFloatingActionButton();\n    }\n\n    @Deprecated\n    public void hideToolbarAndFAB(Toolbar mToolbar, UltimateRecyclerView ultimateRecyclerView, int screenHeight) {\n        hideToolbar(mToolbar, ultimateRecyclerView, screenHeight);\n        hideDefaultFloatingActionButton();\n    }\n\n    public void showToolbar(Toolbar mToolbar, UltimateRecyclerView ultimateRecyclerView, int screenHeight) {\n        moveToolbar(mToolbar, ultimateRecyclerView, screenHeight, 0);\n    }\n\n    public void hideToolbar(Toolbar mToolbar, UltimateRecyclerView ultimateRecyclerView, int screenHeight) {\n        moveToolbar(mToolbar, ultimateRecyclerView, screenHeight, -mToolbar.getHeight());\n    }\n\n    public void showView(View mView, UltimateRecyclerView ultimateRecyclerView, int screenHeight) {\n        moveView(mView, ultimateRecyclerView, screenHeight, 0);\n    }\n\n    public void hideView(View mView, UltimateRecyclerView ultimateRecyclerView, int screenHeight) {\n        moveView(mView, ultimateRecyclerView, screenHeight, -mView.getHeight());\n    }\n\n    @TargetApi(Build.VERSION_CODES.HONEYCOMB)\n    protected void moveToolbar(final Toolbar mToolbar, final UltimateRecyclerView ultimateRecyclerView, final int screenheight, float toTranslationY) {\n        if (ViewCompat.getTranslationY(mToolbar) == toTranslationY) {\n            return;\n        }\n        ValueAnimator animator = ValueAnimator.ofFloat(ViewCompat.getTranslationY(mToolbar), toTranslationY).setDuration(200);\n        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator animation) {\n                float translationY = (float) animation.getAnimatedValue();\n                ViewCompat.setTranslationY(mToolbar, translationY);\n                ViewCompat.setTranslationY((View) ultimateRecyclerView, translationY);\n                // FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) ((View) ultimateRecyclerView).getLayoutParams();\n                MarginLayoutParams layoutParams = (MarginLayoutParams) ((View) ultimateRecyclerView).getLayoutParams();\n                layoutParams.height = (int) -translationY + screenheight - layoutParams.topMargin;\n                ((View) ultimateRecyclerView).requestLayout();\n            }\n        });\n        animator.start();\n    }\n\n    @TargetApi(Build.VERSION_CODES.HONEYCOMB)\n    protected void moveView(final View mView, final UltimateRecyclerView ultimateRecyclerView, final int screenheight, float toTranslationY) {\n        if (ViewCompat.getTranslationY(mView) == toTranslationY) {\n            return;\n        }\n        ValueAnimator animator = ValueAnimator.ofFloat(ViewCompat.getTranslationY(mView), toTranslationY).setDuration(200);\n        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator animation) {\n                float translationY = (float) animation.getAnimatedValue();\n                ViewCompat.setTranslationY(mView, translationY);\n                ViewCompat.setTranslationY((View) ultimateRecyclerView, translationY);\n                // FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) ((View) ultimateRecyclerView).getLayoutParams();\n                MarginLayoutParams layoutParams = (MarginLayoutParams) ((View) ultimateRecyclerView).getLayoutParams();\n                layoutParams.height = (int) -translationY + screenheight - layoutParams.topMargin;\n                ((View) ultimateRecyclerView).requestLayout();\n            }\n        });\n        animator.start();\n    }\n\n\n    public FloatingActionButton getDefaultFloatingActionButton() {\n        return defaultFloatingActionButton;\n    }\n\n    public void setDefaultFloatingActionButton(FloatingActionButton defaultFloatingActionButton) {\n        this.defaultFloatingActionButton = defaultFloatingActionButton;\n    }\n\n    public View getCustomFloatingActionView() {\n        return mFloatingButtonView;\n    }\n\n//    public void setCustomFloatingActionView(View customFloatingActionView) {\n//        this.floatingActionMenu = floatingActionMenu;\n//    }\n\n    public void showFloatingActionMenu() {\n        if (mFloatingButtonView != null)\n            ((FloatingActionsMenu) mFloatingButtonView).hide(false);\n    }\n\n    public void hideFloatingActionMenu() {\n        if (mFloatingButtonView != null) ((FloatingActionsMenu) mFloatingButtonView).hide(true);\n    }\n\n    public void showFloatingActionButton() {\n        if (mFloatingButtonView != null)\n            ((FloatingActionButton) mFloatingButtonView).hide(false);\n    }\n\n    public void hideFloatingActionButton() {\n        if (mFloatingButtonView != null) ((FloatingActionButton) mFloatingButtonView).hide(true);\n    }\n\n    public void showDefaultFloatingActionButton() {\n        defaultFloatingActionButton.hide(false);\n    }\n\n    public void hideDefaultFloatingActionButton() {\n        defaultFloatingActionButton.hide(true);\n    }\n\n    public void displayCustomFloatingActionView(boolean b) {\n        if (mFloatingButtonView != null)\n            mFloatingButtonView.setVisibility(b ? VISIBLE : INVISIBLE);\n    }\n\n    public void displayDefaultFloatingActionButton(boolean b) {\n        defaultFloatingActionButton.setVisibility(b ? VISIBLE : INVISIBLE);\n    }\n\n    public void removeItemDecoration(RecyclerView.ItemDecoration decoration) {\n        mRecyclerView.removeItemDecoration(decoration);\n    }\n\n    public void addOnItemTouchListener(RecyclerView.OnItemTouchListener listener) {\n        mRecyclerView.addOnItemTouchListener(listener);\n    }\n\n    public void removeOnItemTouchListener(RecyclerView.OnItemTouchListener listener) {\n        mRecyclerView.removeOnItemTouchListener(listener);\n    }\n\n    public RecyclerView.LayoutManager getLayoutManager() {\n        return mRecyclerView.getLayoutManager();\n    }\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/UltimateRecyclerviewViewHolder.java",
    "content": "package com.marshalchen.ultimaterecyclerview;\n\nimport android.content.Context;\nimport android.content.res.Resources;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.util.SparseArray;\nimport android.view.View;\n\nimport com.marshalchen.ultimaterecyclerview.itemTouchHelper.ItemTouchHelperViewHolder;\nimport com.marshalchen.ultimaterecyclerview.swipe.SwipeLayout;\n\n\n/**\n * Created by MarshalChen on 15-6-2.\n * adding by Hesk 2016-2-29\n */\npublic class UltimateRecyclerviewViewHolder<T> extends RecyclerView.ViewHolder implements\n        ItemTouchHelperViewHolder {\n\n    private SparseArray<SparseArray<View>> mSparseSparseArrayView\n            = new SparseArray<SparseArray<View>>();\n    private View mView;\n    private T mObject;\n\n\n    public SwipeLayout swipeLayout = null;\n    public SwipeLayout.OnLayout onLayoutListener = null;\n    public SwipeLayout.SwipeListener swipeMemory = null;\n    public int position = -1;\n\n    public UltimateRecyclerviewViewHolder(View itemView) {\n        super(itemView);\n        swipeLayout = (SwipeLayout) itemView.findViewById(R.id.recyclerview_swipe);\n        mView = itemView;\n    }\n\n    /**\n     * Method called when we need to update the view hold by this class.\n     *\n     * @param object the object subject of this update\n     */\n    public void onBindView(Object object) {\n        mObject = (T) object;\n        updateView(mView.getContext(), mObject);\n    }\n\n\n    /**\n     * Get the last object set to this viewholder\n     *\n     * @return  the type\n     */\n    public T getObject() {\n        return mObject;\n    }\n\n\n    /**\n     * Method called when we need to update the view hold by this class.\n     *\n     * @param context context of the root view\n     * @param object  the object subject of this update\n     */\n    protected void updateView(Context context, T object) {\n    }\n\n    /**\n     * Get the root view for the viewholder (the one passed into the constructor)\n     *\n     * @return The viewholder's root view, or null if it has no layout.\n     */\n    public View getView() {\n        return mView;\n    }\n\n    /**\n     * Returns the context the view is running in, through which it can\n     * access the current theme, resources, etc.\n     *\n     * @return The view's Context.\n     */\n    public Context getContext() {\n        return mView.getContext();\n    }\n\n    /**\n     * Returns the resources associated with this view.\n     *\n     * @return Resources object.\n     */\n    public Resources getResources() {\n        return mView.getResources();\n    }\n\n    @Override\n    public void onItemSelected() {\n\n    }\n\n    @Override\n    public void onItemClear() {\n\n    }\n\n    /**\n     * Called when a view created by the adapter has been recycled.\n     */\n    public void onViewRecycled() {\n    }\n\n    /**\n     * Called when a view created by the adapter has been attached to a window.\n     */\n    public void onViewAttachedToWindow() {\n    }\n\n    /**\n     * Called when a view created by the adapter has been detached from its window.\n     */\n    public void onViewDetachedFromWindow() {\n    }\n\n    /**\n     * Determine if a click listener should be automatically added to the view of this view holder\n     *\n     * @return true you want to have this view clickable\n     */\n    public boolean isClickable() {\n        return false;\n    }\n\n    /**\n     * Determine if a long click listener should be automatically added to the view of this view holder\n     *\n     * @return true you want to have this view clickable\n     */\n    public boolean isLongClickable() {\n        return false;\n    }\n\n    /**\n     * Look for a child view with the given id.  If this view has the given\n     * id, return this view.\n     * The method is efficient, if you had already called it, it will be faster than a normal\n     * \"findViewById\" thanks to a cache system\n     * @param id   The id to search for.\n     * @param <T>  the type of view\n     * @return    The view that has the given id in the hierarchy or null\n     */\n    public <T extends View> T findViewByIdEfficient(int id) {\n        return (T) findViewByIdEfficient(0, id);\n    }\n\n    /**\n     * Look for a child view of the parent view id with the given id.  If this view has the given\n     * id, return this view.\n     * The method is efficient, if you had already called it, it will be faster than a normal\n     * \"findViewById\" thanks to a cache system\n     * @param parentId  the parent id\n     * @param id   The id to search for.\n     * @param <T>                    type of object\n     * @return  The view that has the given id in the hierarchy or null\n     */\n    public <T extends View> T findViewByIdEfficient(int parentId, int id) {\n        View viewRetrieve = retrieveFromCache(parentId, id);\n        if (viewRetrieve == null) {\n            viewRetrieve = findViewById(parentId, id);\n            if (viewRetrieve != null) {\n                storeView(parentId, id, viewRetrieve);\n            }\n        }\n        return (T) viewRetrieve;\n    }\n\n    private void storeView(int parentId, int id, View viewRetrieve) {\n        SparseArray<View> sparseArrayViewsParent = mSparseSparseArrayView.get(parentId);\n        if (sparseArrayViewsParent == null) {\n            sparseArrayViewsParent = new SparseArray<View>();\n            mSparseSparseArrayView.put(parentId, sparseArrayViewsParent);\n        }\n        sparseArrayViewsParent.put(id, viewRetrieve);\n    }\n\n    private View findViewById(int parentId, int id) {\n        if (parentId == 0) {\n            return mView.findViewById(id);\n        } else {\n            View parent = findViewByIdEfficient(parentId);\n            if (parent != null) {\n                return parent.findViewById(id);\n            } else {\n                return null;\n            }\n        }\n    }\n\n    private View retrieveFromCache(int parentId, int id) {\n        SparseArray<View> sparseArrayViewsParent = mSparseSparseArrayView.get(parentId);\n        if (sparseArrayViewsParent != null) {\n            View viewRetrieve = sparseArrayViewsParent.get(id);\n            if (viewRetrieve == null) {\n                // dead reference\n                sparseArrayViewsParent.remove(id);\n            } else {\n                return viewRetrieve;\n            }\n        }\n        if (parentId == 0) {\n            return retrieveFromCache(id);\n        } else {\n            return null;\n        }\n    }\n\n    private View retrieveFromCache(int id) {\n        for (int i = 0; i < mSparseSparseArrayView.size(); i++) {\n            int parentId = mSparseSparseArrayView.keyAt(i);\n            if (parentId != 0) {\n                View viewRetrieve = retrieveFromCache(parentId, id);\n                if (viewRetrieve != null) {\n                    return viewRetrieve;\n                }\n            }\n        }\n        return null;\n    }\n\n}"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/UltimateViewAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview;\n\nimport android.animation.Animator;\nimport android.animation.ObjectAnimator;\nimport android.annotation.TargetApi;\nimport android.os.Build;\nimport android.os.Handler;\nimport androidx.annotation.Nullable;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.util.Log;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.marshalchen.ultimaterecyclerview.itemTouchHelper.ItemTouchHelperAdapter;\nimport com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.StickyRecyclerHeadersAdapter;\n\nimport java.util.Collections;\nimport java.util.Iterator;\nimport java.util.List;\n\n/**\n * An abstract adapter which can be extended for Recyclerview\n */\npublic abstract class UltimateViewAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> implements StickyRecyclerHeadersAdapter<RecyclerView.ViewHolder>, ItemTouchHelperAdapter {\n    protected Handler timer = new Handler();\n    protected UltimateRecyclerView.CustomRelativeWrapper customHeaderView = null;\n    protected View customLoadMoreView = null;\n    protected View customLoadMoreItemView = null;\n    private boolean customHeader = false;\n    /**\n     * this watches how many times does this loading more triggered\n     */\n    private int loadmoresetingswatch = 0;\n    public boolean enabled_custom_load_more_view = false;\n    protected int mEmptyViewPolicy;\n    protected int mEmptyViewOnInitPolicy;\n\n    /**\n     * Lock used to modify the content of list. Any write operation\n     * performed on the array should be synchronized on this lock.\n     */\n    protected final Object mLock = new Object();\n\n\n    /**\n     * Set the header view of the adapter.\n     *\n     * @param customHeaderView na\n     */\n    public void setCustomHeaderView(UltimateRecyclerView.CustomRelativeWrapper customHeaderView) {\n        this.customHeaderView = customHeaderView;\n        customHeader = true;\n    }\n\n    public UltimateRecyclerView.CustomRelativeWrapper getCustomHeaderView() {\n        return customHeaderView;\n    }\n\n    public boolean hasHeaderView() {\n        return customHeader;\n    }\n\n    /**\n     * Using a custom LoadMoreView\n     *\n     * @param customview the inflated view\n     */\n    public final void setCustomLoadMoreView(@Nullable View customview) {\n        customLoadMoreView = customview;\n    }\n\n\n    public final View getCustomLoadMoreView() {\n        return customLoadMoreView;\n    }\n\n    /**\n     * the get function to get load more\n     *\n     * @return determine this is a get function\n     */\n    public final boolean enableLoadMore() {\n        return enabled_custom_load_more_view;\n    }\n\n\n    private class delayEnableLoadmore implements Runnable {\n        private boolean enabled;\n\n        public delayEnableLoadmore(final boolean b) {\n            enabled = b;\n        }\n\n        @Override\n        public void run() {\n            if (!enabled && loadmoresetingswatch > 0 && customLoadMoreView != null) {\n                final int displaySize = getItemCount();\n                final int dataSize = getAdapterItemCount();\n                if (dataSize > 0 && customLoadMoreItemView != null) {\n                    notifyItemRemoved(displaySize - 1);\n                }\n                detectDispatchLoadMoreDisplay(getAdapterItemCount(), getItemCount());\n            }\n            enabled_custom_load_more_view = enabled;\n            if (enabled && customLoadMoreView == null) {\n                enabled_custom_load_more_view = false;\n            }\n            if (enabled) {\n                revealDispatchLoadMoreView();\n            }\n        }\n    }\n\n    public delayEnableLoadmore cbloadmore;\n\n    /**\n     * as the set function to switching load more feature\n     *\n     * @param b bool\n     */\n    public final void enableLoadMore(final boolean b) {\n        cbloadmore = new delayEnableLoadmore(b);\n    }\n\n    public final void internalExecuteLoadingView() {\n        if (cbloadmore != null) {\n            timer.post(cbloadmore);\n            loadmoresetingswatch++;\n            cbloadmore = null;\n        }\n    }\n\n    /**\n     * Called by RecyclerView when it stops observing this Adapter.\n     *\n     * @param recyclerView The RecyclerView instance which stopped observing this adapter.\n     * @see #onAttachedToRecyclerView(RecyclerView)\n     */\n    @Override\n    public void onDetachedFromRecyclerView(RecyclerView recyclerView) {\n        super.onDetachedFromRecyclerView(recyclerView);\n        timer.removeCallbacks(cbloadmore);\n    }\n\n    public final void setEmptyViewPolicy(final int policy) {\n        mEmptyViewPolicy = policy;\n    }\n\n    public final void setEmptyViewOnInitPolicy(final int policy) {\n        mEmptyViewOnInitPolicy = policy;\n    }\n\n    public final int getEmptyViewPolicy() {\n        return mEmptyViewPolicy;\n    }\n\n    public final int getEmptyViewInitPolicy() {\n        return mEmptyViewOnInitPolicy;\n    }\n\n\n    /**\n     * the basic view holder creation\n     *\n     * @param parent   coming from the bottom api\n     * @param viewType coming the bottom api as well\n     * @return expected a typed view holder\n     */\n    @Override\n    public VH onCreateViewHolder(ViewGroup parent, int viewType) {\n        if (viewType == VIEW_TYPES.FOOTER) {\n            VH viewHolder = newFooterHolder(customLoadMoreView);\n            /**\n             * this is only for the first time rendering of the adapter\n             */\n            customLoadMoreItemView = viewHolder.itemView;\n            if (getAdapterItemCount() == 0) {\n                removeDispatchLoadMoreView();\n            }\n            if (enabled_custom_load_more_view && getAdapterItemCount() > 0) {\n                revealDispatchLoadMoreView();\n            }\n            return viewHolder;\n        } else if (viewType == VIEW_TYPES.HEADER) {\n            return newHeaderHolder(customHeaderView);\n        } else if (viewType == VIEW_TYPES.ADVIEW) {\n            return getAdViewHolder(customHeaderView);\n        } else if (viewType == VIEW_TYPES.CUSTOMVIEW) {\n            return newCustomViewHolder(customHeaderView);\n        } else if (viewType == VIEW_TYPES.NOVIEW) {\n            return getNoViewHolder(customHeaderView);\n        }\n        return onCreateViewHolder(parent);\n    }\n\n    /**\n     * requirement: ADVIEW\n     *\n     * @param view v\n     * @return holder for this ADVIEW\n     */\n    public VH getAdViewHolder(View view) {\n        return null;\n    }\n\n    /**\n     * requirement: CUSTOMVIEW\n     *\n     * @param view v\n     * @return v\n     */\n    public VH newCustomViewHolder(View view) {\n        return null;\n    }\n\n    /**\n     * requirement: NOVIEW\n     *\n     * @param view v\n     * @return v\n     */\n    public VH getNoViewHolder(View view) {\n        return null;\n    }\n\n\n    /**\n     * requirement: FOOTER, HEADER. it does not bind and need to do that in the header binding\n     *\n     * @param view with no binding view of nothing\n     * @return v\n     */\n    public abstract VH newFooterHolder(View view);\n\n\n    public abstract VH newHeaderHolder(View view);\n\n    /**\n     * for all NORMAL type holder\n     *\n     * @param parent view group parent\n     * @return vh\n     */\n    public abstract VH onCreateViewHolder(ViewGroup parent);\n\n\n    @Override\n    public int getItemViewType(int position) {\n        //  int k = getAdapterItemCount();\n        if (getAdapterItemCount() == 0) {\n            if (position == 0) {\n                if (enableLoadMore() && hasHeaderView()) {\n                    //both\n                    return VIEW_TYPES.FOOTER;\n                } else if (!enableLoadMore() && hasHeaderView()) {\n                    //only header\n                    return VIEW_TYPES.HEADER;\n                } else if (enableLoadMore() && !hasHeaderView()) {\n                    //only load more\n                    return VIEW_TYPES.FOOTER;\n                } else {\n                    return VIEW_TYPES.NOVIEW;\n                }\n            } else if (position == 1) {\n                if (enableLoadMore() && hasHeaderView()) {\n                    //both\n                    return VIEW_TYPES.FOOTER;\n                } else if (!enableLoadMore() && hasHeaderView()) {\n                    //only header\n                    return VIEW_TYPES.NOVIEW;\n                } else if (enableLoadMore() && !hasHeaderView()) {\n                    //only load more\n                    return VIEW_TYPES.NOVIEW;\n                } else {\n                    return VIEW_TYPES.NOVIEW;\n                }\n            } else {\n                return VIEW_TYPES.NOVIEW;\n            }\n        } else if (getAdapterItemCount() > 0) {\n            int last_item = getItemCount() - 1;\n            if (position == last_item && enableLoadMore()) {\n                return VIEW_TYPES.FOOTER;\n            } else if (position == 0 && hasHeaderView()) {\n                return VIEW_TYPES.HEADER;\n            } else if (isOnCustomView(position)) {\n                return VIEW_TYPES.ADVIEW;\n            } else if (isOnAdView(position)) {\n                return VIEW_TYPES.ADVIEW;\n            } else {\n                return VIEW_TYPES.NORMAL;\n            }\n        } else {\n            return VIEW_TYPES.NORMAL;\n        }\n    }\n\n    protected boolean isOnCustomView(final int pos) {\n        return false;\n    }\n\n    protected boolean isOnAdView(final int pos) {\n        return false;\n    }\n\n    /**\n     * retrieve the amount of the total items in the urv for display that will be including all data items as well as the decorative items\n     *\n     * @return the int\n     */\n    @Override\n    public int getItemCount() {\n        return getAdapterItemCount() + totalAdditionalItems();\n    }\n\n    public int getAdditionalItems() {\n        return totalAdditionalItems();\n    }\n\n    protected int totalAdditionalItems() {\n        int offset = 0;\n        if (hasHeaderView()) offset++;\n        if (enableLoadMore()) offset++;\n        return offset;\n    }\n\n    /**\n     * Returns the number of items in the adapter bound to the parent RecyclerView.\n     *\n     * @return The number of data items in the bound adapter\n     */\n    public abstract int getAdapterItemCount();\n\n\n    public final void toggleSelection(int pos) {\n        notifyItemChanged(pos);\n    }\n\n\n    public final void clearSelection(int pos) {\n        notifyItemChanged(pos);\n    }\n\n    public final void setSelected(int pos) {\n        notifyItemChanged(pos);\n    }\n\n    /**\n     * Swap the item of list\n     *\n     * @param list data list\n     * @param from position from\n     * @param to   position to\n     */\n    public void swapPositions(List<?> list, int from, int to) {\n        if (hasHeaderView()) {\n            from--;\n            to--;\n        }\n        if (enableLoadMore() && to == getItemCount() - 1) return;\n        if (hasHeaderView() && to == 0) return;\n        if (hasHeaderView() && from == 0) return;\n        if (enableLoadMore() && from == getItemCount() - 1) return;\n        Collections.swap(list, from, to);\n    }\n\n\n    /**\n     * Insert a item to the list of the adapter\n     *\n     * @param list     data list\n     * @param object   object T\n     * @param position position\n     * @param <T>      in T\n     */\n    public final <T> void insertInternal(List<T> list, T object, final int position) {\n        list.add(position, object);\n        int g = position;\n        if (hasHeaderView()) g++;\n        notifyItemInserted(g);\n    }\n\n\n    public final <T> void insertFirstInternal(List<T> list, T item) {\n        insertInternal(list, item, 0);\n    }\n\n    public final <T> void insertLastInternal(List<T> list, T item) {\n        insertInternal(list, item, getAdapterItemCount());\n    }\n\n    /**\n     * insert the new item list after the whole list\n     *\n     * @param insert_data   new list\n     * @param original_list original copy\n     * @param <T>           the type\n     */\n    public final <T> void insertInternal(List<T> insert_data, List<T> original_list) {\n        try {\n            Iterator<T> id = insert_data.iterator();\n            int g = getItemCount();\n            //   if (hasHeaderView()) g--;\n            if (enableLoadMore()) g--;\n            final int start = g;\n            synchronized (mLock) {\n                while (id.hasNext()) {\n                    original_list.add(original_list.size(), id.next());\n                }\n            }\n            if (insert_data.size() == 1) {\n                notifyItemInserted(start);\n            } else if (insert_data.size() > 1) {\n                notifyItemRangeInserted(start, insert_data.size());\n            }\n            if (enabled_custom_load_more_view) {\n                revealDispatchLoadMoreView();\n            }\n        } catch (Exception e) {\n            String o = e.fillInStackTrace().getCause().getMessage().toString();\n            Log.d(\"fillInStackTrace\", o + \" : \");\n        }\n    }\n\n    /**\n     * Remove a item of  the list of the adapter\n     *\n     * @param list     na\n     * @param position na\n     * @param <T>      na\n     */\n    public final <T> void removeInternal(List<T> list, int position) {\n        if (hasHeaderView() && position == 0) return;\n        if (enableLoadMore() && position == getItemCount() - 1) return;\n        if (list.size() > 0) {\n            synchronized (mLock) {\n                list.remove(hasHeaderView() ? position - 1 : position);\n            }\n            removeNotifyExternal(position);\n            notifyItemRemoved(position);\n        }\n    }\n\n    protected void removeNotifyExternal(final int pos) {\n\n    }\n\n    public final <T> void removeFirstInternal(List<T> list) {\n        removeInternal(list, 0);\n    }\n\n    public final <T> void removeLastInternal(List<T> list) {\n        removeInternal(list, getAdapterItemCount() - 1);\n    }\n\n    /**\n     * Clear the list of the adapter\n     *\n     * @param list data list\n     * @param <T>  na\n     */\n    public final <T> void clearInternal(List<T> list) {\n        int data_size_before_remove = list.size();\n        final int display_size_before_remove = getItemCount();\n        synchronized (mLock) {\n            list.clear();\n        }\n        notifyAfterRemoveAllData(data_size_before_remove, display_size_before_remove);\n    }\n\n    /**\n     * @param data_size_before_remove    data size\n     * @param display_size_before_remove display item size\n     * @return TRUE for this is done and no more further processing\n     */\n    protected boolean detectDispatchLoadMoreDisplay(final int data_size_before_remove, final int display_size_before_remove) {\n        if (data_size_before_remove == 0) {\n            if (display_size_before_remove == 2) {\n\n                if (mEmptyViewPolicy == UltimateRecyclerView.EMPTY_KEEP_HEADER_AND_LOARMORE) {\n\n                } else if (mEmptyViewPolicy == UltimateRecyclerView.EMPTY_KEEP_HEADER) {\n                    removeDispatchLoadMoreView();\n                } else if (mEmptyViewPolicy == UltimateRecyclerView.EMPTY_CLEAR_ALL) {\n                    removeDispatchLoadMoreView();\n                }\n\n            } else if (display_size_before_remove == 1) {\n\n                if (mEmptyViewPolicy == UltimateRecyclerView.EMPTY_KEEP_HEADER_AND_LOARMORE) {\n\n                } else if (mEmptyViewPolicy == UltimateRecyclerView.EMPTY_KEEP_HEADER) {\n                    removeDispatchLoadMoreView();\n                } else if (mEmptyViewPolicy == UltimateRecyclerView.EMPTY_CLEAR_ALL) {\n                    removeDispatchLoadMoreView();\n                }\n\n                return true;\n\n            } else if (display_size_before_remove == 0) {\n                if (mEmptyViewPolicy == UltimateRecyclerView.EMPTY_KEEP_HEADER_AND_LOARMORE) {\n                    notifyDataSetChanged();\n                } else if (mEmptyViewPolicy == UltimateRecyclerView.EMPTY_KEEP_HEADER) {\n                    notifyDataSetChanged();\n                } else if (mEmptyViewPolicy == UltimateRecyclerView.EMPTY_SHOW_LOADMORE_ONLY) {\n                    notifyDataSetChanged();\n                }\n                return true;\n            } else {\n                return false;\n            }\n        }\n        return false;\n    }\n\n    protected void revealDispatchLoadMoreView() {\n        if (customLoadMoreItemView != null) {\n            if (customLoadMoreItemView.getVisibility() != View.VISIBLE) {\n                customLoadMoreItemView.setVisibility(View.VISIBLE);\n            }\n        }\n    }\n\n    protected void removeDispatchLoadMoreView() {\n        if (customLoadMoreItemView != null) {\n            if (customLoadMoreItemView.getVisibility() != View.GONE) {\n                customLoadMoreItemView.setVisibility(View.GONE);\n            }\n        }\n    }\n\n    /**\n     * works on API v23\n     * there is a high  chance to crash this\n     *\n     * @param data_size_before_remove    original size before removed\n     * @param display_size_before_remove the counts for display items\n     *                                   <code>\n     *                                   http://stackoverflow.com/questions/30220771/recyclerview-inconsistency-detected-invalid-item-position</code>\n     */\n\n    protected void notifyAfterRemoveAllData(final int data_size_before_remove, final int display_size_before_remove) {\n        try {\n            final int notify_start_item = hasHeaderView() ? 1 : 0;\n            final int notifiy_n_plus = hasHeaderView() ? data_size_before_remove + 1 : data_size_before_remove;\n            if (detectDispatchLoadMoreDisplay(data_size_before_remove, display_size_before_remove))\n                return;\n\n            if (data_size_before_remove == 0) return;\n\n            if (mEmptyViewPolicy == UltimateRecyclerView.EMPTY_KEEP_HEADER_AND_LOARMORE) {\n                if (hasHeaderView())\n                    notifyItemRangeChanged(notify_start_item, data_size_before_remove);\n                else {\n                    notifyDataSetChanged();\n                }\n            } else if (mEmptyViewPolicy == UltimateRecyclerView.EMPTY_KEEP_HEADER) {\n                notifyItemRangeRemoved(notify_start_item, data_size_before_remove);\n                removeDispatchLoadMoreView();\n            } else if (mEmptyViewPolicy == UltimateRecyclerView.EMPTY_CLEAR_ALL) {\n                notifyItemRangeRemoved(0, notifiy_n_plus);\n                removeDispatchLoadMoreView();\n            } else if (mEmptyViewPolicy == UltimateRecyclerView.EMPTY_SHOW_LOADMORE_ONLY) {\n                notifyItemRangeRemoved(0, notifiy_n_plus);\n                revealDispatchLoadMoreView();\n            } else {\n                notifyItemRangeRemoved(0, notifiy_n_plus);\n            }\n        } catch (Exception e) {\n            String o = e.fillInStackTrace().getCause().getMessage().toString();\n            Log.d(\"fillInStackTrace\", o + \" : \");\n        }\n    }\n\n\n    /**\n     * remove all items\n     *\n     * @param list na\n     * @param <T>  na\n     */\n    public final <T> void removeAllInternal(List<T> list) {\n        clearInternal(list);\n    }\n\n    @Override\n    public long getHeaderId(int position) {\n        if (hasHeaderView() && position == 0) return -1;\n        if (enableLoadMore() && position >= getItemCount() - 1) return -1;\n        if (getAdapterItemCount() > 0) {\n            return generateHeaderId(hasHeaderView() ? position - 1 : position);\n        } else return -1;\n    }\n\n    public abstract long generateHeaderId(int position);\n\n\n    public static class VIEW_TYPES {\n        public static final int NORMAL = 0;\n        public static final int HEADER = 1;\n        //this is the default loading footer\n        public static final int FOOTER = 2;\n        //this is the customized footer\n        public static final int NOVIEW = 3;\n        //this is specialized Ad view\n        public static final int ADVIEW = 4;\n        public static final int CUSTOMVIEW = 5;\n        public static final int SECTION = 6;\n    }\n\n    protected enum AdapterAnimationType {\n        AlphaIn,\n        SlideInBottom,\n        ScaleIn,\n        SlideInLeft,\n        SlideInRight,\n    }\n\n    /**\n     * Animations when loading the adapter\n     *\n     * @param view the view\n     * @param type the type of the animation\n     * @return the animator in array\n     */\n    @TargetApi(Build.VERSION_CODES.HONEYCOMB)\n    protected Animator[] getAdapterAnimations(View view, AdapterAnimationType type) {\n        if (type == AdapterAnimationType.ScaleIn) {\n            ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, \"scaleX\", .5f, 1f);\n            ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, \"scaleY\", .5f, 1f);\n            return new ObjectAnimator[]{scaleX, scaleY};\n        } else if (type == AdapterAnimationType.AlphaIn) {\n            return new Animator[]{ObjectAnimator.ofFloat(view, \"alpha\", .5f, 1f)};\n        } else if (type == AdapterAnimationType.SlideInBottom) {\n            return new Animator[]{\n                    ObjectAnimator.ofFloat(view, \"translationY\", view.getMeasuredHeight(), 0)\n            };\n        } else if (type == AdapterAnimationType.SlideInLeft) {\n            return new Animator[]{\n                    ObjectAnimator.ofFloat(view, \"translationX\", -view.getRootView().getWidth(), 0)\n            };\n        } else if (type == AdapterAnimationType.SlideInRight) {\n            return new Animator[]{\n                    ObjectAnimator.ofFloat(view, \"translationX\", view.getRootView().getWidth(), 0)\n            };\n        }\n        return null;\n    }\n\n\n/*\n    @Override\n    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {\n        ViewHelper.clear(holder.itemView);\n\n    }\n    */\n\n\n    @Override\n    public void onItemMove(int fromPosition, int toPosition) {\n        notifyItemMoved(fromPosition, toPosition);\n    }\n\n    @Override\n    public void onItemDismiss(int position) {\n        if (hasHeaderView() && getItemViewType(position) == VIEW_TYPES.HEADER) return;\n        if (enableLoadMore() && getItemViewType(position) == VIEW_TYPES.FOOTER) return;\n        notifyDataSetChanged();\n    }\n\n\n    protected OnStartDragListener mDragStartListener = null;\n\n    /**\n     * Listener for manual initiation of a drag.\n     */\n    public interface OnStartDragListener {\n\n        /**\n         * Called when a view is requesting a start of a drag.\n         *\n         * @param viewHolder The holder of the view to drag.\n         */\n        void onStartDrag(RecyclerView.ViewHolder viewHolder);\n    }\n\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/appPaginator/PageControlConst.java",
    "content": "package com.marshalchen.ultimaterecyclerview.appPaginator;\n\n/**\n * Created by zJJ on 2/21/2016.\n */\npublic class PageControlConst {\n    public static String FRAGMENTTITLE = \"fragment_title\";\n    public static String SAVELOADDATA = \"item_list\";\n    public static String HASSAVEFILTER = \"filter\";\n    public static String URL = \"data_url\";\n\n    public final static String\n            BRAND_NAME = \"BrandName\",\n            SLUGTAG = \"slug\",\n            REQUEST_TYPE = \"typerequest\";\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/appPaginator/catelogGrid.java",
    "content": "package com.marshalchen.ultimaterecyclerview.appPaginator;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.os.Bundle;\nimport androidx.annotation.IdRes;\nimport androidx.annotation.LayoutRes;\nimport androidx.recyclerview.widget.GridLayoutManager;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.marshalchen.ultimaterecyclerview.R;\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder;\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.easyRegularAdapter;\n\n\n/**\n * Created by hesk on 15/2/16.\n */\npublic abstract class catelogGrid<adapter extends easyRegularAdapter, binder extends UltimateRecyclerviewViewHolder> extends paginator {\n    public static String TAG = \"catelog\";\n    public UltimateRecyclerView listview_layout;\n    protected GridLayoutManager mLayoutManager;\n    protected adapter madapter;\n\n    protected abstract adapter getAdatperWithdata();\n\n    protected abstract void setUltimateRecyclerViewExtra(final UltimateRecyclerView listview, final adapter madapter);\n\n    @Override\n    public void onAttach(Activity activity) {\n        super.onAttach(activity);\n    }\n\n    @Override\n    public void onAttach(Context activity) {\n        super.onAttach(activity);\n    }\n\n    @Override\n    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n        return inflater.inflate(getFragmentResId(), container, false);\n    }\n\n    @Override\n    @IdRes\n    protected int getUltimate_recycler_viewResId() {\n        return R.id.urv_main_list;\n    }\n\n    @Override\n    @IdRes\n    protected int getRefresherProgressBarId() {\n        return R.id.urv_main_progress_bar;\n    }\n\n    protected abstract int getColumn();\n\n\n    /**\n     * step 1:\n     * takes the arguement form the intent bundle and determine if there is a need to queue a loading process. If that is a yes then we need to load up the data before displaying the list out.\n     *\n     * @param r and the data bundle\n     * @return tells if  there is a loading process to be done before hand\n     */\n    protected abstract boolean onArguments(final Bundle r);\n\n    /**\n     * step 2:\n     * this is the call for the loading the data stream externally\n     *\n     * @param confirmAdapter the adapter\n     */\n    protected abstract void loadDataInitial(final adapter confirmAdapter);\n\n\n    protected void renderviewlayout(View view) throws Exception {\n        listview_layout = (UltimateRecyclerView) view.findViewById(getUltimate_recycler_viewResId());\n        listview_layout.setHasFixedSize(true);\n        listview_layout.setSaveEnabled(true);\n        if (mLayoutManager == null) {\n            mLayoutManager = new GridLayoutManager(view.getContext(), getColumn(), LinearLayoutManager.VERTICAL, false);\n        }\n        listview_layout.setLayoutManager(mLayoutManager);\n        getProgressbar(view);\n        listview_layout.setAdapter(madapter = getAdatperWithdata());\n        setUltimateRecyclerViewExtra(listview_layout, madapter);\n    }\n\n\n    @Override\n    public void onViewCreated(View view, Bundle savedInstanceState) {\n        try {\n            renderviewlayout(view);\n            if (getArguments() != null) {\n                if (onArguments(getArguments())) {\n                    showLoadingCircle();\n                    initPaginator();\n                    loadDataInitial(madapter);\n                }\n            }\n        } catch (Exception e) {\n            Log.d(TAG, e.getMessage());\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/appPaginator/catelogLinear.java",
    "content": "package com.marshalchen.ultimaterecyclerview.appPaginator;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.os.Bundle;\nimport androidx.annotation.IdRes;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.marshalchen.ultimaterecyclerview.R;\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder;\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.easyRegularAdapter;\nimport com.marshalchen.ultimaterecyclerview.layoutmanagers.ScrollSmoothLineaerLayoutManager;\n\n/**\n * Created by hesk on 30/6/15.\n */\npublic abstract class catelogLinear<adapter extends easyRegularAdapter, binder extends UltimateRecyclerviewViewHolder> extends paginator {\n    public static String TAG = \"catelog\";\n    public final static String BRAND_NAME = \"BrandName\", SLUG = \"slug\", REQUEST_TYPE = \"typerequest\";\n    public UltimateRecyclerView listview_layout;\n    public static String URL = \"data_url\";\n    public static String FRAGMENTTITLE = \"fragment_title\";\n    public static String SAVELOADDATA = \"item_list\";\n    public static String HASSAVEFILTER = \"filter\";\n    protected LinearLayoutManager mLayoutManager;\n    protected adapter madapter;\n\n    protected abstract adapter getAdatperWithdata();\n\n    protected abstract void setUltimateRecyclerViewExtra(final UltimateRecyclerView listview, final adapter madapter);\n\n    @Override\n    public void onAttach(Activity activity) {\n        super.onAttach(activity);\n    }\n\n    @Override\n    public void onAttach(Context activity) {\n        super.onAttach(activity);\n    }\n\n    @Override\n    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n        return inflater.inflate(getFragmentResId(), container, false);\n    }\n\n    @IdRes\n    protected int getUltimate_recycler_viewResId() {\n        return R.id.urv_main_list;\n    }\n\n    @IdRes\n    protected int getRefresherProgressBarId() {\n        return R.id.urv_main_progress_bar;\n    }\n\n    /**\n     * step 1:\n     * takes the arguement form the intent bundle and determine if there is a need to queue a loading process. If that is a yes then we need to load up the data before displaying the list out.\n     *\n     * @param r and the data bundle\n     * @return tells if  there is a loading process to be done before hand\n     */\n    protected abstract boolean onArguments(final Bundle r);\n\n    /**\n     * step 2:\n     * this is the call for the loading the data stream externally\n     *\n     * @param confirmAdapter the adapter\n     */\n    protected abstract void loadDataInitial(final adapter confirmAdapter);\n\n\n    protected void renderviewlayout(View view) throws Exception {\n        listview_layout = (UltimateRecyclerView) view.findViewById(getUltimate_recycler_viewResId());\n        listview_layout.setHasFixedSize(true);\n        listview_layout.setSaveEnabled(true);\n        if (mLayoutManager == null) {\n            mLayoutManager = new ScrollSmoothLineaerLayoutManager(view.getContext(), LinearLayoutManager.VERTICAL, false, getSmoothDuration());\n        }\n        listview_layout.setLayoutManager(mLayoutManager);\n        listview_layout.setAdapter(madapter = getAdatperWithdata());\n        getProgressbar(view);\n        setUltimateRecyclerViewExtra(listview_layout, madapter);\n    }\n\n    protected int getSmoothDuration() {\n        return 300;\n    }\n\n    @Override\n    public void onViewCreated(View view, Bundle savedInstanceState) {\n        try {\n            renderviewlayout(view);\n            if (getArguments() != null) {\n                if (onArguments(getArguments())) {\n                    showLoadingCircle();\n                    initPaginator();\n                    loadDataInitial(madapter);\n                }\n            }\n        } catch (Exception e) {\n            Log.d(TAG, e.getMessage());\n        }\n\n    }\n\n\n}"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/appPaginator/paginator.java",
    "content": "package com.marshalchen.ultimaterecyclerview.appPaginator;\n\nimport android.app.Fragment;\nimport android.os.Build;\nimport androidx.annotation.IdRes;\nimport androidx.annotation.LayoutRes;\nimport android.view.View;\nimport android.widget.ProgressBar;\n\n/**\n * Created by hesk on 15/2/16.\n */\npublic abstract class paginator extends Fragment {\n\n    private int currentPage, totalPages, pagePerItems, landscape_common_colums = 4, portrait_common_colums = 2;\n    private String tag_keyword, fullEndPoint, searchKeyword;\n    private boolean enable_load_more, is_new_search, status_refresh, status_initization;\n    protected ProgressBar mProgress;\n\n    protected void getProgressbar(View view, @IdRes final int progress_bar_id) {\n        try {\n            mProgress = (ProgressBar) view.findViewById(progress_bar_id);\n        } catch (Exception e) {\n            //unable to find loading progress bar\n        }\n    }\n\n    protected void getProgressbar(View view) {\n        try {\n            mProgress = (ProgressBar) view.findViewById(getRefresherProgressBarId());\n        } catch (Exception e) {\n            //unable to find loading progress bar\n        }\n    }\n\n    public final void cancelInitalization() {\n        status_initization = false;\n    }\n\n    public final boolean isInitization() {\n        return status_initization;\n    }\n\n    public final void setIsStatusRefresh(boolean b) {\n        status_refresh = b;\n    }\n\n    public final boolean isStatusRefresh() {\n        return status_refresh;\n    }\n\n\n    @IdRes\n    protected abstract int getRefresherProgressBarId();\n\n    @IdRes\n    protected abstract int getUltimate_recycler_viewResId();\n\n    @LayoutRes\n    protected abstract int getFragmentResId();\n\n    protected abstract void onClickItem(final String route);\n\n    protected abstract void onClickItem(final long route_id);\n\n\n    protected void showLoadingCircle() {\n        if (mProgress != null) {\n            mProgress.setVisibility(View.VISIBLE);\n            mProgress.animate().alpha(1f);\n        }\n    }\n\n    protected void hideLoadingCircle() {\n        if (mProgress != null && mProgress.getVisibility() == View.VISIBLE) {\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {\n                mProgress.animate().alpha(0f).withEndAction(new Runnable() {\n                    @Override\n                    public void run() {\n                        mProgress.setVisibility(View.INVISIBLE);\n                    }\n                });\n            } else {\n                mProgress.setVisibility(View.INVISIBLE);\n            }\n        }\n    }\n\n    protected int getItemsShownPerPage() {\n        return 16;\n    }\n\n    protected void initPaginator() {\n        currentPage = 1;\n        totalPages = 1;\n        pagePerItems = getItemsShownPerPage();\n        enable_load_more = false;\n        is_new_search = false;\n        status_initization = true;\n    }\n\n\n    public String getSearchKeyword() {\n        return searchKeyword;\n    }\n\n    public void setSearchKeyword(String searchKeyword) {\n        this.searchKeyword = searchKeyword;\n    }\n\n    public String getTagKeyword() {\n        return tag_keyword;\n    }\n\n    public void setTagKeyword(String tag_keyword) {\n        this.tag_keyword = tag_keyword;\n    }\n\n    public String getFullEndPoint() {\n        return fullEndPoint;\n    }\n\n    public void setFullEndPoint(String fullEndPoint) {\n        this.fullEndPoint = fullEndPoint;\n    }\n\n    public boolean isNewSearch() {\n        return is_new_search;\n    }\n\n    public void setEnablNewSearch(boolean is_new_search) {\n        this.is_new_search = is_new_search;\n    }\n\n    protected int getCurrentPage() {\n        return currentPage;\n    }\n\n    protected int getTotalPages() {\n        return totalPages;\n    }\n\n    protected int getPagePerItems() {\n        return pagePerItems;\n    }\n\n    protected void setCurrentPage(int n) {\n        currentPage = n;\n    }\n\n    protected void nextPage() {\n        if (currentPage < totalPages) {\n            enable_load_more = true;\n            currentPage++;\n        }\n    }\n\n    protected void setTotalPages(int n) {\n        totalPages = n;\n        if (currentPage >= totalPages) {\n            enable_load_more = false;\n        } else {\n            enable_load_more = true;\n        }\n    }\n\n    protected boolean shouldEnableLoadMore() {\n        return enable_load_more;\n    }\n\n    public void triggerNewSearchKeyWord(String word) {\n        setEnablNewSearch(true);\n        setSearchKeyword(word);\n    }\n\n    protected abstract void makeBasicRequest();\n\n    protected abstract void makeRefreshRequest();\n\n    protected void makeNextRequest() {\n        nextPage();\n        makeBasicRequest();\n    }\n\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/appPaginator/v4/catelogGrid.java",
    "content": "package com.marshalchen.ultimaterecyclerview.appPaginator.v4;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.os.Bundle;\nimport androidx.annotation.IdRes;\nimport androidx.recyclerview.widget.GridLayoutManager;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.marshalchen.ultimaterecyclerview.R;\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder;\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.easyRegularAdapter;\n\n\n/**\n * Created by hesk on 15/2/16.\n */\npublic abstract class catelogGrid<adapter extends easyRegularAdapter, binder extends UltimateRecyclerviewViewHolder> extends paginator {\n    public static String TAG = \"catelog\";\n    public UltimateRecyclerView listview_layout;\n    protected GridLayoutManager mLayoutManager;\n    protected adapter madapter;\n\n    protected abstract adapter getAdatperWithdata();\n\n    protected abstract void setUltimateRecyclerViewExtra(final UltimateRecyclerView listview, final adapter madapter);\n\n    @Override\n    public void onAttach(Activity activity) {\n        super.onAttach(activity);\n    }\n\n    @Override\n    public void onAttach(Context activity) {\n        super.onAttach(activity);\n    }\n\n    @Override\n    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n        return inflater.inflate(getFragmentResId(), container, false);\n    }\n\n    @Override\n    @IdRes\n    protected int getUltimate_recycler_viewResId() {\n        return R.id.urv_main_list;\n    }\n\n    @Override\n    @IdRes\n    protected int getRefresherProgressBarId() {\n        return R.id.urv_main_progress_bar;\n    }\n\n    protected abstract int getColumn();\n\n\n    /**\n     * step 1:\n     * takes the arguement form the intent bundle and determine if there is a need to queue a loading process. If that is a yes then we need to load up the data before displaying the list out.\n     *\n     * @param r and the data bundle\n     * @return tells if  there is a loading process to be done before hand\n     */\n    protected abstract boolean onArguments(final Bundle r);\n\n    /**\n     * step 2:\n     * this is the call for the loading the data stream externally\n     *\n     * @param confirmAdapter the adapter\n     */\n    protected abstract void loadDataInitial(final adapter confirmAdapter);\n\n\n    protected void renderviewlayout(View view) throws Exception {\n        listview_layout = (UltimateRecyclerView) view.findViewById(getUltimate_recycler_viewResId());\n        listview_layout.setHasFixedSize(true);\n        listview_layout.setSaveEnabled(true);\n        if (mLayoutManager == null) {\n            mLayoutManager = new GridLayoutManager(view.getContext(), getColumn(), LinearLayoutManager.VERTICAL, false);\n        }\n        listview_layout.setLayoutManager(mLayoutManager);\n        getProgressbar(view);\n        listview_layout.setAdapter(madapter = getAdatperWithdata());\n        setUltimateRecyclerViewExtra(listview_layout, madapter);\n    }\n\n\n    @Override\n    public void onViewCreated(View view, Bundle savedInstanceState) {\n        try {\n            renderviewlayout(view);\n            if (getArguments() != null) {\n                if (onArguments(getArguments())) {\n                    showLoadingCircle();\n                    initPaginator();\n                    loadDataInitial(madapter);\n                }\n            }\n        } catch (Exception e) {\n            Log.d(TAG, e.getMessage());\n        }\n\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/appPaginator/v4/catelogLinear.java",
    "content": "package com.marshalchen.ultimaterecyclerview.appPaginator.v4;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.os.Bundle;\nimport androidx.annotation.IdRes;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.marshalchen.ultimaterecyclerview.R;\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder;\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.easyRegularAdapter;\nimport com.marshalchen.ultimaterecyclerview.layoutmanagers.ScrollSmoothLineaerLayoutManager;\n\n/**\n * Created by hesk on 30/6/15.\n */\npublic abstract class catelogLinear<adapter extends easyRegularAdapter, binder extends UltimateRecyclerviewViewHolder> extends paginator {\n    public static String TAG = \"catelog\";\n    public final static String BRAND_NAME = \"BrandName\", SLUG = \"slug\", REQUEST_TYPE = \"typerequest\";\n    public UltimateRecyclerView listview_layout;\n    public static String URL = \"data_url\";\n    public static String FRAGMENTTITLE = \"fragment_title\";\n    public static String SAVELOADDATA = \"item_list\";\n    public static String HASSAVEFILTER = \"filter\";\n    protected LinearLayoutManager mLayoutManager;\n    protected adapter madapter;\n\n    protected abstract adapter getAdatperWithdata();\n\n    protected abstract void setUltimateRecyclerViewExtra(final UltimateRecyclerView listview, final adapter madapter);\n\n    @Override\n    public void onAttach(Activity activity) {\n        super.onAttach(activity);\n    }\n\n    @Override\n    public void onAttach(Context activity) {\n        super.onAttach(activity);\n    }\n\n    @Override\n    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n        return inflater.inflate(getFragmentResId(), container, false);\n    }\n\n    @IdRes\n    protected int getUltimate_recycler_viewResId() {\n        return R.id.urv_main_list;\n    }\n\n    @IdRes\n    protected int getRefresherProgressBarId() {\n        return R.id.urv_main_progress_bar;\n    }\n\n    /**\n     * step 1:\n     * takes the arguement form the intent bundle and determine if there is a need to queue a loading process. If that is a yes then we need to load up the data before displaying the list out.\n     *\n     * @param r and the data bundle\n     * @return tells if  there is a loading process to be done before hand\n     */\n    protected abstract boolean onArguments(final Bundle r);\n\n    /**\n     * step 2:\n     * this is the call for the loading the data stream externally\n     *\n     * @param confirmAdapter the adapter\n     */\n    protected abstract void loadDataInitial(final adapter confirmAdapter);\n\n\n    protected void renderviewlayout(View view) throws Exception {\n        listview_layout = (UltimateRecyclerView) view.findViewById(getUltimate_recycler_viewResId());\n        listview_layout.setHasFixedSize(true);\n        listview_layout.setSaveEnabled(true);\n        if (mLayoutManager == null) {\n            mLayoutManager = new ScrollSmoothLineaerLayoutManager(view.getContext(), LinearLayoutManager.VERTICAL, false, getSmoothDuration());\n        }\n        listview_layout.setLayoutManager(mLayoutManager);\n        listview_layout.setAdapter(madapter = getAdatperWithdata());\n        getProgressbar(view);\n        setUltimateRecyclerViewExtra(listview_layout, madapter);\n    }\n\n    protected int getSmoothDuration() {\n        return 300;\n    }\n\n    @Override\n    public void onViewCreated(View view, Bundle savedInstanceState) {\n        try {\n            renderviewlayout(view);\n            if (getArguments() != null) {\n                if (onArguments(getArguments())) {\n                    showLoadingCircle();\n                    initPaginator();\n                    loadDataInitial(madapter);\n                }\n            }\n        } catch (Exception e) {\n            Log.d(TAG, e.getMessage());\n        }\n\n    }\n\n\n}"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/appPaginator/v4/paginator.java",
    "content": "package com.marshalchen.ultimaterecyclerview.appPaginator.v4;\n\n\nimport android.os.Build;\nimport androidx.annotation.IdRes;\nimport androidx.annotation.LayoutRes;\nimport androidx.fragment.app.Fragment;\nimport android.view.View;\nimport android.widget.ProgressBar;\n\n/**\n * Created by hesk on 15/2/16.\n */\npublic abstract class paginator extends Fragment {\n\n    private int currentPage, totalPages, pagePerItems, landscape_common_colums = 4, portrait_common_colums = 2;\n    private String tag_keyword, fullEndPoint, searchKeyword;\n    private boolean enable_load_more, is_new_search, status_refresh, status_initization;\n    protected ProgressBar mProgress;\n\n    protected void getProgressbar(View view, @IdRes final int progress_bar_id) {\n        try {\n            mProgress = (ProgressBar) view.findViewById(progress_bar_id);\n        } catch (Exception e) {\n            //unable to find loading progress bar\n        }\n    }\n\n    protected void getProgressbar(View view) {\n        try {\n            mProgress = (ProgressBar) view.findViewById(getRefresherProgressBarId());\n        } catch (Exception e) {\n            //unable to find loading progress bar\n        }\n    }\n\n    public final void cancelInitalization() {\n        status_initization = false;\n    }\n\n    public final boolean isInitization() {\n        return status_initization;\n    }\n\n    public final void setIsStatusRefresh(boolean b) {\n        status_refresh = b;\n    }\n\n    public final boolean isStatusRefresh() {\n        return status_refresh;\n    }\n\n\n    @IdRes\n    protected abstract int getRefresherProgressBarId();\n\n    @IdRes\n    protected abstract int getUltimate_recycler_viewResId();\n\n    @LayoutRes\n    protected abstract int getFragmentResId();\n\n    protected abstract void onClickItem(final String route);\n\n    protected abstract void onClickItem(final long route_id);\n\n\n    protected void showLoadingCircle() {\n        if (mProgress != null) {\n            mProgress.setVisibility(View.VISIBLE);\n            mProgress.animate().alpha(1f);\n        }\n    }\n\n    protected void hideLoadingCircle() {\n        if (mProgress != null && mProgress.getVisibility() == View.VISIBLE) {\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {\n                mProgress.animate().alpha(0f).withEndAction(new Runnable() {\n                    @Override\n                    public void run() {\n                        mProgress.setVisibility(View.INVISIBLE);\n                    }\n                });\n            } else {\n                mProgress.setVisibility(View.INVISIBLE);\n            }\n        }\n    }\n\n    protected int getItemsShownPerPage() {\n        return 16;\n    }\n\n    protected void initPaginator() {\n        currentPage = 1;\n        totalPages = 1;\n        pagePerItems = getItemsShownPerPage();\n        enable_load_more = false;\n        is_new_search = false;\n        status_initization = true;\n    }\n\n\n    public String getSearchKeyword() {\n        return searchKeyword;\n    }\n\n    public void setSearchKeyword(String searchKeyword) {\n        this.searchKeyword = searchKeyword;\n    }\n\n    public String getTagKeyword() {\n        return tag_keyword;\n    }\n\n    public void setTagKeyword(String tag_keyword) {\n        this.tag_keyword = tag_keyword;\n    }\n\n    public String getFullEndPoint() {\n        return fullEndPoint;\n    }\n\n    public void setFullEndPoint(String fullEndPoint) {\n        this.fullEndPoint = fullEndPoint;\n    }\n\n    public boolean isNewSearch() {\n        return is_new_search;\n    }\n\n    public void setEnablNewSearch(boolean is_new_search) {\n        this.is_new_search = is_new_search;\n    }\n\n    protected int getCurrentPage() {\n        return currentPage;\n    }\n\n    protected int getTotalPages() {\n        return totalPages;\n    }\n\n    protected int getPagePerItems() {\n        return pagePerItems;\n    }\n\n    protected void setCurrentPage(int n) {\n        currentPage = n;\n    }\n\n    protected void nextPage() {\n        if (currentPage < totalPages) {\n            enable_load_more = true;\n            currentPage++;\n        }\n    }\n\n    protected void setTotalPages(int n) {\n        totalPages = n;\n        if (currentPage >= totalPages) {\n            enable_load_more = false;\n        } else {\n            enable_load_more = true;\n        }\n    }\n\n    protected boolean shouldEnableLoadMore() {\n        return enable_load_more;\n    }\n\n    public void triggerNewSearchKeyWord(String word) {\n        setEnablNewSearch(true);\n        setSearchKeyword(word);\n    }\n\n    protected abstract void makeBasicRequest();\n\n    protected abstract void makeRefreshRequest();\n\n    protected void makeNextRequest() {\n        nextPage();\n        makeBasicRequest();\n    }\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/dragsortadapter/DragInfo.java",
    "content": "package com.marshalchen.ultimaterecyclerview.dragsortadapter;\n\nimport android.graphics.Point;\nimport android.graphics.PointF;\n\npublic class DragInfo {\n  private final long itemId;\n  private final Point shadowSize;\n  private final Point shadowTouchPoint;\n  private final PointF dragPoint;\n\n  public DragInfo(long itemId, Point shadowSize, Point shadowTouchPoint, PointF dragPoint) {\n    this.itemId = itemId;\n    this.shadowSize = new Point(shadowSize);\n    this.shadowTouchPoint = new Point(shadowTouchPoint);\n    this.dragPoint = dragPoint;\n  }\n\n  public  long itemId() {\n    return itemId;\n  }\n\n  public boolean shouldScrollLeft() {\n    return dragPoint.x < shadowTouchPoint.x;\n  }\n\n  public boolean shouldScrollRight(int parentWidth) {\n    return dragPoint.x > (parentWidth - (shadowSize.x - shadowTouchPoint.x));\n  }\n\n  public boolean shouldScrollUp() {\n    return dragPoint.y < shadowTouchPoint.y;\n  }\n\n  public boolean shouldScrollDown(int parentHeight) {\n    return dragPoint.y > (parentHeight - (shadowSize.y - shadowTouchPoint.y));\n  }\n\n  public void setDragPoint(float x, float y) {\n    dragPoint.set(x, y);\n  }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/dragsortadapter/DragManager.java",
    "content": "package com.marshalchen.ultimaterecyclerview.dragsortadapter;\n\nimport android.graphics.PointF;\nimport androidx.annotation.Nullable;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.DragEvent;\nimport android.view.View;\nimport java.lang.ref.WeakReference;\n\nimport static java.lang.Float.MIN_VALUE;\n\npublic class DragManager implements View.OnDragListener {\n\n  private final WeakReference<RecyclerView> recyclerViewRef;\n  private final DragSortAdapter<?> adapter;\n  private long draggingId = RecyclerView.NO_ID;\n  private final PointF nextMoveTouchPoint = new PointF(MIN_VALUE, MIN_VALUE);\n  @Nullable private DragInfo lastDragInfo;\n\n  public DragManager(RecyclerView recyclerView, DragSortAdapter<?> adapter) {\n    this.recyclerViewRef = new WeakReference<>(recyclerView);\n    this.adapter = adapter;\n  }\n\n  @Override public boolean onDrag(View v, DragEvent event) {\n    if (v != recyclerViewRef.get() || !(event.getLocalState() instanceof DragInfo)) {\n      return false;\n    }\n    final RecyclerView recyclerView = (RecyclerView) v;\n    final DragInfo dragInfo = (DragInfo) event.getLocalState();\n    final long itemId = dragInfo.itemId();\n\n    switch (event.getAction()) {\n      case DragEvent.ACTION_DRAG_STARTED:\n        draggingId = itemId;\n          adapter.notifyItemChanged(recyclerView.findViewHolderForItemId(itemId).getAdapterPosition());\n        break;\n\n      case DragEvent.ACTION_DRAG_LOCATION:\n        float x = event.getX();\n        float y = event.getY();\n\n        int fromPosition = adapter.getPositionForId(itemId);\n        int toPosition = -1;\n\n        View child = recyclerView.findChildViewUnder(event.getX(), event.getY());\n        if (child != null) {\n          toPosition = recyclerView.getChildViewHolder(child).getAdapterPosition();\n        }\n\n        if (toPosition >= 0 && fromPosition != toPosition) {\n          RecyclerView.ItemAnimator animator = recyclerView.getItemAnimator();\n\n          boolean scheduleNextMove = nextMoveTouchPoint.equals(MIN_VALUE, MIN_VALUE);\n          nextMoveTouchPoint.set(x, y);\n\n          if (scheduleNextMove)\n            animator.isRunning(new RecyclerView.ItemAnimator.ItemAnimatorFinishedListener() {\n              @Override public void onAnimationsFinished() {\n                if (nextMoveTouchPoint.equals(MIN_VALUE, MIN_VALUE)) { return; }\n\n                final int fromPosition = adapter.getPositionForId(itemId);\n\n                View child = recyclerView\n                    .findChildViewUnder(nextMoveTouchPoint.x, nextMoveTouchPoint.y);\n                if (child != null) {\n                  final int toPosition =\n                      recyclerView.getChildViewHolder(child).getAdapterPosition();\n                  if (adapter.move(fromPosition, toPosition)) {\n\n                    if (fromPosition == 0 || toPosition == 0) {\n                      // fix for weird scrolling when animating first item\n                      recyclerView.scrollToPosition(0);\n                    }\n\n                    recyclerView.post(new Runnable() {\n                      @Override public void run() {\n                        adapter.notifyItemMoved(fromPosition, toPosition);\n                      }\n                    });\n                  }\n                }\n\n                // reset so we know to schedule listener again next time\n                clearNextMove();\n              }\n            });\n        }\n\n        lastDragInfo = dragInfo;\n        lastDragInfo.setDragPoint(x, y);\n        adapter.handleDragScroll(recyclerView, dragInfo);\n        break;\n\n      case DragEvent.ACTION_DRAG_ENDED:\n        draggingId = RecyclerView.NO_ID;\n        lastDragInfo = null;\n\n        // queue up the show animation until after all move animations are finished\n        recyclerView.getItemAnimator().isRunning(\n            new RecyclerView.ItemAnimator.ItemAnimatorFinishedListener() {\n              @Override public void onAnimationsFinished() {\n                int position = adapter.getPositionForId(itemId);\n\n                RecyclerView.ViewHolder vh = recyclerView.findViewHolderForItemId(itemId);\n                if (vh != null && vh.getAdapterPosition() != position) {\n                  // if positions don't match, there's still an outstanding move animation\n                  // so we try to reschedule the notifyItemChanged until after that\n                  recyclerView.post(new Runnable() {\n                    @Override public void run() {\n                      recyclerView.getItemAnimator().isRunning(\n                          new RecyclerView.ItemAnimator.ItemAnimatorFinishedListener() {\n                            @Override public void onAnimationsFinished() {\n                              adapter.notifyItemChanged(adapter.getPositionForId(itemId));\n                            }\n                          });\n                    }\n                  });\n                } else {\n                  adapter.notifyItemChanged(adapter.getPositionForId(itemId));\n                }\n              }\n            });\n        break;\n\n      case DragEvent.ACTION_DROP:\n        adapter.onDrop();\n        break;\n\n      case DragEvent.ACTION_DRAG_ENTERED:\n        // probably not used?\n        break;\n      case DragEvent.ACTION_DRAG_EXITED:\n        // TODO edge scrolling\n        break;\n    }\n    return true;\n  }\n\n  public void clearNextMove() {\n    nextMoveTouchPoint.set(MIN_VALUE, MIN_VALUE);\n  }\n\n public  long getDraggingId() { return draggingId; }\n\n  @Nullable public DragInfo getLastDragInfo() { return lastDragInfo; }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/dragsortadapter/DragSortAdapter.java",
    "content": "/*\n * Copyright (C) 2015 Vincent Mi\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.marshalchen.ultimaterecyclerview.dragsortadapter;\n\nimport android.annotation.TargetApi;\nimport android.content.res.Resources;\nimport android.graphics.Point;\nimport android.graphics.PointF;\nimport android.os.Build;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.MotionEvent;\nimport android.view.View;\n\npublic abstract class DragSortAdapter<VH extends DragSortAdapter.ViewHolder>\n        extends RecyclerView.Adapter<VH> {\n\n    private static final String TAG = DragSortAdapter.class.getSimpleName();\n\n    private final int SCROLL_AMOUNT = (int) (2 * Resources.getSystem().getDisplayMetrics().density);\n\n    private final DragManager dragManager;\n    private int scrollState = RecyclerView.SCROLL_STATE_IDLE;\n    private final PointF lastTouchPoint = new PointF(); // used to create ShadowBuilder\n\n    @TargetApi(Build.VERSION_CODES.HONEYCOMB)\n    public DragSortAdapter(RecyclerView recyclerView) {\n        setHasStableIds(true);\n\n        dragManager = new DragManager(recyclerView, this);\n        recyclerView.setOnDragListener(dragManager);\n\n        recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {\n            @Override\n            public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {\n                lastTouchPoint.set(e.getX(), e.getY());\n                return false;\n            }\n\n            @Override\n            public void onTouchEvent(RecyclerView rv, MotionEvent e) {\n            }\n\n            @Override\n            public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {\n\n            }\n        });\n\n        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {\n            @Override\n            public void onScrolled(final RecyclerView recyclerView, int dx, int dy) {\n                recyclerView.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        handleScroll(recyclerView);\n                    }\n                });\n            }\n\n            @Override\n            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {\n                scrollState = newState;\n                switch (newState) {\n                    case RecyclerView.SCROLL_STATE_IDLE:\n                        handleScroll(recyclerView);\n                        break;\n                    case RecyclerView.SCROLL_STATE_DRAGGING:\n                    case RecyclerView.SCROLL_STATE_SETTLING:\n                        break;\n                }\n            }\n        });\n    }\n\n    /**\n     * This should be reasonably performant as it gets called a lot on the UI thread.\n     *\n     * @param id na\n     * @return position of the item with the given id\n     */\n    public abstract int getPositionForId(long id);\n\n    /**\n     * This is called during the dragging event, the actual positions of the views and data need to\n     * change in the adapter for the drag animations to look correct.\n     *\n     * @param fromPosition from position\n     * @param toPosition   to position\n     * @return true if the position can be moved from fromPosition to toPosition\n     */\n    public abstract boolean move(int fromPosition, int toPosition);\n\n    /**\n     * Called after a drop event, override to save changes after drop event.\n     */\n    public void onDrop() {\n    }\n\n    /**\n     * You probably want to use this to set the currently dragging item to blank while it's being\n     * dragged\n     *\n     * @return the id of the item currently being dragged or {@code RecyclerView.NO_ID } if not being\n     * dragged\n     */\n    public long getDraggingId() {\n        return dragManager.getDraggingId();\n    }\n\n    /**\n     * @return PointF\n     */\n    public PointF getLastTouchPoint() {\n        return new PointF(lastTouchPoint.x, lastTouchPoint.y);\n    }\n\n    private void handleScroll(RecyclerView recyclerView) {\n        if (scrollState != RecyclerView.SCROLL_STATE_IDLE) {\n            return;\n        }\n        DragInfo lastDragInfo = dragManager.getLastDragInfo();\n        if (lastDragInfo != null) {\n            handleDragScroll(recyclerView, lastDragInfo);\n        }\n    }\n\n    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)\n    void handleDragScroll(RecyclerView rv, DragInfo dragInfo) {\n        if (rv.getLayoutManager().canScrollHorizontally()) {\n            if (rv.canScrollHorizontally(-1) && dragInfo.shouldScrollLeft()) {\n                rv.scrollBy(-SCROLL_AMOUNT, 0);\n                dragManager.clearNextMove();\n            } else if (rv.canScrollHorizontally(1) && dragInfo.shouldScrollRight(rv.getWidth())) {\n                rv.scrollBy(SCROLL_AMOUNT, 0);\n                dragManager.clearNextMove();\n            }\n        } else if (rv.getLayoutManager().canScrollVertically()) {\n            if (rv.canScrollVertically(-1) && dragInfo.shouldScrollUp()) {\n                rv.scrollBy(0, -SCROLL_AMOUNT);\n                dragManager.clearNextMove();\n            } else if (rv.canScrollVertically(1) && dragInfo.shouldScrollDown(rv.getHeight())) {\n                rv.scrollBy(0, SCROLL_AMOUNT);\n                dragManager.clearNextMove();\n            }\n        }\n    }\n\n    public static abstract class ViewHolder extends RecyclerView.ViewHolder {\n\n        final DragSortAdapter<?> adapter;\n\n        public ViewHolder(DragSortAdapter<?> dragSortAdapter, View itemView) {\n            super(itemView);\n            this.adapter = dragSortAdapter;\n        }\n\n        @TargetApi(Build.VERSION_CODES.HONEYCOMB)\n        public final void startDrag() {\n            PointF touchPoint = adapter.getLastTouchPoint();\n            int x = (int) (touchPoint.x - itemView.getX());\n            int y = (int) (touchPoint.y - itemView.getY());\n\n            startDrag(getShadowBuilder(itemView, new Point(x, y)));\n        }\n\n        public View.DragShadowBuilder getShadowBuilder(View itemView, Point touchPoint) {\n            return new DragSortShadowBuilder(itemView, touchPoint);\n        }\n\n        @TargetApi(Build.VERSION_CODES.HONEYCOMB)\n        public final void startDrag(View.DragShadowBuilder dragShadowBuilder) {\n            Point shadowSize = new Point();\n            Point shadowTouchPoint = new Point();\n            dragShadowBuilder.onProvideShadowMetrics(shadowSize, shadowTouchPoint);\n\n            itemView.startDrag(null, dragShadowBuilder,\n                    new DragInfo(getItemId(), shadowSize, shadowTouchPoint, adapter.getLastTouchPoint()), 0);\n\n            adapter.notifyItemChanged(getAdapterPosition());\n        }\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/dragsortadapter/DragSortShadowBuilder.java",
    "content": "/*\n * Copyright (C) 2015 Vincent Mi\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.marshalchen.ultimaterecyclerview.dragsortadapter;\n\nimport android.annotation.TargetApi;\nimport android.graphics.Canvas;\nimport android.graphics.Point;\nimport android.os.Build;\nimport androidx.annotation.NonNull;\nimport android.util.Log;\nimport android.view.View;\n\n@TargetApi(Build.VERSION_CODES.HONEYCOMB)\npublic class DragSortShadowBuilder extends View.DragShadowBuilder {\n\n  public static final String TAG = DragSortShadowBuilder.class.getSimpleName();\n\n  final Point touchPoint = new Point();\n\n  public DragSortShadowBuilder(View view, Point touchPoint) {\n    super(view);\n    this.touchPoint.set(touchPoint.x, touchPoint.y);\n  }\n\n  @Override\n  public void onProvideShadowMetrics(@NonNull Point shadowSize, @NonNull Point shadowTouchPoint) {\n    final View view = getView();\n    if (view != null) {\n      shadowSize.set(view.getWidth(), view.getHeight());\n      shadowTouchPoint.set(touchPoint.x, touchPoint.y);\n    } else {\n      Log.e(TAG, \"Asked for drag thumb metrics but no view\");\n    }\n  }\n\n  @Override public void onDrawShadow(@NonNull Canvas canvas) {\n    super.onDrawShadow(canvas);\n  }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/dragsortadapter/NoForegroundShadowBuilder.java",
    "content": "package com.marshalchen.ultimaterecyclerview.dragsortadapter;\n\nimport android.graphics.Canvas;\nimport android.graphics.Point;\nimport android.graphics.drawable.Drawable;\nimport androidx.annotation.NonNull;\nimport android.util.Log;\nimport android.view.View;\nimport android.widget.FrameLayout;\nimport java.lang.ref.WeakReference;\n\npublic class NoForegroundShadowBuilder extends DragSortShadowBuilder {\n\n  private final WeakReference<View> viewRef;\n\n  public NoForegroundShadowBuilder(View view, Point touchPoint) {\n    super(view, touchPoint);\n    this.viewRef = new WeakReference<>(view);\n  }\n\n  @Override public void onDrawShadow(@NonNull Canvas canvas) {\n    final View view = viewRef.get();\n    if (view != null) {\n      Drawable foreground = null;\n\n      // remove foreground before canvas draw\n      if (view instanceof FrameLayout && ((FrameLayout) view).getForeground() != null) {\n        foreground = ((FrameLayout) view).getForeground();\n        ((FrameLayout) view).setForeground(null);\n      }\n\n      view.draw(canvas);\n\n      // reset foreground if it was removed\n      if (foreground != null) {\n        ((FrameLayout) view).setForeground(foreground);\n      }\n\n    } else {\n      Log.e(TAG, \"Asked to draw drag shadow but no view\");\n    }\n  }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/expanx/ExpandableItemData.java",
    "content": "package com.marshalchen.ultimaterecyclerview.expanx;\r\n\r\nimport java.util.List;\r\n\r\n/**\r\n * Author Zheng Haibo\r\n * PersonalWebsite http://www.mobctrl.net\r\n * Description the bundle of the tree view style\r\n * enhanced by Hesk 2015\r\n * used with LinearExpandableURVAdapter\r\n */\r\npublic class ExpandableItemData<T extends ExpandableItemData> implements Comparable<T> {\r\n    private String uuid;\r\n    private int type;\r\n    private String text;\r\n    private String path;\r\n    private int treeDepth = 0;\r\n    private List<T> children;\r\n    private boolean expand;\r\n\r\n    public boolean isExpand() {\r\n        return expand;\r\n    }\r\n\r\n    public void setExpand(boolean expand) {\r\n        this.expand = expand;\r\n    }\r\n\r\n    public int getType() {\r\n        return type;\r\n    }\r\n\r\n    public void setType(int type) {\r\n        this.type = type;\r\n    }\r\n\r\n    public String getText() {\r\n        return text;\r\n    }\r\n\r\n    public void setText(String text) {\r\n        this.text = text;\r\n    }\r\n\r\n    public List<T> getChildren() {\r\n        return children;\r\n    }\r\n\r\n    public void setChildren(List<T> children) {\r\n        this.children = children;\r\n    }\r\n\r\n    public ExpandableItemData(int type, String text, String path, String uuid,\r\n                              int treeDepth, List<T> children) {\r\n        super();\r\n        this.type = type;\r\n        this.text = text;\r\n        this.uuid = uuid;\r\n        this.path = path;\r\n        this.treeDepth = treeDepth;\r\n        this.children = children;\r\n    }\r\n\r\n    public ExpandableItemData() {\r\n\r\n    }\r\n\r\n    public String getUuid() {\r\n        return uuid;\r\n    }\r\n\r\n    public void setUuid(String uuid) {\r\n        this.uuid = uuid;\r\n    }\r\n\r\n    public String getPath() {\r\n        return path;\r\n    }\r\n\r\n    public void setPath(String path) {\r\n        this.path = path;\r\n    }\r\n\r\n    public int getTreeDepth() {\r\n        return treeDepth;\r\n    }\r\n\r\n    public void setTreeDepth(int treeDepth) {\r\n        this.treeDepth = treeDepth;\r\n    }\r\n\r\n    @Override\r\n    public int compareTo(ExpandableItemData another) {\r\n        return this.getText().compareTo(another.getText());\r\n    }\r\n\r\n}"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/expanx/LinearExpanxURVAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.expanx;\n\nimport android.content.Context;\nimport androidx.annotation.LayoutRes;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateViewAdapter;\nimport com.marshalchen.ultimaterecyclerview.expanx.Util.BaseViewHolder;\nimport com.marshalchen.ultimaterecyclerview.expanx.Util.ChildVH;\nimport com.marshalchen.ultimaterecyclerview.expanx.Util.ItemDataClickListener;\nimport com.marshalchen.ultimaterecyclerview.expanx.Util.OnScrollToListener;\nimport com.marshalchen.ultimaterecyclerview.expanx.Util.ParentVH;\nimport com.marshalchen.ultimaterecyclerview.expanx.Util.child;\nimport com.marshalchen.ultimaterecyclerview.expanx.Util.parent;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by hesk on 16/7/15.\n */\npublic abstract class LinearExpanxURVAdapter<T extends ExpandableItemData, G extends parent<T>, H extends child<T>> extends UltimateViewAdapter {\n\n    public class ExpandableViewTypes extends VIEW_TYPES {\n\n        public static final int ITEM_TYPE_PARENT = 1026;\n        public static final int ITEM_TYPE_CHILD = 1135;\n\n        protected ExpandableViewTypes() {\n            super();\n        }\n    }\n\n    private Context mContext;\n    private List<T> mDataSet;\n    private List<OnScrollToListener> monScrollToListenerList = new ArrayList<>();\n    private OnScrollToListener onScrollToListener;\n    public static final String TAG = \"expAdapter\";\n    protected int expandableBehavior = 0;\n    public static final int EXPANDABLE_ITEMS = 1;\n    public static final int EXPANDABLE_SYSTEM = 0;\n    private boolean customObject;\n\n    protected Context getContext() {\n        return mContext;\n    }\n\n\n    protected List<T> getSet() {\n        return mDataSet;\n    }\n\n    public void addOnScrollToListener(OnScrollToListener onScrollToListener) {\n        this.monScrollToListenerList.add(onScrollToListener);\n    }\n\n    @Deprecated\n    public void setOnScrollToListener(OnScrollToListener onScrollToListener) {\n        this.onScrollToListener = onScrollToListener;\n    }\n\n    public LinearExpanxURVAdapter(Context context, final int clickhandler, final boolean customholder) {\n        this(context, clickhandler);\n        this.customObject = customholder;\n    }\n\n    public LinearExpanxURVAdapter(Context context, final int clickhandler) {\n        this(context);\n        expandableBehavior = clickhandler;\n    }\n\n\n    public LinearExpanxURVAdapter(Context context) {\n        mContext = context;\n        mDataSet = new ArrayList<>();\n        customObject = false;\n    }\n\n\n    /**\n     * please do work on this id the custom object is true\n     *\n     * @param parentview the inflated view\n     * @return the actual parent holder\n     */\n    protected abstract G iniCustomParentHolder(View parentview);\n\n    /**\n     * please do work on this if the custom object is true\n     *\n     * @param childview the inflated view\n     * @return the actual child holder\n     */\n    protected abstract H iniCustomChildHolder(View childview);\n\n    private View initiateview(ViewGroup parent, final @LayoutRes int layout) {\n        return LayoutInflater.from(parent.getContext()).inflate(layout, parent, false);\n    }\n\n    protected abstract int getLayoutResParent();\n\n    protected abstract int getLayoutResChild();\n\n    @Override\n    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        switch (viewType) {\n            case ExpandableViewTypes.ITEM_TYPE_PARENT:\n                return iniCustomParentHolder(initiateview(parent, getLayoutResParent()));\n\n            case ExpandableViewTypes.ITEM_TYPE_CHILD:\n                return iniCustomChildHolder(initiateview(parent, getLayoutResChild()));\n\n            default:\n                return null;\n        }\n    }\n\n    private ItemDataClickListener getBehavior() {\n        switch (expandableBehavior) {\n            case EXPANDABLE_ITEMS:\n                return imageSetLoadItems;\n            default:\n                return imageClickListener;\n        }\n    }\n\n\n    @Override\n    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {\n        switch (getItemViewType(position)) {\n            case ExpandableViewTypes.ITEM_TYPE_PARENT:\n                ParentVH imageViewHolder = (ParentVH) holder;\n                imageViewHolder.bindView(mDataSet.get(position), position, getBehavior());\n                break;\n            case ExpandableViewTypes.ITEM_TYPE_CHILD:\n                ChildVH textViewHolder = (ChildVH) holder;\n                textViewHolder.bindView(mDataSet.get(position), position);\n                break;\n            default:\n                break;\n        }\n    }\n\n\n    @Override\n    public BaseViewHolder onCreateViewHolder(ViewGroup viewGroup) {\n        return new BaseViewHolder(viewGroup);\n    }\n\n    private void triggerBoardCastEventScrollTo(final int n) {\n        for (int i = 0; i < monScrollToListenerList.size(); i++) {\n            OnScrollToListener m = monScrollToListenerList.get(i);\n            m.scrollTo(n);\n        }\n    }\n\n    private void triggerSingleEventScrollTo(final int n) {\n        if (onScrollToListener != null) {\n            onScrollToListener.scrollTo(n);\n        }\n    }\n\n    protected abstract List<T> getChildrenByPath(String path, int depth, final int position);\n\n\n    @Override\n    public RecyclerView.ViewHolder onCreateHeaderViewHolder(ViewGroup viewGroup) {\n        return null;\n    }\n\n    @Override\n    public void onBindHeaderViewHolder(RecyclerView.ViewHolder viewHolder, int i) {\n\n    }\n\n    @Override\n    public int getItemCount() {\n        return mDataSet.size();\n    }\n\n    /**\n     * this is the only number coming from the data size\n     *\n     * @return the integer from the list count\n     */\n    @Override\n    public int getAdapterItemCount() {\n        return getItemCount();\n    }\n\n    @Override\n    public long generateHeaderId(int i) {\n        return 0;\n    }\n\n    private int getChildrenCount(T item) {\n        List<Object> list = new ArrayList<>();\n        printChild(item, list);\n        return list.size();\n    }\n\n    private void printChild(Object item, List<Object> list) {\n        list.add(item);\n        if (item instanceof ExpandableItemData) {\n            ExpandableItemData it = (ExpandableItemData) item;\n            if (it.getChildren() != null) {\n                for (int i = 0; i < it.getChildren().size(); i++) {\n                    printChild(it.getChildren().get(i), list);\n                }\n            }\n        }\n\n    }\n\n    /**\n     * 从position开始删除，删除\n     *\n     * @param position  the count position\n     * @param itemCount 删除的数目\n     */\n    protected void removeAll(int position, int itemCount) {\n        for (int i = 0; i < itemCount; i++) {\n            mDataSet.remove(position);\n        }\n        notifyItemRangeRemoved(position, itemCount);\n    }\n\n    /**\n     * the current position from the uuid\n     *\n     * @param uuid the string in uuid\n     * @return the int as the position\n     */\n    protected int getCurrentPosition(String uuid) {\n        for (int i = 0; i < mDataSet.size(); i++) {\n            if (uuid.equalsIgnoreCase(mDataSet.get(i).getUuid())) {\n                return i;\n            }\n        }\n        return -1;\n    }\n\n    @Override\n    public int getItemViewType(int position) {\n        return mDataSet.get(position).getType();\n    }\n\n    public void add(T text, int position) {\n        mDataSet.add(position, text);\n        notifyItemInserted(position);\n    }\n\n    public void addAll(List<T> list, int position) {\n        mDataSet.addAll(position, list);\n        notifyItemRangeInserted(position, list.size());\n    }\n\n    public void delete(int pos) {\n        if (pos >= 0 && pos < mDataSet.size()) {\n            if (mDataSet.get(pos).getType() == ExpandableViewTypes.ITEM_TYPE_PARENT\n                    && mDataSet.get(pos).isExpand()) {\n                for (int i = 0; i < mDataSet.get(pos).getChildren().size() + 1; i++) {\n                    mDataSet.remove(pos);\n                }\n                notifyItemRangeRemoved(pos, mDataSet.get(pos).getChildren()\n                        .size() + 1);\n            } else {\n                mDataSet.remove(pos);\n                notifyItemRemoved(pos);\n            }\n        }\n    }\n\n\n    /**\n     * the item click behavior and list item handler cases\n     */\n\n    private ItemDataClickListener imageSetLoadItems = new ItemDataClickListener<T>() {\n        @Override\n        public void onExpandChildren(T itemData) {\n            int position = getCurrentPosition(itemData.getUuid());\n            List<T> children = itemData.getChildren();\n            if (children == null) {\n                return;\n            }\n            addAll(children, position + 1);\n            triggerSingleEventScrollTo(position + 1);\n            triggerBoardCastEventScrollTo(position + 1);\n        }\n\n        @Override\n        public void onHideChildren(T itemData) {\n            int position = getCurrentPosition(itemData.getUuid());\n            List<T> children = itemData.getChildren();\n            if (children == null) {\n                return;\n            }\n            removeAll(position + 1, getChildrenCount(itemData) - 1);\n            triggerSingleEventScrollTo(position);\n            triggerBoardCastEventScrollTo(position);\n        }\n    };\n    private ItemDataClickListener imageClickListener = new ItemDataClickListener<T>() {\n\n        @Override\n        public void onExpandChildren(T itemData) {\n            int position = getCurrentPosition(itemData.getUuid());\n            List<T> children = getChildrenByPath(itemData.getPath(), itemData.getTreeDepth(), position);\n            if (children == null) {\n                return;\n            }\n\n            addAll(children, position + 1);\n            itemData.setChildren(children);\n            triggerSingleEventScrollTo(position + 1);\n            triggerBoardCastEventScrollTo(position + 1);\n        }\n\n        @Override\n        public void onHideChildren(T itemData) {\n            int position = getCurrentPosition(itemData.getUuid());\n            List<T> children = itemData.getChildren();\n            if (children == null) {\n                return;\n            }\n            removeAll(position + 1, getChildrenCount(itemData) - 1);\n            triggerSingleEventScrollTo(position);\n            triggerBoardCastEventScrollTo(position);\n            itemData.setChildren(null);\n        }\n    };\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/expanx/SmartItem.java",
    "content": "package com.marshalchen.ultimaterecyclerview.expanx;\n\nimport android.content.Context;\nimport androidx.annotation.StringRes;\n\nimport java.util.List;\nimport java.util.UUID;\n\n/**\n * Created by hesk on 8/7/15.\n * JJHESK MIT LICNESE\n * based on library https://github.com/jjhesk/BringItBackAdvanceSlidingMenu\n */\npublic class SmartItem extends ExpandableItemData {\n    /**\n     * construct the basic view type\n     *\n     * @param type     LinearExpandableURVAdapter.ExpandableViewTypes.VIEW_TYPES\n     * @param text     the normal string\n     * @param path     the path of the text or link\n     * @param depth    the deep\n     * @param children the children list\n     */\n    public SmartItem(int type, String text, String path, int depth, List<SmartItem> children) {\n        super(type, text, path, UUID.randomUUID().toString(), depth, children);\n    }\n\n    public static SmartItem parent(final String title, final String path, final List<SmartItem> carrying_list) {\n        return new SmartItem(LinearExpanxURVAdapter.ExpandableViewTypes.ITEM_TYPE_PARENT, title, path, 0, carrying_list);\n    }\n\n    public static SmartItem parent(final Context ctx, final @StringRes int title, final String path, final List<SmartItem> carrying_list) {\n        return new SmartItem(LinearExpanxURVAdapter.ExpandableViewTypes.ITEM_TYPE_PARENT,\n                ctx.getResources().getString(title), path, 0, carrying_list);\n    }\n\n    public static SmartItem child(final String title, final String path) {\n        return new SmartItem(LinearExpanxURVAdapter.ExpandableViewTypes.ITEM_TYPE_CHILD, title, path, 1, null);\n    }\n\n    public static SmartItem child(final Context ctx, final @StringRes int title, final String path) {\n        return new SmartItem(LinearExpanxURVAdapter.ExpandableViewTypes.ITEM_TYPE_CHILD, ctx.getResources().getString(title), path, 1, null);\n    }\n\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/expanx/Util/BaseViewHolder.java",
    "content": "package com.marshalchen.ultimaterecyclerview.expanx.Util;\r\n\r\nimport android.content.Context;\r\nimport androidx.annotation.LayoutRes;\r\nimport android.view.LayoutInflater;\r\nimport android.view.View;\r\nimport android.view.ViewGroup;\r\nimport android.widget.ImageView;\r\nimport android.widget.RelativeLayout;\r\nimport android.widget.TextView;\r\n\r\nimport com.marshalchen.ultimaterecyclerview.R;\r\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder;\r\nimport com.marshalchen.ultimaterecyclerview.expanx.ExpandableItemData;\r\n\r\n/**\r\n * Author Ultimate Enhancer Hesk\r\n * PersonalWebsite jjhesk on github\r\n * Description\r\n */\r\npublic class BaseViewHolder<T extends ExpandableItemData> extends UltimateRecyclerviewViewHolder {\r\n\r\n    public BaseViewHolder(View itemView) {\r\n        super(itemView);\r\n        getMarginBy();\r\n    }\r\n\r\n    protected View getView(final Context m, final ViewGroup parent, final @LayoutRes int layout) {\r\n        return LayoutInflater.from(m).inflate(layout, parent, false);\r\n    }\r\n\r\n    protected int itemMargin, itemMarginRes;\r\n    protected int offsetMargin, offsetMarginRes;\r\n\r\n\r\n    protected void getMarginBy() {\r\n        //  itemView.getContext().obtainStyledAttributes(Theme.)\r\n        itemMargin = itemView.getContext().\r\n                getResources().getDimensionPixelSize(R.dimen.item_margin);\r\n        offsetMargin = itemView.getContext().\r\n                getResources().getDimensionPixelSize(R.dimen.expand_size);\r\n    }\r\n\r\n    protected RelativeLayout.LayoutParams getParamsLayoutOffset(ImageView image, T itemData) {\r\n        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) image.getLayoutParams();\r\n        params.leftMargin = itemMargin * itemData.getTreeDepth() + offsetMargin;\r\n        return params;\r\n    }\r\n\r\n    protected RelativeLayout.LayoutParams getParamsLayoutOffset(RelativeLayout layout, ExpandableItemData itemData) {\r\n        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) layout.getLayoutParams();\r\n        params.leftMargin = itemMargin * itemData.getTreeDepth() + offsetMargin;\r\n        return params;\r\n    }\r\n\r\n    protected RelativeLayout.LayoutParams getParamsLayoutOffset(TextView layout, T itemData) {\r\n        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) layout.getLayoutParams();\r\n        params.leftMargin = itemMargin * itemData.getTreeDepth() + offsetMargin;\r\n        return params;\r\n    }\r\n\r\n\r\n    protected RelativeLayout.LayoutParams getParamsLayout(TextView layout, T itemData) {\r\n        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) layout.getLayoutParams();\r\n        params.leftMargin = itemMargin * itemData.getTreeDepth();\r\n        //    layout.setLayoutParams();\r\n        return params;\r\n        //   layout.setMar\r\n    }\r\n\r\n    protected RelativeLayout.LayoutParams getParamsLayout(ImageView image, T itemData) {\r\n        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) image.getLayoutParams();\r\n        params.leftMargin = itemMargin * itemData.getTreeDepth();\r\n        return params;\r\n    }\r\n\r\n    protected RelativeLayout.LayoutParams getParamsLayout(RelativeLayout layout, T itemData) {\r\n        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) layout.getLayoutParams();\r\n        params.leftMargin = itemMargin * itemData.getTreeDepth();\r\n        return params;\r\n    }\r\n\r\n\r\n}\r\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/expanx/Util/ChildClickListener.java",
    "content": "package com.marshalchen.ultimaterecyclerview.expanx.Util;\n\n/**\n * Created by hesk on 14/7/15.\n */\npublic interface ChildClickListener {\n    void onClickSubMenuItem(final String[] bypath, final String fullpath);\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/expanx/Util/ChildVH.java",
    "content": "package com.marshalchen.ultimaterecyclerview.expanx.Util;\n\nimport com.marshalchen.ultimaterecyclerview.expanx.ExpandableItemData;\n\n/**\n * Created by hesk on 10/7/15.\n */\npublic interface ChildVH<bindData extends ExpandableItemData> {\n    void bindView(final bindData itemData, int position);\n\n    void onChildItemClick(final String title, final String path);\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/expanx/Util/DataUtil.java",
    "content": "package com.marshalchen.ultimaterecyclerview.expanx.Util;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.net.Uri;\nimport android.util.Log;\nimport android.webkit.MimeTypeMap;\nimport android.widget.Toast;\n\nimport com.marshalchen.ultimaterecyclerview.expanx.ExpandableItemData;\nimport com.marshalchen.ultimaterecyclerview.expanx.LinearExpanxURVAdapter;\nimport com.marshalchen.ultimaterecyclerview.expanx.SmartItem;\n\nimport java.io.File;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.UUID;\n\n/**\n * Created by hesk on 16/7/15.\n */\npublic class DataUtil {\n    public final static String TAG = \"TreeList\";\n\n    public static List<SmartItem> getSmallList(final String[] list) {\n        final List<SmartItem> items = new ArrayList<>();\n        for (int i = 0; i < list.length - 2; i = i + 2) {\n            items.add(SmartItem.child(list[i], list[i + 1]));\n        }\n        return items;\n    }\n\n    /**\n     *\n     *\n     * @param path      path\n     * @param treeDepth treedepth\n     * @return the list object\n     */\n    public static List<ExpandableItemData> getChildrenByPath(String path, int treeDepth) {\n        treeDepth++;\n        try {\n            List<ExpandableItemData> list = new ArrayList<>();\n            File file = new File(path);\n            File[] children = file.listFiles();\n            List<ExpandableItemData> fileList = new ArrayList<>();\n            for (File child : children) {\n                if (child.isDirectory()) {\n                    list.add(new ExpandableItemData(LinearExpanxURVAdapter.ExpandableViewTypes.ITEM_TYPE_PARENT, child\n                            .getName(), child.getAbsolutePath(), UUID\n                            .randomUUID().toString(), treeDepth, null));\n                } else {\n                    fileList.add(new ExpandableItemData(LinearExpanxURVAdapter.ExpandableViewTypes.ITEM_TYPE_CHILD, child\n                            .getName(), child.getAbsolutePath(), UUID\n                            .randomUUID().toString(), treeDepth, null));\n                }\n            }\n            Collections.sort(list);\n            Collections.sort(fileList);\n            list.addAll(fileList);\n            return list;\n        } catch (Exception e) {\n            Log.d(TAG, \"get child error:\" + e.getMessage());\n        }\n        return null;\n    }\n\n    public static void openFileInSystem(String path, Context context) {\n        try {\n            MimeTypeMap myMime = MimeTypeMap.getSingleton();\n            Intent newIntent = new Intent(Intent.ACTION_VIEW);\n            String mimeType = myMime.getMimeTypeFromExtension(fileExt(path).substring(1));\n            newIntent.setDataAndType(Uri.fromFile(new File(path)), mimeType);\n            newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n            context.startActivity(newIntent);\n        } catch (Exception e) {\n            Toast.makeText(context, \"No handler for this type of file.\", Toast.LENGTH_LONG).show();\n        }\n    }\n\n\n    @SuppressLint(\"DefaultLocale\")\n    private static String fileExt(String url) {\n        if (url.indexOf(\"?\") > -1) {\n            url = url.substring(0, url.indexOf(\"?\"));\n        }\n        if (url.lastIndexOf(\".\") == -1) {\n            return null;\n        } else {\n            String ext = url.substring(url.lastIndexOf(\".\"));\n            if (ext.indexOf(\"%\") > -1) {\n                ext = ext.substring(0, ext.indexOf(\"%\"));\n            }\n            if (ext.indexOf(\"/\") > -1) {\n                ext = ext.substring(0, ext.indexOf(\"/\"));\n            }\n            return ext.toLowerCase();\n        }\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/expanx/Util/ItemDataClickListener.java",
    "content": "package com.marshalchen.ultimaterecyclerview.expanx.Util;\r\n\r\n\r\nimport com.marshalchen.ultimaterecyclerview.expanx.ExpandableItemData;\r\n\r\n/**\r\n * Author Zheng Haibo\r\n * PersonalWebsite http://www.mobctrl.net\r\n * Description\r\n */\r\npublic interface ItemDataClickListener<T extends ExpandableItemData> {\r\n\r\n    void onExpandChildren(T itemData);\r\n\r\n    void onHideChildren(T itemData);\r\n\r\n}\r\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/expanx/Util/OnScrollToListener.java",
    "content": "package com.marshalchen.ultimaterecyclerview.expanx.Util;\r\n\r\n/**\r\n * Author Zheng Haibo\r\n * PersonalWebsite http://www.mobctrl.net\r\n * Description\r\n */\r\npublic interface OnScrollToListener {\r\n\tpublic void scrollTo(int position);\r\n}\r\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/expanx/Util/ParentVH.java",
    "content": "package com.marshalchen.ultimaterecyclerview.expanx.Util;\n\nimport com.marshalchen.ultimaterecyclerview.expanx.ExpandableItemData;\n\n/**\n * Created by hesk on 10/7/15.\n */\npublic interface ParentVH<bindData extends ExpandableItemData> {\n\n    void bindView(final bindData itemData, final int position, final ItemDataClickListener imageClickListener);\n\n    void rotationExpandIcon(float from, float to);\n\n    void onParentItemClick(final String path);\n\n    int openDegree();\n\n    int closeDegree();\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/expanx/Util/child.java",
    "content": "package com.marshalchen.ultimaterecyclerview.expanx.Util;\n\nimport android.view.View;\n\nimport com.marshalchen.ultimaterecyclerview.expanx.ExpandableItemData;\n\n/**\n * Created by hesk on 10/7/15.\n */\npublic abstract class child<T extends ExpandableItemData> extends BaseViewHolder<T> implements ChildVH<T> {\n    public child(View itemView) {\n        super(itemView);\n    }\n\n\n    protected ChildClickListener listener;\n\n    public void setChildListener(ChildClickListener mlistener) {\n        this.listener = mlistener;\n    }\n\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/expanx/Util/easyTemplateChild.java",
    "content": "package com.marshalchen.ultimaterecyclerview.expanx.Util;\n\nimport android.view.View;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\n\nimport com.marshalchen.ultimaterecyclerview.R;\nimport com.marshalchen.ultimaterecyclerview.expanx.ExpandableItemData;\n\n/**\n * on 16/7/15.\n * ultimate created by jjHesk\n * based on library https://github.com/jjhesk/BringItBackAdvanceSlidingMenu\n */\npublic abstract class easyTemplateChild<T extends ExpandableItemData, B extends TextView, H extends RelativeLayout> extends child<T> {\n\n    public B text;\n    public H relativeLayout;\n    private int offsetMargin, itemMargin;\n    private boolean capitalized = false;\n    private boolean countenabled = true;\n\n    public easyTemplateChild(View itemView, int itemMargin, int expandSize) {\n        this(itemView);\n        this.itemMargin = itemMargin;\n        this.offsetMargin = expandSize;\n    }\n\n    public easyTemplateChild(View itemView) {\n        super(itemView);\n        text = (B) itemView.findViewById(R.id.exp_section_title);\n        relativeLayout = (H) itemView.findViewById(R.id.exp_section_ripple_wrapper_click);\n        itemMargin = itemView.getContext().getResources()\n                .getDimensionPixelSize(R.dimen.item_margin);\n        offsetMargin = itemView.getContext().getResources()\n                .getDimensionPixelSize(R.dimen.expand_size);\n    }\n\n\n    protected void forceTitleCapitalized(boolean b) {\n        capitalized = b;\n    }\n\n    @Override\n    public void bindView(final T itemData, int position) {\n\n        if (capitalized) {\n            text.setText(itemData.getText().toUpperCase());\n        } else {\n            text.setText(itemData.getText());\n        }\n\n        text.setLayoutParams(getParamsLayoutOffset(text, itemData));\n        relativeLayout.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                // item = itemData;\n                onChildItemClick(itemData.getText(), itemData.getPath());\n            }\n        });\n    }\n\n\n    @Override\n    public void onChildItemClick(String title, String path) {\n        String[] v = path.split(\"/\");\n        if (v.length > 1) {\n            request_api(v, title);\n        }\n    }\n\n    protected void request_api(final String[] n, final String title) {\n\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/expanx/Util/easyTemplateParent.java",
    "content": "package com.marshalchen.ultimaterecyclerview.expanx.Util;\n\nimport android.animation.ValueAnimator;\nimport android.annotation.TargetApi;\nimport android.os.Build;\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport com.marshalchen.ultimaterecyclerview.R;\nimport com.marshalchen.ultimaterecyclerview.expanx.ExpandableItemData;\n\n/**\n * Created by hesk on 16/7/15.\n * this is the enhancer class\n */\npublic abstract class easyTemplateParent<T extends ExpandableItemData, H extends RelativeLayout, B extends TextView> extends parent<T> {\n    public ImageView image;\n    public B text, count;\n    public ImageView expand;\n    private boolean capitalized = false;\n    private boolean countenabled = true;\n    public H relativeLayout;\n    private T item;\n    public RelativeLayout adjustmentlayout;\n\n    public easyTemplateParent(View itemView) {\n        super(itemView);\n        text = (B) itemView.findViewById(R.id.exp_section_title);\n        expand = (ImageView) itemView.findViewById(R.id.exp_indication_arrow);\n        count = (B) itemView.findViewById(R.id.exp_section_notification_number);\n        relativeLayout = (H) itemView.findViewById(R.id.exp_section_ripple_wrapper_click);   //clickable\n        adjustmentlayout = (RelativeLayout) itemView.findViewById(R.id.exp_section_adjustment_layout);\n        itemMargin = itemView.getContext().getResources().getDimensionPixelSize(R.dimen.item_margin);\n    }\n\n    protected void forceTitleCapitalized(boolean b) {\n        capitalized = b;\n    }\n\n    protected void setNotifcationFieldEnabled(boolean b) {\n        countenabled = b;\n        if (!countenabled) {\n            count.setVisibility(View.GONE);\n        } else {\n            if (getItem() != null && getItem().isExpand()) {\n                count.setVisibility(View.VISIBLE);\n            }\n        }\n    }\n\n    protected T getItem() {\n        return item;\n    }\n\n    @Override\n    protected void setCountVisible(int visibility) {\n        if (countenabled)\n            count.setVisibility(visibility);\n    }\n\n    @Override\n    protected void updateCountNumber(String text) {\n        if (countenabled)\n            count.setText(text);\n    }\n\n    @Override\n    public void bindView(final T itemData, final int position, final ItemDataClickListener imageClickListener) {\n        adjustmentlayout.setLayoutParams(getParamsLayout(adjustmentlayout, itemData));\n\n        if (capitalized) {\n            text.setText(itemData.getText().toUpperCase());\n        } else {\n            text.setText(itemData.getText());\n        }\n\n        setHandleInitiatedViewStatus(itemData, expand, count);\n        setRelativeLayoutClickable(relativeLayout, itemData, imageClickListener, position);\n        relativeLayout.setOnLongClickListener(new View.OnLongClickListener() {\n            @Override\n            public boolean onLongClick(View view) {\n                Toast.makeText(view.getContext(), \"longclick\",\n                        Toast.LENGTH_SHORT).show();\n                return false;\n            }\n        });\n        item = itemData;\n    }\n\n\n    @Override\n    public void onParentItemClick(String path) {\n\n    }\n\n    @Override\n    public int openDegree() {\n        return 90;\n    }\n\n    @Override\n    public int closeDegree() {\n        return 0;\n    }\n\n    /**\n     * <p>Notifies the occurrence of another frame of the animation.</p>\n     *\n     * @param animation The animation which was repeated.\n     */\n    @TargetApi(Build.VERSION_CODES.HONEYCOMB)\n    @Override\n    public void onAnimationUpdate(ValueAnimator animation) {\n        expand.setRotation((Float) animation.getAnimatedValue());\n    }\n\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/expanx/Util/parent.java",
    "content": "package com.marshalchen.ultimaterecyclerview.expanx.Util;\n\nimport android.animation.ValueAnimator;\nimport android.annotation.TargetApi;\nimport android.os.Build;\nimport androidx.interpolator.view.animation.LinearOutSlowInInterpolator;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport com.marshalchen.ultimaterecyclerview.expanx.ExpandableItemData;\n\nimport java.util.List;\n\n/**\n * Created by hesk on 10/7/15.\n */\n@TargetApi(Build.VERSION_CODES.HONEYCOMB)\npublic abstract class parent<T extends ExpandableItemData> extends BaseViewHolder<T> implements ParentVH<T>, ValueAnimator.AnimatorUpdateListener {\n    public parent(View itemView) {\n        super(itemView);\n    }\n\n    protected abstract void setCountVisible(int visibility);\n\n    protected abstract void updateCountNumber(final String text);\n\n    private void toggleExpenable(final ExpandableItemData itemData, final ItemDataClickListener imageClickListener, final int position) {\n        if (imageClickListener != null) {\n            if (itemData.isExpand()) {\n                imageClickListener.onHideChildren(itemData);\n                itemData.setExpand(false);\n                rotationExpandIcon(openDegree(), closeDegree());\n                setCountVisible(View.GONE);\n            } else {\n                imageClickListener.onExpandChildren(itemData);\n                itemData.setExpand(true);\n                rotationExpandIcon(closeDegree(), openDegree());\n                List<ExpandableItemData> children = itemData.getChildren();\n                if (children != null) {\n                    updateCountNumber(String.format(\"(%s)\", children.size()));\n                }\n                onParentItemClick(itemData.toString());\n                setCountVisible(View.VISIBLE);\n            }\n\n        }\n\n    }\n\n    @Override\n    @TargetApi(Build.VERSION_CODES.HONEYCOMB)\n    public void rotationExpandIcon(float from, float to) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {\n            ValueAnimator valueAnimator = ValueAnimator.ofFloat(from, to);\n            valueAnimator.setDuration(150);\n            valueAnimator.setInterpolator(new LinearOutSlowInInterpolator());\n            valueAnimator.addUpdateListener(this);\n            valueAnimator.start();\n        }\n    }\n\n    protected void setHandleInitiatedViewStatus(final ExpandableItemData itemData, View rotationIndicator, TextView count) {\n        if (itemData.isExpand()) {\n            rotationIndicator.setRotation(openDegree());\n            List<ExpandableItemData> children = itemData.getChildren();\n            if (children != null) {\n                count.setText(String.format(\"(%s)\", itemData.getChildren()\n                        .size()));\n            }\n            count.setVisibility(View.VISIBLE);\n        } else {\n            rotationIndicator.setRotation(closeDegree());\n            count.setVisibility(View.GONE);\n            count.setText(\"\");\n        }\n    }\n\n    protected <V extends View> void setRelativeLayoutClickable(final V clickablelayout, final ExpandableItemData itemData, final ItemDataClickListener imageClickListener, final int position) {\n        clickablelayout.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                toggleExpenable(itemData, imageClickListener, position);\n            }\n        });\n\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/expanx/customizedAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.expanx;\n\nimport android.content.Context;\n\nimport com.marshalchen.ultimaterecyclerview.expanx.Util.child;\nimport com.marshalchen.ultimaterecyclerview.expanx.Util.parent;\n\n/**\n * Created by hesk on 14/7/15.\n */\npublic abstract class customizedAdapter<G extends parent<SmartItem>, T extends child<SmartItem>> extends LinearExpanxURVAdapter<SmartItem, G, T> {\n\n    public customizedAdapter(Context context) {\n        super(context, EXPANDABLE_ITEMS, true);\n    }\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/grid/BasicGridLayoutManager.java",
    "content": "package com.marshalchen.ultimaterecyclerview.grid;\n\nimport android.content.Context;\nimport androidx.recyclerview.widget.GridLayoutManager;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateViewAdapter;\n\n/**\n * Created by hesk on 24/8/15.\n */\npublic class BasicGridLayoutManager extends GridLayoutManager {\n    private final UltimateViewAdapter mAdapter;\n    protected int headerSpan = 2;\n\n\n    protected GridLayoutManager.SpanSizeLookup mSpanSizeLookUp = new GridLayoutManager.SpanSizeLookup() {\n        @Override\n        public int getSpanSize(int position) {\n            if (mAdapter.getItemViewType(position) == UltimateViewAdapter.VIEW_TYPES.FOOTER) {\n                return getSpanCount();\n            } else if (mAdapter.getItemViewType(position) == UltimateViewAdapter.VIEW_TYPES.HEADER) {\n                return getSpanCount();\n            } else\n                return getNormalSpanCount(position);\n        }\n    };\n\n    protected int getSpanInterval(int position) {\n        int mIntervalHeader = getSpanCount() * 10;\n        int h = position % mIntervalHeader == 0 ? getSpanCount() : 1;\n        return h;\n\n    }\n\n    protected int getHeaderSpanCount(int n) {\n        return headerSpan;\n    }\n\n    protected int getNormalSpanCount(int item_position) {\n        return 1;\n    }\n\n    protected GridLayoutManager.SpanSizeLookup decideSpanSizeCal() {\n        return mSpanSizeLookUp;\n    }\n\n    public BasicGridLayoutManager(Context context, int spanCount, UltimateViewAdapter mAdapter) {\n        super(context, spanCount);\n        this.mAdapter = mAdapter;\n        setSpanSizeLookup(decideSpanSizeCal());\n    }\n\n    public BasicGridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout, UltimateViewAdapter mAdapter) {\n        super(context, spanCount, orientation, reverseLayout);\n        this.mAdapter = mAdapter;\n        setSpanSizeLookup(decideSpanSizeCal());\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/grid/GridPaddingDecorator.java",
    "content": "package com.marshalchen.ultimaterecyclerview.grid;\n\nimport android.graphics.Rect;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.View;\n\n/**\n * Add padding around elements within a RecyclerView using GridLayoutManager\n */\n\n/**\n * Created by hesk on 27/1/16.\n */\npublic class GridPaddingDecorator extends RecyclerView.ItemDecoration {\n    private int mSpanCt;\n    private int mVPadding;\n    private int mHPadding;\n\n    /**\n     * @param vPadding  The space to be placed inbetween rows\n     * @param hPadding  The space to be placed inbetween columns\n     * @param spanCount The number of spans the GridLayoutManager will use\n     */\n    public GridPaddingDecorator(int vPadding, int hPadding, int spanCount) {\n        mSpanCt = spanCount;\n        mVPadding = vPadding;\n        mHPadding = hPadding;\n    }\n\n    @Override\n    public void getItemOffsets(Rect outRect, View view,\n                               RecyclerView parent, RecyclerView.State state) {\n        int position = parent.getChildAdapterPosition(view);\n        int totalItems = parent.getAdapter().getItemCount();\n\n        //for items not in the bottomRow\n        if (position < totalItems - mSpanCt)\n            outRect.bottom = mVPadding;\n\n        //for items preceding the rightmost column\n        if (position % mSpanCt < mSpanCt - 1)\n            outRect.right = mHPadding;\n\n    }\n}"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/grid/GridSpacingItemDecoration.java",
    "content": "package com.marshalchen.ultimaterecyclerview.grid;\n\nimport android.graphics.Rect;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.View;\n\n/**\n * Created by hesk on 27/1/16.\n */\npublic class GridSpacingItemDecoration extends RecyclerView.ItemDecoration {\n\n    private int spanCount;\n    private int spacing;\n    private boolean includeEdge;\n\n    public GridSpacingItemDecoration(int spanCount, int spacing, boolean includeEdge) {\n        this.spanCount = spanCount;\n        this.spacing = spacing;\n        this.includeEdge = includeEdge;\n    }\n\n    @Override\n    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {\n        int position = parent.getChildAdapterPosition(view); // item position\n        int column = position % spanCount; // item column\n\n        if (includeEdge) {\n            outRect.left = spacing - column * spacing / spanCount; // spacing - column * ((1f / spanCount) * spacing)\n            outRect.right = (column + 1) * spacing / spanCount; // (column + 1) * ((1f / spanCount) * spacing)\n\n            if (position < spanCount) { // top edge\n                outRect.top = spacing;\n            }\n            outRect.bottom = spacing; // item bottom\n        } else {\n            outRect.left = column * spacing / spanCount; // column * ((1f / spanCount) * spacing)\n            outRect.right = spacing - (column + 1) * spacing / spanCount; // spacing - (column + 1) * ((1f /    spanCount) * spacing)\n            if (position >= spanCount) {\n                outRect.top = spacing; // item top\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/grid/customSectionGridAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.grid;\n\n/**\n * Created by hesk on 29/2/16.\n */\npublic class customSectionGridAdapter {\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/gridSection/HeaderViewHolder.java",
    "content": "package com.marshalchen.ultimaterecyclerview.gridSection;\n\nimport androidx.annotation.IdRes;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.View;\nimport android.widget.TextView;\n\n/**\n * Created by hesk on 01/06/15.\n */\npublic class HeaderViewHolder extends RecyclerView.ViewHolder {\n\n    protected TextView titleText = null;\n\n    public HeaderViewHolder(View itemView, @IdRes int titleID) {\n        super(itemView);\n        titleText = (TextView) itemView.findViewById(titleID);\n    }\n\n    public void render(String title) {\n        titleText.setText(title);\n    }\n\n}"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/gridSection/SectionedRecyclerViewAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.gridSection;\n\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.ViewGroup;\n\n/**\n * Created by hesk on 5/1/16.\n */\npublic abstract class SectionedRecyclerViewAdapter<H extends RecyclerView.ViewHolder,\n        VH extends RecyclerView.ViewHolder,\n        F extends RecyclerView.ViewHolder>\n        extends RecyclerView.Adapter<RecyclerView.ViewHolder> {\n\n    public static final int TYPE_SECTION_HEADER = -1;\n    public static final int TYPE_SECTION_FOOTER = -2;\n    public static final int TYPE_ITEM = -3;\n\n    private int[] sectionForPosition = null;\n    private int[] positionWithinSection = null;\n    private boolean[] isHeader = null;\n    private boolean[] isFooter = null;\n    private int count = 0;\n\n    public SectionedRecyclerViewAdapter() {\n        super();\n        registerAdapterDataObserver(new SectionDataObserver());\n    }\n\n    @Override\n    public void onAttachedToRecyclerView(RecyclerView recyclerView) {\n        super.onAttachedToRecyclerView(recyclerView);\n        setupIndices();\n    }\n\n    /**\n     * Returns the sum of number of items for each section plus headers and footers if they\n     * are provided.\n     */\n    @Override\n    public int getItemCount() {\n        return count;\n    }\n\n    private void setupIndices() {\n        count = countItems();\n        allocateAuxiliaryArrays(count);\n        precomputeIndices();\n    }\n\n    private int countItems() {\n        int count = 0;\n        int sections = getSectionCount();\n\n        for (int i = 0; i < sections; i++) {\n            count += 1 + getItemCountForSection(i) + (hasFooterInSection(i) ? 1 : 0);\n        }\n        return count;\n    }\n\n    private void precomputeIndices() {\n        int sections = getSectionCount();\n        int index = 0;\n\n        for (int i = 0; i < sections; i++) {\n            setPrecomputedItem(index, true, false, i, 0);\n            index++;\n\n            for (int j = 0; j < getItemCountForSection(i); j++) {\n                setPrecomputedItem(index, false, false, i, j);\n                index++;\n            }\n\n            if (hasFooterInSection(i)) {\n                setPrecomputedItem(index, false, true, i, 0);\n                index++;\n            }\n        }\n    }\n\n    private void allocateAuxiliaryArrays(int count) {\n        sectionForPosition = new int[count];\n        positionWithinSection = new int[count];\n        isHeader = new boolean[count];\n        isFooter = new boolean[count];\n    }\n\n    private void setPrecomputedItem(int index, boolean isHeader, boolean isFooter, int section, int position) {\n        this.isHeader[index] = isHeader;\n        this.isFooter[index] = isFooter;\n        sectionForPosition[index] = section;\n        positionWithinSection[index] = position;\n    }\n\n    @Override\n    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        RecyclerView.ViewHolder viewHolder;\n\n        if (isSectionHeaderViewType(viewType)) {\n            viewHolder = onCreateSectionHeaderViewHolder(parent, viewType);\n        } else if (isSectionFooterViewType(viewType)) {\n            viewHolder = onCreateSectionFooterViewHolder(parent, viewType);\n        } else {\n            viewHolder = onCreateItemViewHolder(parent, viewType);\n        }\n\n        return viewHolder;\n    }\n\n    @Override\n    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {\n        int section = sectionForPosition[position];\n        int index = positionWithinSection[position];\n\n        if (isSectionHeaderPosition(position)) {\n            onBindSectionHeaderViewHolder((H) holder, section);\n        } else if (isSectionFooterPosition(position)) {\n            onBindSectionFooterViewHolder((F) holder, section);\n        } else {\n            onBindItemViewHolder((VH) holder, section, index);\n        }\n\n    }\n\n    @Override\n    public int getItemViewType(int position) {\n\n        if (sectionForPosition == null) {\n            setupIndices();\n        }\n\n        int section = sectionForPosition[position];\n        int index = positionWithinSection[position];\n\n        if (isSectionHeaderPosition(position)) {\n            return getSectionHeaderViewType(section);\n        } else if (isSectionFooterPosition(position)) {\n            return getSectionFooterViewType(section);\n        } else {\n            return getSectionItemViewType(section, index);\n        }\n\n    }\n\n    protected int getSectionHeaderViewType(int section) {\n        return TYPE_SECTION_HEADER;\n    }\n\n    protected int getSectionFooterViewType(int section) {\n        return TYPE_SECTION_FOOTER;\n    }\n\n    /**\n     * @param section  section id\n     * @param position position id\n     * @return type id\n     */\n    protected int getSectionItemViewType(int section, int position) {\n        return TYPE_ITEM;\n    }\n\n    /**\n     * Returns true if the argument position corresponds to a header\n     *\n     * @param position raw position\n     * @return bool\n     */\n    public boolean isSectionHeaderPosition(int position) {\n        if (isHeader == null) {\n            setupIndices();\n        }\n        return isHeader[position];\n    }\n\n    /**\n     * Returns true if the argument position corresponds to a footer\n     *\n     * @param position raw position\n     * @return bool\n     */\n    public boolean isSectionFooterPosition(int position) {\n        if (isFooter == null) {\n            setupIndices();\n        }\n        return isFooter[position];\n    }\n\n    protected boolean isSectionHeaderViewType(int viewType) {\n        return viewType == TYPE_SECTION_HEADER;\n    }\n\n    protected boolean isSectionFooterViewType(int viewType) {\n        return viewType == TYPE_SECTION_FOOTER;\n    }\n\n    /**\n     * Returns the number of sections in the RecyclerView\n     *\n     * @return total amount of sections\n     */\n    protected abstract int getSectionCount();\n\n    /**\n     * Returns the number of items for a given section\n     *\n     * @param section section index\n     * @return index\n     */\n    protected abstract int getItemCountForSection(int section);\n\n    /**\n     * Returns true if a given section should have a footer\n     *\n     * @param section section index\n     * @return bool\n     */\n    protected abstract boolean hasFooterInSection(int section);\n\n    /**\n     * Creates a ViewHolder of class H for a Header\n     * *\n     *\n     * @param parent   context in parent\n     * @param viewType the view type\n     * @return the type in hold\n     */\n    protected abstract H onCreateSectionHeaderViewHolder(ViewGroup parent, int viewType);\n\n    /**\n     * Creates a ViewHolder of class F for a Footer\n     *\n     * @param parent   context in parent\n     * @param viewType the view type\n     * @return the type in hold\n     */\n    protected abstract F onCreateSectionFooterViewHolder(ViewGroup parent, int viewType);\n\n    /**\n     * Creates a ViewHolder of class VH for an Item\n     *\n     * @param parent   context in parent\n     * @param viewType the view type\n     * @return the type in hold\n     */\n    protected abstract VH onCreateItemViewHolder(ViewGroup parent, int viewType);\n\n    /**\n     * Binds data to the header view of a given section\n     *\n     * @param holder  type of holder\n     * @param section section index\n     */\n    protected abstract void onBindSectionHeaderViewHolder(H holder, int section);\n\n    /**\n     * Binds data to the footer view of a given section\n     *\n     * @param holder  type of holder\n     * @param section section index\n     */\n    protected abstract void onBindSectionFooterViewHolder(F holder, int section);\n\n    /**\n     * Binds data to the item view for a given position within a section\n     *\n     * @param holder   holder type\n     * @param section  the section id\n     * @param position the raw position\n     */\n    protected abstract void onBindItemViewHolder(VH holder, int section, int position);\n\n    class SectionDataObserver extends RecyclerView.AdapterDataObserver {\n        @Override\n        public void onChanged() {\n            setupIndices();\n        }\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/gridSection/SectionedSpanSizeLookup.java",
    "content": "package com.marshalchen.ultimaterecyclerview.gridSection;\n\nimport androidx.recyclerview.widget.GridLayoutManager;\n\n/**\n * Created by hesk on 5/1/16.\n */\npublic class SectionedSpanSizeLookup extends GridLayoutManager.SpanSizeLookup {\n\n    protected SectionedRecyclerViewAdapter<?, ?, ?> adapter = null;\n    protected GridLayoutManager layoutManager = null;\n\n    public SectionedSpanSizeLookup(SectionedRecyclerViewAdapter<?, ?, ?> adapter, GridLayoutManager layoutManager) {\n        this.adapter = adapter;\n        this.layoutManager = layoutManager;\n    }\n\n    @Override\n    public int getSpanSize(int position) {\n\n        if(adapter.isSectionHeaderPosition(position) || adapter.isSectionFooterPosition(position)){\n            return layoutManager.getSpanCount();\n        }else{\n            return 1;\n        }\n\n    }\n}"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/gridSection/SimpleSectionedAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.gridSection;\n\n\nimport androidx.annotation.IdRes;\nimport androidx.annotation.LayoutRes;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.marshalchen.ultimaterecyclerview.R;\n\n/**\n * An extension of SectionedRecyclerViewAdapter for simple sectioned RecyclerViews. In most cases,\n * you will not need a footer for your sections and your header will consist only of a TextView.\n * SimpleSectionedAdapter simplifies the creation of such sectioned collections where you only\n * need to provide header titles and implement the rendering of your items.\n */\npublic abstract class SimpleSectionedAdapter<VH extends RecyclerView.ViewHolder> extends SectionedRecyclerViewAdapter<HeaderViewHolder,\n        VH, RecyclerView.ViewHolder> {\n\n    @Override\n    protected boolean hasFooterInSection(int section) {\n        return false;\n    }\n\n    @Override\n    protected HeaderViewHolder onCreateSectionHeaderViewHolder(ViewGroup parent, int viewType) {\n        LayoutInflater inflater = LayoutInflater.from(parent.getContext());\n        View view = inflater.inflate(getLayoutResource(), parent, false);\n        HeaderViewHolder holder = new HeaderViewHolder(view, getTitleTextID());\n        return holder;\n    }\n\n    @Override\n    protected RecyclerView.ViewHolder onCreateSectionFooterViewHolder(ViewGroup parent, int viewType) {\n        return null;\n    }\n\n    @Override\n    protected void onBindSectionHeaderViewHolder(HeaderViewHolder holder, int section) {\n        String title = getSectionHeaderTitle(section);\n        holder.render(title);\n    }\n\n    @Override\n    protected void onBindSectionFooterViewHolder(RecyclerView.ViewHolder holder, int section) {\n    }\n\n    /**\n     * Provides a layout identifier for the header. Override it to change the appearance of the\n     * header view.\n     *\n     * @return int layout id\n     */\n    @LayoutRes\n    protected int getLayoutResource() {\n        return R.layout.slm_header;\n    }\n\n    /**\n     * Provides the identifier of the TextView to render the section header title. Override it if\n     * you provide a custom layout for a header.\n     *\n     * @return the field id\n     */\n    @IdRes\n    protected int getTitleTextID() {\n        return R.id.title_text;\n    }\n\n    /**\n     * Returns the title for a given section\n     *\n     * @param section section index\n     * @return string in return\n     */\n    protected abstract String getSectionHeaderTitle(int section);\n}"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/itemTouchHelper/ItemTouchHelperAdapter.java",
    "content": "/*\n * Copyright (C) 2015 Paul Burke\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.marshalchen.ultimaterecyclerview.itemTouchHelper;\n\nimport androidx.recyclerview.widget.RecyclerView;\nimport androidx.recyclerview.widget.ItemTouchHelper;\n\n/**\n * Interface to listen for a move or dismissal event from a {@link ItemTouchHelper.Callback}.\n *\n * @author Paul Burke (ipaulpro)\n */\npublic interface ItemTouchHelperAdapter {\n\n    /**\n     * Called when an item has been dragged far enough to trigger a move. This is called every time\n     * an item is shifted, and <strong>not</strong> at the end of a \"drop\" event.\n     *\n     * Implementations should call {@link RecyclerView.Adapter#notifyItemMoved(int, int)} after\n     * adjusting the underlying data to reflect this move.\n     *\n     * @param fromPosition The start position of the moved item.\n     * @param toPosition   Then resolved position of the moved item.\n     *\n     * @see RecyclerView#getAdapterPositionFor(RecyclerView.ViewHolder)\n     * @see RecyclerView.ViewHolder#getAdapterPosition()\n     */\n    void onItemMove(int fromPosition, int toPosition);\n\n\n    /**\n     * Called when an item has been dismissed by a swipe.\n     * Implementations should call {@link RecyclerView.Adapter#notifyItemRemoved(int)} after\n     * adjusting the underlying data to reflect this removal.\n     *\n     * @param position The position of the item dismissed.\n     *\n     * @see RecyclerView#getAdapterPositionFor(RecyclerView.ViewHolder)\n     * @see RecyclerView.ViewHolder#getAdapterPosition()\n     */\n    void onItemDismiss(int position);\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/itemTouchHelper/ItemTouchHelperViewHolder.java",
    "content": "/*\n * Copyright (C) 2015 Paul Burke\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.marshalchen.ultimaterecyclerview.itemTouchHelper;\n\nimport androidx.recyclerview.widget.ItemTouchHelper;\n\n/**\n * Interface to notify an item ViewHolder of relevant callbacks from {@link\n * ItemTouchHelper.Callback}.\n *\n * @author Paul Burke (ipaulpro)\n */\npublic interface ItemTouchHelperViewHolder {\n\n    /**\n     * Called when the {@link ItemTouchHelper} first registers an item as being moved or swiped.\n     * Implementations should update the item view to indicate it's active state.\n     */\n    void onItemSelected();\n\n\n    /**\n     * Called when the {@link ItemTouchHelper} has completed the move or swipe, and the active item\n     * state should be cleared.\n     */\n    void onItemClear();\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/itemTouchHelper/SimpleItemTouchHelperCallback.java",
    "content": "/*\n * Copyright (C) 2015 Paul Burke\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.marshalchen.ultimaterecyclerview.itemTouchHelper;\n\nimport android.annotation.TargetApi;\nimport android.graphics.Canvas;\nimport android.os.Build;\nimport androidx.recyclerview.widget.RecyclerView;\nimport androidx.recyclerview.widget.ItemTouchHelper;\nimport android.view.View;\n\n/**\n * An implementation of {@link ItemTouchHelper.Callback} that enables basic drag and drop and\n * swipe-to-dismiss. Drag events are automatically started by an item long-press.\n * Expects the <code>RecyclerView.Adapter</code> to listen for {@link\n * ItemTouchHelperAdapter} callbacks and the <code>RecyclerView.ViewHolder</code> to implement\n * {@link ItemTouchHelperViewHolder}.\n *\n * @author Paul Burke (ipaulpro)\n */\npublic class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback {\n\n    public static final float ALPHA_FULL = 1.0f;\n\n    private final ItemTouchHelperAdapter mAdapter;\n\n    public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter) {\n        mAdapter = adapter;\n    }\n\n    @Override\n    public boolean isLongPressDragEnabled() {\n        return true;\n    }\n\n    @Override\n    public boolean isItemViewSwipeEnabled() {\n        return true;\n    }\n\n    @Override\n    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {\n        // Enable drag and swipe in both directions\n        final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;\n        final int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;\n        return makeMovementFlags(dragFlags, swipeFlags);\n    }\n\n    @Override\n    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) {\n        if (source.getItemViewType() != target.getItemViewType()) {\n            return false;\n        }\n        // Notify the adapter of the move\n        mAdapter.onItemMove(source.getAdapterPosition(), target.getAdapterPosition());\n        return true;\n    }\n\n    @Override\n    public void onSwiped(RecyclerView.ViewHolder viewHolder, int i) {\n        // Notify the adapter of the dismissal\n        mAdapter.onItemDismiss(viewHolder.getAdapterPosition());\n    }\n\n    @TargetApi(Build.VERSION_CODES.HONEYCOMB)\n    @Override\n    public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {\n        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);\n        // Fade out the view as it is swiped out of the parent's bounds\n        if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {\n            View itemView = viewHolder.itemView;\n            final float alpha = ALPHA_FULL - Math.abs(dX) / (float) itemView.getWidth();\n            itemView.setAlpha(alpha);\n        }\n    }\n\n    @Override\n    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {\n        if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {\n            // Let the view holder know that this item is being moved or dragged\n            ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;\n            itemViewHolder.onItemSelected();\n        }\n        super.onSelectedChanged(viewHolder, actionState);\n    }\n\n    @TargetApi(Build.VERSION_CODES.HONEYCOMB)\n    @Override\n    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {\n        super.clearView(recyclerView, viewHolder);\n        viewHolder.itemView.setAlpha(ALPHA_FULL);\n        // Tell the view holder it's time to restore the idle state\n        ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;\n        itemViewHolder.onItemClear();\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/layoutmanagers/ClassicSpanGridLayoutManager.java",
    "content": "package com.marshalchen.ultimaterecyclerview.layoutmanagers;\n\nimport android.content.Context;\nimport androidx.recyclerview.widget.GridLayoutManager;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateViewAdapter;\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.easyRegularAdapter;\n\nimport static com.marshalchen.ultimaterecyclerview.UltimateViewAdapter.VIEW_TYPES.FOOTER;\nimport static com.marshalchen.ultimaterecyclerview.UltimateViewAdapter.VIEW_TYPES.HEADER;\nimport static com.marshalchen.ultimaterecyclerview.UltimateViewAdapter.VIEW_TYPES.NORMAL;\n\n/**\n * Created by hesk on 5/4/16.\n */\npublic class ClassicSpanGridLayoutManager extends GridLayoutManager {\n    private final UltimateViewAdapter mAdapter;\n    public static final int\n            VIDEOPOST = 1, NEWSPAGE = 2, DEFAULT = -1;\n    private int mode = DEFAULT;\n\n    protected int onGetSpeanSize(final int position) {\n        if (mode == NEWSPAGE) {\n            if (mAdapter instanceof easyRegularAdapter) {\n                int itemtype = mAdapter.getItemViewType(position);\n                if (itemtype == FOOTER || itemtype == HEADER || position == 0) {\n                    return getSpanCount();\n                }\n            }\n        } else if (mode == DEFAULT) {\n            if (mAdapter instanceof easyRegularAdapter) {\n                easyRegularAdapter sw = (easyRegularAdapter) mAdapter;\n                if (sw.getItemViewType(position) == FOOTER) {\n                    return getSpanCount();\n                } else if (sw.getItemViewType(position) == HEADER) {\n                    return getSpanCount();\n                } else if (sw.getItemViewType(position) == NORMAL) {\n                    return 1;\n                }\n            }\n        }\n\n        return 1;\n    }\n\n    private GridLayoutManager.SpanSizeLookup m = new GridLayoutManager.SpanSizeLookup() {\n        /**\n         * Returns the index of the group this position belongs.\n         * For example, if grid has 3 columns and each item occupies 1 span, span group index\n         * for item 1 will be 0, item 5 will be 1.\n         *\n         * @param adapterPosition The position in adapter\n         * @param spanCount       The total number of spans in the grid\n         * @return The index of the span group including the item at the given adapter position\n         */\n        @Override\n        public int getSpanGroupIndex(int adapterPosition, int spanCount) {\n            return super.getSpanGroupIndex(adapterPosition, spanCount);\n        }\n\n        @Override\n        public int getSpanSize(final int position) {\n            return onGetSpeanSize(position);\n        }\n    };\n\n    public ClassicSpanGridLayoutManager(Context context, int spanCount, easyRegularAdapter mAdapter) {\n        super(context, spanCount);\n        this.mAdapter = mAdapter;\n        setSpanSizeLookup(m);\n    }\n\n\n    public ClassicSpanGridLayoutManager(Context context, int spanCount, int moded, int orientation,\n                                        easyRegularAdapter mAdapter) {\n        super(context, spanCount, orientation, false);\n        this.mAdapter = mAdapter;\n        setSpanSizeLookup(m);\n        if (moded > 0) {\n            mode = moded;\n        }\n    }\n\n    public ClassicSpanGridLayoutManager(Context context, int spanCount, int moded,\n                                        easyRegularAdapter mAdapter) {\n        super(context, spanCount);\n        this.mAdapter = mAdapter;\n        setSpanSizeLookup(m);\n        mode = moded;\n    }\n\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/layoutmanagers/CustomLinearLayoutManager.java",
    "content": "package com.marshalchen.ultimaterecyclerview.layoutmanagers;\n\nimport android.content.Context;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.View;\nimport android.view.ViewGroup;\n\n/**\n * Created by cym on 15/5/27.\n */\npublic class CustomLinearLayoutManager extends LinearLayoutManager {\n\n    public CustomLinearLayoutManager(Context context, int orientation, boolean reverseLayout)    {\n        super(context, orientation, reverseLayout);\n    }\n\n    private int[] mMeasuredDimension = new int[2];\n\n    @Override\n    public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state,\n                          int widthSpec, int heightSpec) {\n        final int widthMode = View.MeasureSpec.getMode(widthSpec);\n        final int heightMode = View.MeasureSpec.getMode(heightSpec);\n        final int widthSize = View.MeasureSpec.getSize(widthSpec);\n        final int heightSize = View.MeasureSpec.getSize(heightSpec);\n        int width = 0;\n        int height = 0;\n        for (int i = 0; i < getItemCount(); i++) {\n            measureScrapChild(recycler, i,\n                    View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),\n                    View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),\n                    mMeasuredDimension);\n\n            if (getOrientation() == HORIZONTAL) {\n                width = width + mMeasuredDimension[0];\n                if (i == 0) {\n                    height = mMeasuredDimension[1];\n                }\n            } else {\n                height = height + mMeasuredDimension[1];\n                if (i == 0) {\n                    width = mMeasuredDimension[0];\n                }\n            }\n        }\n        switch (widthMode) {\n            case View.MeasureSpec.EXACTLY:\n                width = widthSize;\n            case View.MeasureSpec.AT_MOST:\n            case View.MeasureSpec.UNSPECIFIED:\n        }\n\n        switch (heightMode) {\n            case View.MeasureSpec.EXACTLY:\n                height = heightSize;\n            case View.MeasureSpec.AT_MOST:\n            case View.MeasureSpec.UNSPECIFIED:\n        }\n\n        setMeasuredDimension(width, height);\n    }\n\n    private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,\n                                   int heightSpec, int[] measuredDimension) {\n        View view = recycler.getViewForPosition(position);\n        if (view != null) {\n            RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();\n            int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec,\n                    getPaddingLeft() + getPaddingRight(), p.width);\n            int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec,\n                    getPaddingTop() + getPaddingBottom(), p.height);\n            view.measure(childWidthSpec, childHeightSpec);\n            measuredDimension[0] = view.getMeasuredWidth() + p.leftMargin + p.rightMargin;\n            measuredDimension[1] = view.getMeasuredHeight() + p.bottomMargin + p.topMargin;\n            recycler.recycleView(view);\n        }\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/layoutmanagers/ScrollSmoothLineaerLayoutManager.java",
    "content": "package com.marshalchen.ultimaterecyclerview.layoutmanagers;\n\nimport android.content.Context;\nimport android.graphics.PointF;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.LinearSmoothScroller;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.View;\n\n/**\n * Created by hesk on 12/6/15.\n */\npublic class ScrollSmoothLineaerLayoutManager extends LinearLayoutManager {\n    private final int duration;\n\n    public ScrollSmoothLineaerLayoutManager(Context context, int orientation, boolean reverseLayout, int duration) {\n        super(context, orientation, reverseLayout);\n        this.duration = duration;\n    }\n\n    /**\n     * @param recycler the object\n     * @param state    the state\n     */\n    @Override\n    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {\n        try {\n            super.onLayoutChildren(recycler, state);\n        } catch (Exception e) {\n\n        }\n    }\n\n    /**\n     * try to fix the inconsistency detection issue\n     *\n     * @return boolean not support on V23.1.1\n     */\n    @Override\n    public boolean supportsPredictiveItemAnimations() {\n        return false;\n    }\n\n    @Override\n    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {\n        View firstVisibleChild = recyclerView.getChildAt(0);\n        int itemHeight = firstVisibleChild.getHeight();\n        int currentPosition = recyclerView.getChildLayoutPosition(firstVisibleChild);\n        int distanceInPixels = Math.abs((currentPosition - position) * itemHeight);\n        if (distanceInPixels == 0) {\n            distanceInPixels = (int) Math.abs(firstVisibleChild.getY());\n        }\n        SmoothScroller smoothScroller = new SmoothScroller(recyclerView.getContext(), distanceInPixels, duration);\n        smoothScroller.setTargetPosition(position);\n        startSmoothScroll(smoothScroller);\n    }\n\n    private class SmoothScroller extends LinearSmoothScroller {\n        private static final int TARGET_SEEK_SCROLL_DISTANCE_PX = 10000;\n        private final float distanceInPixels;\n        private final float duration;\n\n        public SmoothScroller(Context context, int distanceInPixels, int duration) {\n            super(context);\n            this.distanceInPixels = distanceInPixels;\n            float millisecondsPerPx = calculateSpeedPerPixel(context.getResources().getDisplayMetrics());\n            this.duration = distanceInPixels < TARGET_SEEK_SCROLL_DISTANCE_PX ?\n                    (int) (Math.abs(distanceInPixels) * millisecondsPerPx) : duration;\n        }\n\n        @Override\n        public PointF computeScrollVectorForPosition(int targetPosition) {\n            return ScrollSmoothLineaerLayoutManager.this\n                    .computeScrollVectorForPosition(targetPosition);\n        }\n\n        @Override\n        protected int calculateTimeForScrolling(int dx) {\n            float proportion = (float) dx / distanceInPixels;\n            return (int) (duration * proportion);\n        }\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/multiViewTypes/DataBinder.java",
    "content": "package com.marshalchen.ultimaterecyclerview.multiViewTypes;\n\nimport android.view.ViewGroup;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateDifferentViewTypeAdapter;\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder;\n\n/**\n * Class for binding view and data\n *\n * Created by yqritc on 2015/03/01.\n */\nabstract public class DataBinder<T extends UltimateRecyclerviewViewHolder> {\n\n    private UltimateDifferentViewTypeAdapter mDataBindAdapter;\n\n    public DataBinder(UltimateDifferentViewTypeAdapter dataBindAdapter) {\n        mDataBindAdapter = dataBindAdapter;\n    }\n\n    abstract public T newViewHolder(ViewGroup parent);\n\n    abstract public void bindViewHolder(T holder, int position);\n\n    abstract public int getItemCount();\n\n    public final void notifyDataSetChanged() {\n        mDataBindAdapter.notifyDataSetChanged();\n    }\n\n    public final void notifyBinderDataSetChanged() {\n        notifyBinderItemRangeChanged(0, getItemCount());\n    }\n\n    public final void notifyBinderItemChanged(int position) {\n        mDataBindAdapter.notifyBinderItemChanged(this, position);\n    }\n\n    public final void notifyBinderItemRangeChanged(int positionStart, int itemCount) {\n        mDataBindAdapter.notifyBinderItemRangeChanged(this, positionStart, itemCount);\n    }\n\n    public final void notifyBinderItemInserted(int position) {\n        mDataBindAdapter.notifyBinderItemInserted(this, position);\n    }\n\n    public final void notifyBinderItemMoved(int fromPosition, int toPosition) {\n        mDataBindAdapter.notifyBinderItemMoved(this, fromPosition, toPosition);\n    }\n\n    public final void notifyBinderItemRangeInserted(int positionStart, int itemCount) {\n        mDataBindAdapter.notifyBinderItemRangeInserted(this, positionStart, itemCount);\n    }\n\n    public final void notifyBinderItemRemoved(int position) {\n        mDataBindAdapter.notifyBinderItemRemoved(this, position);\n    }\n\n    public final void notifyBinderItemRangeRemoved(int positionStart, int itemCount) {\n        mDataBindAdapter.notifyBinderItemRangeRemoved(this, positionStart, itemCount);\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/quickAdapter/AdItemHolder.java",
    "content": "package com.marshalchen.ultimaterecyclerview.quickAdapter;\n\nimport android.view.View;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder;\nimport com.marshalchen.ultimaterecyclerview.UltimateViewAdapter;\n\n/**\n * Created by hesk on 24/2/16.\n * Linear or Grid layout use only\n */\npublic abstract class AdItemHolder extends UltimateRecyclerviewViewHolder {\n    private final int innerType;\n\n    public AdItemHolder(View itemView, int type) {\n        super(itemView);\n        innerType = type;\n        if (innerType == UltimateViewAdapter.VIEW_TYPES.NORMAL) {\n            bindNormal(itemView);\n        } else if (innerType == UltimateViewAdapter.VIEW_TYPES.ADVIEW) {\n            bindAd(itemView);\n        }\n    }\n\n    protected abstract void bindNormal(View view);\n\n    protected abstract void bindAd(View view);\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/quickAdapter/AdmobAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.quickAdapter;\n\nimport androidx.annotation.Nullable;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.util.Log;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\n\nimport java.util.List;\n\n/**\n * Enhanced Google Admob implementation\n * Created by hesk on 20/5/15.\n */\npublic abstract class AdmobAdapter<Adv extends ViewGroup, T, BINDHOLDER extends AdItemHolder> extends easyRegularAdapter<T, BINDHOLDER> {\n    public interface AdviewListener<Adv extends ViewGroup> {\n        Adv onGenerateAdview();\n    }\n\n    protected final Adv advertise_view;\n    /**\n     * There is an AD between the amount of the data items. adfrequency is known as the amount.\n     */\n    protected int adfrequency;\n    /**\n     * The ad is only insert once and no more.\n     */\n    protected boolean once;\n    protected AdviewListener adviewlistener;\n    public static final int POSITION_ON_AD = -1;\n\n    /**\n     * This is the enhanced listview injection model that will be able to work with Googlge Admob, DoubleClick, and\n     * related custom cell injection on the fly. It provides two specific options for the view to be taken place.\n     * While insertOnce=true will increase the performance and false will slow down a little bit on the performance but it is insignificant.\n     *\n     * @param adview      The AD mob view\n     * @param insertOnce  only insert once and hold into the adapter object, that means the ad will only shown once in the list view\n     * @param setInterval the order of item to show the ad. if @insertOnce=false the ad will show on interval bases.\n     * @param L           the data source\n     */\n    public AdmobAdapter(Adv adview, boolean insertOnce, int setInterval, List<T> L) {\n        this(adview, insertOnce, setInterval, L, null);\n    }\n\n\n    /**\n     * This is same to the above method\n     *\n     * @param advertisement_view The AD mob view\n     * @param insertOnce         only insert once and hold into the adapter object, that means the ad will only shown once in the list view\n     * @param setInterval        the order of item to show the ad. if @insertOnce=false the ad will show on interval bases.\n     * @param L                  the data source\n     * @param listener           The listener for the admob cell to reveal when the cell is close to appear on the screen\n     */\n    public AdmobAdapter(\n            final Adv advertisement_view,\n            boolean insertOnce,\n            int setInterval,\n            List<T> L,\n            @Nullable AdviewListener listener) {\n        super(L);\n\n        // setHasStableIds(true);\n        /**\n         * Disable focus for sub-views of the AdView to avoid problems with\n         * trackpad navigation of the list.\n         */\n        for (int i = 0; i < advertisement_view.getChildCount(); i++) {\n            advertisement_view.getChildAt(i).setFocusable(false);\n        }\n        advertisement_view.setFocusable(false);\n        once = insertOnce;\n        adfrequency = setInterval + 1;\n        advertise_view = advertisement_view;\n        if (listener == null) {\n            adviewlistener = new AdviewListener() {\n                @Override\n                public ViewGroup onGenerateAdview() {\n                    return advertisement_view;\n                }\n            };\n        } else\n            adviewlistener = listener;\n    }\n\n    /**\n     * requirement: ADVIEW\n     *\n     * @param view v\n     * @return holder for this ADVIEW\n     */\n    @Override\n    public RecyclerView.ViewHolder getAdViewHolder(View view) {\n        return new AdItemHolder(adviewlistener.onGenerateAdview(), VIEW_TYPES.ADVIEW) {\n            @Override\n            protected void bindNormal(View view) {\n\n            }\n\n            @Override\n            protected void bindAd(View view) {\n\n            }\n        };\n    }\n\n\n\n\n    @Override\n    public int totalAdditionalItems() {\n        final int base = super.totalAdditionalItems();\n        if (once) {\n            if (adfrequency > 0) {\n                return base + 1;\n            } else {\n                return base;\n            }\n        } else {\n            final int check_sum = (adfrequency > 0 ? atAdPos(base) : 0) + base;\n            Log.d(\"getItemCountE2\", check_sum + \"\");\n            return check_sum;\n        }\n    }\n\n    /**\n     * indicate if the touch position is at the Adview\n     *\n     * @param pos in raw\n     * @return in raw\n     */\n    @Override\n    protected boolean isOnAdView(int pos) {\n        final int zero_for_admob_selection = (pos + 1) % adfrequency;\n        return zero_for_admob_selection == 0;\n    }\n\n    @Override\n    protected void notifyAfterRemoveAllData(int data_size_before_remove, int display_size_before_remove) {\n        try {\n\n            final int n_start = hasHeaderView() ? 1 : 0;\n\n            final int n_end = hasHeaderView() ? display_size_before_remove - 1 : display_size_before_remove;\n\n            if (detectDispatchLoadMoreDisplay(data_size_before_remove, display_size_before_remove))\n                return;\n\n            if (data_size_before_remove == 0) return;\n\n            if (mEmptyViewPolicy == UltimateRecyclerView.EMPTY_KEEP_HEADER_AND_LOARMORE) {\n                notifyItemRangeRemoved(n_start, n_end);\n            } else if (mEmptyViewPolicy == UltimateRecyclerView.EMPTY_KEEP_HEADER) {\n                notifyItemRangeRemoved(n_start, n_end);\n                removeDispatchLoadMoreView();\n            } else if (mEmptyViewPolicy == UltimateRecyclerView.EMPTY_CLEAR_ALL) {\n                notifyItemRangeRemoved(0, display_size_before_remove);\n                removeDispatchLoadMoreView();\n            } else {\n                notifyItemRangeRemoved(0, display_size_before_remove);\n            }\n\n        } catch (Exception e) {\n            String o = e.fillInStackTrace().getCause().getMessage().toString();\n            Log.d(\"fillInStackTrace\", o + \" : \");\n        }\n    }\n\n    /**\n     * data binding related position shifting\n     *\n     * @param touch_position pos machine loaded position in int\n     * @return the final confirmed position for data binding\n     */\n    @Override\n    protected int getItemDataPosFromInternalPos(int touch_position) {\n        int shift = 0;\n        if (hasHeaderView()) shift--;\n        if (adfrequency > 0) {\n            if (once) {\n                if (touch_position >= adfrequency) shift--;\n            } else {\n                shift -= atAdPos(touch_position);\n            }\n        }\n        return touch_position + shift;\n    }\n\n    /**\n     * this is the {getDataArrayPosition} reverse from data position to layout position\n     *\n     * @param dataPos position on the data list\n     * @return offset\n     */\n    protected int getReverseDataArrayPosition(final int dataPos) {\n        int shift = 0;\n        if (hasHeaderView()) shift++;\n        if (adfrequency > 0) {\n            if (once) {\n                if (dataPos >= adfrequency) shift++;\n            } else {\n                shift += atAdPos(dataPos);\n            }\n        }\n        return dataPos + shift;\n    }\n\n\n    /**\n     * the API access for adview indication\n     *\n     * @param pos position to be final\n     * @return bool\n     */\n    public final boolean isPosOnAdView(final int pos) {\n        return isOnAdView(pos);\n    }\n\n    /**\n     * to display the accumulator for the Ad position\n     *\n     * @param pos raw touch position\n     * @return the placement for the ad position\n     */\n    public final int atAdPos(final int pos) {\n        final int take_int = (int) Math.floor((pos + 1) / adfrequency);\n        Log.d(\"atAdPosE2\", take_int + \"\");\n        return take_int;\n    }\n\n    /**\n     * for external shift number adjustment\n     *\n     * @param pos initial number\n     * @return the number\n     */\n    public final int getFinalShiftPosition(int pos) {\n        return getItemDataPosFromInternalPos(pos);\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/quickAdapter/BiAdAdapterSwitcher.java",
    "content": "package com.marshalchen.ultimaterecyclerview.quickAdapter;\n\n\nimport android.app.Activity;\nimport android.os.Handler;\nimport androidx.annotation.LayoutRes;\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.Display;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.FrameLayout;\nimport android.widget.LinearLayout;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;\nimport com.marshalchen.ultimaterecyclerview.layoutmanagers.ScrollSmoothLineaerLayoutManager;\n\nimport java.util.List;\n\n\n/**\n * this is the simple switchable adapter for easy implementation\n * Created by hesk on 4/8/15.\n */\npublic class BiAdAdapterSwitcher<\n        //DATA TYPE\n        T,\n        //The view holder\n        B extends AdItemHolder,\n        //THE regular adapter\n        EASY extends easyRegularAdapter<T, B>,\n        //THE Viewgroup from the google Adview\n        V extends ViewGroup,\n        //the admobdapter\n        ADMOB extends AdmobAdapter<V,T,B>>\n\n{\n    protected UltimateRecyclerView listview;\n    protected EASY noad;\n    protected ADMOB withad;\n    protected onLoadMore loading_more;\n    protected boolean with_the_ad, auto_disable_loadmore = false;\n    protected int page_now = 1, max_pages = 3, layoutLoadMoreResId = 0, container_data_items;\n    protected RecyclerView.LayoutManager mManager;\n\n    public void setMaxPages(final int n) {\n        max_pages = n;\n    }\n\n    public BiAdAdapterSwitcher(UltimateRecyclerView view, EASY adapter_without_ad, ADMOB adapter_with_ad) {\n        this.listview = view;\n        this.noad = adapter_without_ad;\n        this.withad = adapter_with_ad;\n        this.mManager = view.getLayoutManager();\n    }\n\n    public BiAdAdapterSwitcher EnableAutoDisableLoadMoreByMaxPages() {\n        auto_disable_loadmore = true;\n        return this;\n    }\n\n    public void init(final boolean adenabled) {\n        this.with_the_ad = adenabled;\n      /*  if (layoutLoadMoreResId != 0) {\n            listview.enableLoadmore();\n        }\n        */\n        listview.setAdapter(adenabled ? this.withad : this.noad);\n        emptyViewControl();\n    }\n\n\n    protected void emptyViewControl() {\n        container_data_items = with_the_ad ? withad.getItemCount() : noad.getItemCount();\n        if (container_data_items > 0) {\n            listview.hideEmptyView();\n        } else {\n            listview.showEmptyView();\n        }\n    }\n\n    public void scrollToTop() {\n        if (mManager == null) mManager = listview.getLayoutManager();\n        if (mManager == null) return;\n\n        if (mManager instanceof LinearLayoutManager) {\n            LinearLayoutManager mLayoutManager = (LinearLayoutManager) mManager;\n            if (mLayoutManager.getStackFromEnd() && mLayoutManager.canScrollVertically()) {\n                mLayoutManager.scrollToPosition(1);\n            }\n        } else if (mManager instanceof ScrollSmoothLineaerLayoutManager) {\n            LinearLayoutManager mLayoutManager = (ScrollSmoothLineaerLayoutManager) mManager;\n            if (mLayoutManager.getStackFromEnd() && mLayoutManager.canScrollVertically()) {\n                mLayoutManager.scrollToPosition(1);\n            }\n        }\n    }\n\n    public interface onLoadMore {\n        boolean request_start(int current_page_no, int itemsCount, final int maxLastVisiblePosition, final BiAdAdapterSwitcher this_module, final boolean onRefresh);\n    }\n\n    protected Runnable refresh_default = new Runnable() {\n        @Override\n        public void run() {\n            reset();\n            if (loading_more != null) {\n                final boolean success_onStart = loading_more.request_start(1, 0, 0, BiAdAdapterSwitcher.this, true);\n                if (success_onStart) {\n                    page_now = 2;\n                    max_pages = 3;\n                    //notifyDataSetChanged();\n\n                } else {\n                    if (auto_disable_loadmore) listview.disableLoadmore();\n                    /** not okay, maybe consider to disable load more. **/\n                }\n            }\n            listview.setRefreshing(false);\n        }\n    };\n\n    protected BiAdAdapterSwitcher setCustomOnFresh(Runnable h) {\n        this.refresh_default = h;\n        return this;\n    }\n\n    /**\n     * will implement more functions later\n     *\n     * @param delay_trigger na\n     * @return switchableadapter object\n     */\n\n    public BiAdAdapterSwitcher onEnableRefresh(final int delay_trigger) {\n        listview.setDefaultOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {\n            @Override\n            public void onRefresh() {\n                new Handler().postDelayed(refresh_default, delay_trigger);\n            }\n        });\n        return this;\n    }\n\n    public void removeALL() {\n        reset();\n    }\n\n    /**\n     * once it is called, the list will restart from the zero scroll\n     */\n    public void notifyDataSetChanged() {\n        if (with_the_ad) {\n            withad.notifyDataSetChanged();\n        } else {\n            noad.notifyDataSetChanged();\n        }\n    }\n\n    private void reset() {\n        if (with_the_ad) {\n            withad.removeAll();\n        } else {\n            noad.removeAll();\n        }\n\n\n    }\n\n    public void load_more_data(final List<T> new_data_list) {\n        if (with_the_ad) {\n            insert_default(withad, new_data_list);\n        } else {\n            insert_default(noad, new_data_list);\n        }\n    }\n\n    public void load_more_data_at_zero(final List<T> new_data_list) {\n        if (with_the_ad) {\n            insert_default(withad, new_data_list);\n        } else {\n            insert_default(noad, new_data_list);\n        }\n    }\n\n    public BiAdAdapterSwitcher onEnableLoadmore(\n            final @LayoutRes int layoutResId,\n            final int delay_trigger,\n            final onLoadMore loading_more_trigger_interface) {\n        loading_more = loading_more_trigger_interface;\n      /*  listview.setOnLoadMoreListener(new UltimateRecyclerView.OnLoadMoreListener() {\n            @Override\n            public void loadMore(final int itemsCount, final int maxLastVisiblePosition) {\n                Handler handler = new Handler();\n                handler.postDelayed(new Runnable() {\n                    public void run() {\n                        Log.d(\"loadmore\", maxLastVisiblePosition + \" position\");\n                        if (loading_more != null) {\n                            final boolean request_success = loading_more.request_start(page_now, itemsCount, maxLastVisiblePosition, BiAdAdapterSwitcher.this, false);\n\n                            if (request_success && page_now < max_pages) {\n\n                                if (auto_disable_loadmore && !listview.isLoadMoreEnabled()) {\n                                    listview.reenableLoadmore();\n                                }\n\n                                page_now++;\n                            } else {\n                                Log.d(\"loadmore\", \"request failed position\");\n                                if (auto_disable_loadmore) listview.disableLoadmore();\n                            }\n                        }\n                    }\n                }, delay_trigger);\n            }\n        });*/\n        this.layoutLoadMoreResId = layoutResId;\n        return this;\n    }\n\n    private View getV(final @LayoutRes int layoutResId) {\n        return LayoutInflater.from(listview.getContext()).inflate(layoutResId, null);\n    }\n\n\n    private void insert_default(EASY sd, List<T> list) {\n        sd.insert(list);\n    }\n\n    private void insert_default(ADMOB sd, List<T> list) {\n        sd.insert(list);\n    }\n\n    public static <V extends ViewGroup> void maximum_size(LinearLayout l, V suppose_tobe_Adview, Activity activity) {\n        Display display = activity.getWindowManager().getDefaultDisplay();\n        int width = display.getWidth();\n        double ratio = ((float) (width)) / 300.0;\n        int height = (int) (ratio * 50);\n        suppose_tobe_Adview.setLayoutParams(new FrameLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, height));\n        l.addView(suppose_tobe_Adview);\n\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/quickAdapter/StaggerHolder.java",
    "content": "package com.marshalchen.ultimaterecyclerview.quickAdapter;\n\nimport androidx.recyclerview.widget.StaggeredGridLayoutManager;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder;\nimport com.marshalchen.ultimaterecyclerview.UltimateViewAdapter;\n\n/**\n * only Stagger layout use only\n * Created by hesk on 5/4/16.\n */\npublic abstract class StaggerHolder extends UltimateRecyclerviewViewHolder {\n    private final int innerType;\n    protected final StaggeredGridLayoutManager.LayoutParams fullSpanLayout = new\n            StaggeredGridLayoutManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);\n\n    public StaggerHolder(View itemView, int type) {\n        super(itemView);\n        innerType = type;\n        fullSpanLayout.setFullSpan(true);\n        if (innerType == UltimateViewAdapter.VIEW_TYPES.NORMAL) {\n            bindNormal(itemView);\n        } else if (innerType == UltimateViewAdapter.VIEW_TYPES.ADVIEW) {\n            bindAd(itemView);\n        } else if (innerType == UltimateViewAdapter.VIEW_TYPES.HEADER) {\n            itemView.setLayoutParams(fullSpanLayout);\n            bindHeader(itemView);\n        } else if (innerType == UltimateViewAdapter.VIEW_TYPES.FOOTER) {\n            itemView.setLayoutParams(fullSpanLayout);\n            bindFooter(itemView);\n        }\n    }\n\n    protected abstract void bindHeader(View view);\n\n    protected abstract void bindFooter(View view);\n\n    protected abstract void bindNormal(View view);\n\n    protected abstract void bindAd(View view);\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/quickAdapter/easyRegularAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.quickAdapter;\n\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder;\nimport com.marshalchen.ultimaterecyclerview.UltimateViewAdapter;\n\nimport java.lang.reflect.Constructor;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\n/**\n * This is the normal adapter for implementation on the regular basis\n * Created by hesk on 4/8/15.\n * integrated with efficient adapter\n */\npublic abstract class easyRegularAdapter<T, BINDHOLDER extends UltimateRecyclerviewViewHolder> extends UltimateViewAdapter {\n    protected List<T> source;\n\n\n    /**\n     * dynamic object to start\n     *\n     * @param list the list source\n     */\n    public easyRegularAdapter(List<T> list) {\n        source = list;\n    }\n\n\n    /**\n     * Constructor\n     *\n     * @param objects The objects to represent in the RecyclerView.\n     */\n    public easyRegularAdapter(T... objects) {\n        this(new ArrayList<T>(Arrays.asList(objects)));\n    }\n\n\n    /**\n     * the layout id for the normal data\n     *\n     * @return the ID\n     */\n    protected abstract int getNormalLayoutResId();\n\n    /**\n     * this is the Normal View Holder initiation\n     *\n     * @param view view\n     * @return holder\n     */\n    protected abstract BINDHOLDER newViewHolder(View view);\n\n    @Override\n    public BINDHOLDER newFooterHolder(View view) {\n        return null;\n    }\n\n    @Override\n    public BINDHOLDER newHeaderHolder(View view) {\n        return null;\n    }\n\n    /**\n     * this MUST BE USING THE NORMAL VIEW\n     *\n     * @param parent view group parent\n     * @return THE HOLDER\n     */\n    @Override\n    public UltimateRecyclerviewViewHolder onCreateViewHolder(ViewGroup parent) {\n        View v = LayoutInflater.from(parent.getContext()).inflate(getNormalLayoutResId(), parent, false);\n        return newViewHolder(v);\n    }\n\n    @Override\n    public int getAdapterItemCount() {\n        return source.size();\n    }\n\n    protected T getItem(final int pos) {\n        synchronized (mLock) {\n            return source.get(pos);\n        }\n    }\n\n    /**\n     * Determine if the object provide is in this adapter\n     *\n     * @param object the data object\n     * @return true if the object is in this adapter\n     */\n    public boolean hasItem(T object) {\n        synchronized (mLock) {\n            return source.contains(object);\n        }\n    }\n\n    /**\n     * Returns whether this {@code List} contains no elements.\n     *\n     * @return {@code true} if this {@code List} has no elements, {@code false}\n     * otherwise.\n     * @see #source\n     */\n    public boolean isEmpty() {\n        return source.size() == 0;\n    }\n\n\n    /**\n     * @return a copy of the {@code List} of elements.\n     */\n    public List<T> getObjects() {\n        synchronized (mLock) {\n            return new ArrayList<T>(source);\n        }\n    }\n\n\n    @Override\n    public long generateHeaderId(int i) {\n        //    if (position < stringList.size())\n        // return stringList.get(position);\n        return -1;\n    }\n\n    @Override\n    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {\n        //    if (position >= getAdapterItemCount()) return;\n        if (getItemViewType(position) == VIEW_TYPES.ADVIEW) {\n            onBindAdViewHolder(holder, position);\n        } else if (getItemViewType(position) == VIEW_TYPES.CUSTOMVIEW) {\n            onBindCustomViewHolder(holder, position);\n        } else if (getItemViewType(position) == VIEW_TYPES.HEADER) {\n            onBindHeaderViewHolder(holder, position);\n        } else if (getItemViewType(position) == VIEW_TYPES.FOOTER) {\n            onBindFooterViewHolder(holder, position);\n        } else if (getItemViewType(position) == VIEW_TYPES.NORMAL) {\n            // if (position >= getAdapterItemCount()) return;\n            T object;\n            synchronized (mLock) {\n                object = source.get(getItemDataPosFromInternalPos(position));\n            }\n            withBindHolder((BINDHOLDER) holder, object, position);\n        }\n    }\n\n\n    protected int getItemDataPosFromInternalPos(final int touch_position) {\n        int shift = 0;\n        if (hasHeaderView()) shift--;\n        int prefinal = touch_position + shift;\n        if (prefinal >= getAdapterItemCount()) {\n            return 0;\n        } else if (prefinal < 0) {\n            return 0;\n        }\n        return prefinal;\n    }\n\n\n    /**\n     * binding normal view holder\n     *\n     * @param holder   holder class\n     * @param data     data\n     * @param position position\n     */\n    protected abstract void withBindHolder(final BINDHOLDER holder, final T data, final int position);\n\n    /**\n     * this is the implementation from sticky viewholder interface\n     *\n     * @param viewHolder ViewHolder\n     * @param pos        position\n     */\n    @Override\n    public void onBindHeaderViewHolder(RecyclerView.ViewHolder viewHolder, int pos) {\n\n    }\n\n    protected void onBindFooterViewHolder(RecyclerView.ViewHolder holder, final int pos) {\n\n    }\n\n    protected void onBindCustomViewHolder(RecyclerView.ViewHolder holder, final int pos) {\n\n    }\n\n    protected void onBindAdViewHolder(RecyclerView.ViewHolder holder, final int pos) {\n\n    }\n\n    @Override\n    public UltimateRecyclerviewViewHolder onCreateHeaderViewHolder(ViewGroup parent) {\n        return new UltimateRecyclerviewViewHolder(parent);\n    }\n\n\n    public void insert(List<T> new_data) {\n        insertInternal(new_data, source);\n    }\n\n    public void removeAll() {\n        clearInternal(source);\n    }\n\n    public void insertFirst(T item) {\n        insertFirstInternal(source, item);\n    }\n\n    public void insertLast(T item) {\n        insertLastInternal(source, item);\n    }\n\n\n    public final void removeAt(int pos) {\n        removeInternal(source, pos);\n    }\n\n    public void removeLast() {\n        removeLastInternal(source);\n    }\n\n    public void removeFirst() {\n        removeFirstInternal(source);\n    }\n\n    public final void swapPositions(int from, int to) {\n        swapPositions(source, from, to);\n    }\n\n    public void setStableId(boolean b) {\n        if (!hasObservers()) {\n            setHasStableIds(b);\n        }\n    }\n\n\n    /**\n     * Adds the specified Collection at the end of the array.\n     *\n     * @param collection The Collection to add at the end of the array.\n     */\n/*    public void addAll(Collection<? extends T> collection) {\n        int positionOfInsert;\n        synchronized (mLock) {\n         //   positionOfInsert = mObjects.size();\n          //  mObjects.addAll(collection);\n        }\n        notifyItemInserted(positionOfInsert);\n    }*/\n\n    /**\n     * Get the view holder to instantiate for the object for this position\n     *\n     * @param viewType viewType return by getItemViewType()\n     * @return the class of the view holder to instantiate\n     */\n    //protected abstract Class<? extends BINDHOLDER> getViewHolderClass(int viewType);\n\n    /**\n     * Generate a view holder for this view for this viewType\n     */\n  /*  private BINDHOLDER generateViewHolder(View v, int viewType) {\n        Class<? extends BINDHOLDER> viewHolderClass = getViewHolderClass(viewType);\n        if (viewHolderClass == null) {\n            throw new NullPointerException(\n                    \"You must supply a view holder class for the element for view type \"\n                            + viewType);\n        }\n        Constructor<?> constructorWithView = getConstructorWithView(viewHolderClass);\n        try {\n            Object viewHolder = constructorWithView.newInstance(v);\n            return (BINDHOLDER) viewHolder;\n        } catch (InvocationTargetException e) {\n            throw new RuntimeException(\n                    \"Impossible to instantiate \"\n                            + viewHolderClass.getSimpleName(), e);\n        } catch (InstantiationException e) {\n            throw new RuntimeException(\n                    \"Impossible to instantiate \"\n                            + viewHolderClass.getSimpleName(), e);\n        } catch (IllegalAccessException e) {\n            throw new RuntimeException(\n                    \"Impossible to instantiate \"\n                            + viewHolderClass.getSimpleName(), e);\n        }\n    }*/\n\n    /**\n     * Get the constructor with a view for this class\n     */\n    private Constructor<?> getConstructorWithView(Class<? extends BINDHOLDER> viewHolderClass) {\n        Constructor<?>[] constructors = viewHolderClass.getDeclaredConstructors();\n        if (constructors != null) {\n            for (Constructor<?> constructor : constructors) {\n                Class<?>[] parameterTypes = constructor.getParameterTypes();\n                if (parameterTypes != null\n                        && parameterTypes.length == 1\n                        && parameterTypes[0].isAssignableFrom(View.class)) {\n                    return constructor;\n                }\n            }\n        }\n        throw new RuntimeException(\n                \"Impossible to found a constructor with a view for \"\n                        + viewHolderClass.getSimpleName());\n    }\n\n/*\n\n    @Override\n    public void onViewRecycled(BINDHOLDER holder) {\n        super.onViewRecycled(holder);\n        holder.onViewRecycled();\n    }\n\n    @Override\n    public void onViewAttachedToWindow(BINDHOLDER holder) {\n        super.onViewAttachedToWindow(holder);\n        holder.onViewAttachedToWindow();\n    }\n\n    @Override\n    public void onViewDetachedFromWindow(BINDHOLDER holder) {\n        super.onViewDetachedFromWindow(holder);\n        holder.onViewDetachedFromWindow();\n    }\n*/\n\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/quickAdapter/extBaseAdapter/BaseAdapterHelper.java",
    "content": "package com.marshalchen.ultimaterecyclerview.quickAdapter.extBaseAdapter;\n\n/**\n * Copyright 2013 Joan Zapata\n * <p/>\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * <p/>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p/>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics.Paint;\nimport android.graphics.Typeface;\nimport android.graphics.drawable.Drawable;\nimport android.os.Build;\nimport android.text.util.Linkify;\nimport android.util.SparseArray;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.animation.AlphaAnimation;\nimport android.widget.*;\n\nimport com.bumptech.glide.Glide;\n\n/**\n * Allows an abstraction of the ViewHolder pattern.\n * Usage\n * return BaseAdapterHelper.get(context, convertView, parent, R.layout.item)\n * .setText(R.id.tvName, contact.getName())\n * .setText(R.id.tvEmails, contact.getEmails().toString())\n * .setText(R.id.tvNumbers, contact.getNumbers().toString()).getView();\n */\npublic class BaseAdapterHelper {\n\n    /**\n     * Views indexed with their IDs\n     */\n    private final SparseArray<View> views;\n\n    private final Context context;\n\n    private int position;\n\n    private View convertView;\n\n    public int layoutId;\n\n    /**\n     * Package private field to retain the associated user object and detect a\n     * change\n     */\n    Object associatedObject;\n\n    protected BaseAdapterHelper(Context context, ViewGroup parent,\n                                int layoutId, int position) {\n        this.context = context;\n        this.position = position;\n        this.layoutId = layoutId;\n        this.views = new SparseArray<View>();\n        convertView = LayoutInflater.from(context) //\n                .inflate(layoutId, parent, false);\n        convertView.setTag(this);\n    }\n\n    /**\n     * This method is the only entry point to get a BaseAdapterHelper.\n     *\n     * @param context     The current context.\n     * @param convertView The convertView arg passed to the getView() method.\n     * @param parent      The parent arg passed to the getView() method.\n     * @param layoutId    na\n     * @return A BaseAdapterHelper instance.\n     */\n    public static BaseAdapterHelper get(Context context, View convertView,\n                                        ViewGroup parent, int layoutId) {\n        return get(context, convertView, parent, layoutId, -1);\n    }\n\n    /**\n     * This method is package private and should only be used by QuickAdapter.\n     *\n     * @param context     na\n     * @param convertView na\n     * @param parent      na\n     * @param layoutId    na\n     * @param position    na\n     * @return na\n     */\n    static BaseAdapterHelper get(Context context, View convertView,\n                                 ViewGroup parent, int layoutId, int position) {\n        if (convertView == null) {\n            return new BaseAdapterHelper(context, parent, layoutId, position);\n        }\n\n        // Retrieve the existing helper and update its position\n        BaseAdapterHelper existingHelper = (BaseAdapterHelper) convertView\n                .getTag();\n\n        if (existingHelper.layoutId != layoutId) {\n            return new BaseAdapterHelper(context, parent, layoutId, position);\n        }\n\n        existingHelper.position = position;\n        return existingHelper;\n    }\n\n    /**\n     * This method allows you to retrieve a view and perform custom operations\n     * on it, not covered by the BaseAdapterHelper.\n     * If you think it's a common use case, please consider creating a new issue\n     * at https://github.com/JoanZapata/base-adapter-helper/issues.\n     *\n     * @param viewId The id of the view you want to retrieve.\n     * @param <T>    na\n     * @return na\n     */\n    public <T extends View> T getView(int viewId) {\n        return retrieveView(viewId);\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    protected <T extends View> T retrieveView(int viewId) {\n        View view = views.get(viewId);\n        if (view == null) {\n            view = convertView.findViewById(viewId);\n            views.put(viewId, view);\n        }\n        return (T) view;\n    }\n\n    /**\n     * Will set the text of a TextView.\n     *\n     * @param viewId The view id.\n     * @param value  The text to put in the text view.\n     * @return The BaseAdapterHelper for chaining.\n     */\n    public BaseAdapterHelper setText(int viewId, String value) {\n        TextView view = retrieveView(viewId);\n        view.setText(value);\n        return this;\n    }\n\n    /**\n     * Will set the image of an ImageView from a resource id.\n     *\n     * @param viewId     The view id.\n     * @param imageResId The image resource id.\n     * @return The BaseAdapterHelper for chaining.\n     */\n    public BaseAdapterHelper setImageResource(int viewId, int imageResId) {\n        ImageView view = retrieveView(viewId);\n        view.setImageResource(imageResId);\n        return this;\n    }\n\n    /**\n     * Will set background color of a view.\n     *\n     * @param viewId The view id.\n     * @param color  A color, not a resource id.\n     * @return The BaseAdapterHelper for chaining.\n     */\n    public BaseAdapterHelper setBackgroundColor(int viewId, int color) {\n        View view = retrieveView(viewId);\n        view.setBackgroundColor(color);\n        return this;\n    }\n\n    /**\n     * Will set background of a view.\n     *\n     * @param viewId        The view id.\n     * @param backgroundRes A resource to use as a background.\n     * @return The BaseAdapterHelper for chaining.\n     */\n    public BaseAdapterHelper setBackgroundRes(int viewId, int backgroundRes) {\n        View view = retrieveView(viewId);\n        view.setBackgroundResource(backgroundRes);\n        return this;\n    }\n\n    /**\n     * Will set text color of a TextView.\n     *\n     * @param viewId    The view id.\n     * @param textColor The text color (not a resource id).\n     * @return The BaseAdapterHelper for chaining.\n     */\n    public BaseAdapterHelper setTextColor(int viewId, int textColor) {\n        TextView view = retrieveView(viewId);\n        view.setTextColor(textColor);\n        return this;\n    }\n\n    /**\n     * Will set text color of a TextView.\n     *\n     * @param viewId       The view id.\n     * @param textColorRes The text color resource id.\n     * @return The BaseAdapterHelper for chaining.\n     */\n    public BaseAdapterHelper setTextColorRes(int viewId, int textColorRes) {\n        TextView view = retrieveView(viewId);\n        view.setTextColor(context.getResources().getColor(textColorRes));\n        return this;\n    }\n\n    /**\n     * Will set the image of an ImageView from a drawable.\n     *\n     * @param viewId   The view id.\n     * @param drawable The image drawable.\n     * @return The BaseAdapterHelper for chaining.\n     */\n    public BaseAdapterHelper setImageDrawable(int viewId, Drawable drawable) {\n        ImageView view = retrieveView(viewId);\n        view.setImageDrawable(drawable);\n        return this;\n    }\n\n    /**\n     * Will download an image from a URL and put it in an ImageView.\n     * It uses Square's Picasso library to download the image asynchronously and\n     * put the result into the ImageView.\n     * Picasso manages recycling of views in a ListView.\n     * If you need more control over the Picasso settings, use\n     * {BaseAdapterHelper#setImageBuilder}.\n     *\n     * @param viewId   The view id.\n     * @param imageUrl The image URL.\n     * @return The BaseAdapterHelper for chaining.\n     */\n    public BaseAdapterHelper setImageUrl(int viewId, String imageUrl) {\n        ImageView view = retrieveView(viewId);\n        Glide.with(context).load(imageUrl).into(view);\n        return this;\n    }\n\n    /**\n     * Will download an image from a URL and put it in an ImageView.<br/>\n     *\n     * @param viewId         The view id.\n     * @param requestBuilder The Picasso request builder. (e.g.\n     *                       Picasso.with(context).load(imageUrl))\n     * @return The BaseAdapterHelper for chaining.\n    public BaseAdapterHelper setImageBuilder(int viewId,\n    RequestCreator requestBuilder) {\n    ImageView view = retrieveView(viewId);\n    requestBuilder.into(view);\n    return this;}\n     */\n\n    /**\n     * Add an action to set the image of an image view. Can be called multiple\n     * times.\n     *\n     * @param viewId na\n     * @param bitmap na\n     * @return na\n     */\n    public BaseAdapterHelper setImageBitmap(int viewId, Bitmap bitmap) {\n        ImageView view = retrieveView(viewId);\n        view.setImageBitmap(bitmap);\n        return this;\n    }\n\n    /**\n     * Add an action to set the alpha of a view. Can be called multiple times.\n     * Alpha between 0-1.\n     *\n     * @param viewId na\n     * @param value  na\n     * @return na\n     */\n    @SuppressLint(\"NewApi\")\n    public BaseAdapterHelper setAlpha(int viewId, float value) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {\n            retrieveView(viewId).setAlpha(value);\n        } else {\n            // Pre-honeycomb hack to set Alpha value\n            AlphaAnimation alpha = new AlphaAnimation(value, value);\n            alpha.setDuration(0);\n            alpha.setFillAfter(true);\n            retrieveView(viewId).startAnimation(alpha);\n        }\n        return this;\n    }\n\n    /**\n     * Set a view visibility to VISIBLE (true) or GONE (false).\n     *\n     * @param viewId  The view id.\n     * @param visible True for VISIBLE, false for GONE.\n     * @return The BaseAdapterHelper for chaining.\n     */\n    public BaseAdapterHelper setVisible(int viewId, boolean visible) {\n        View view = retrieveView(viewId);\n        view.setVisibility(visible ? View.VISIBLE : View.GONE);\n        return this;\n    }\n\n    /**\n     * Add links into a TextView.\n     *\n     * @param viewId The id of the TextView to linkify.\n     * @return The BaseAdapterHelper for chaining.\n     */\n    public BaseAdapterHelper linkify(int viewId) {\n        TextView view = retrieveView(viewId);\n        Linkify.addLinks(view, Linkify.ALL);\n        return this;\n    }\n\n    /**\n     * Apply the typeface to the given viewId, and enable subpixel rendering.\n     *\n     * @param viewId   na\n     * @param typeface na\n     * @return na\n     */\n    public BaseAdapterHelper setTypeface(int viewId, Typeface typeface) {\n        TextView view = retrieveView(viewId);\n        view.setTypeface(typeface);\n        view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG);\n        return this;\n    }\n\n    /**\n     * Apply the typeface to all the given viewIds, and enable subpixel\n     * rendering.\n     *\n     * @param typeface na\n     * @param viewIds  na\n     * @return na\n     */\n    public BaseAdapterHelper setTypeface(Typeface typeface, int... viewIds) {\n        for (int viewId : viewIds) {\n            TextView view = retrieveView(viewId);\n            view.setTypeface(typeface);\n            view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG);\n        }\n        return this;\n    }\n\n    /**\n     * Sets the progress of a ProgressBar.\n     *\n     * @param viewId   The view id.\n     * @param progress The progress.\n     * @return The BaseAdapterHelper for chaining.\n     */\n    public BaseAdapterHelper setProgress(int viewId, int progress) {\n        ProgressBar view = retrieveView(viewId);\n        view.setProgress(progress);\n        return this;\n    }\n\n    /**\n     * Sets the progress and max of a ProgressBar.\n     *\n     * @param viewId   The view id.\n     * @param progress The progress.\n     * @param max      The max value of a ProgressBar.\n     * @return The BaseAdapterHelper for chaining.\n     */\n    public BaseAdapterHelper setProgress(int viewId, int progress, int max) {\n        ProgressBar view = retrieveView(viewId);\n        view.setMax(max);\n        view.setProgress(progress);\n        return this;\n    }\n\n    /**\n     * Sets the range of a ProgressBar to 0...max.\n     *\n     * @param viewId The view id.\n     * @param max    The max value of a ProgressBar.\n     * @return The BaseAdapterHelper for chaining.\n     */\n    public BaseAdapterHelper setMax(int viewId, int max) {\n        ProgressBar view = retrieveView(viewId);\n        view.setMax(max);\n        return this;\n    }\n\n    /**\n     * Sets the rating (the number of stars filled) of a RatingBar.\n     *\n     * @param viewId The view id.\n     * @param rating The rating.\n     * @return The BaseAdapterHelper for chaining.\n     */\n    public BaseAdapterHelper setRating(int viewId, float rating) {\n        RatingBar view = retrieveView(viewId);\n        view.setRating(rating);\n        return this;\n    }\n\n    /**\n     * Sets the rating (the number of stars filled) and max of a RatingBar.\n     *\n     * @param viewId The view id.\n     * @param rating The rating.\n     * @param max    The range of the RatingBar to 0...max.\n     * @return The BaseAdapterHelper for chaining.\n     */\n    public BaseAdapterHelper setRating(int viewId, float rating, int max) {\n        RatingBar view = retrieveView(viewId);\n        view.setMax(max);\n        view.setRating(rating);\n        return this;\n    }\n\n    /**\n     * Sets the tag of the view.\n     *\n     * @param viewId The view id.\n     * @param tag    The tag;\n     * @return The BaseAdapterHelper for chaining.\n     */\n    public BaseAdapterHelper setTag(int viewId, Object tag) {\n        View view = retrieveView(viewId);\n        view.setTag(tag);\n        return this;\n    }\n\n    /**\n     * Sets the tag of the view.\n     *\n     * @param viewId The view id.\n     * @param key    The key of tag;\n     * @param tag    The tag;\n     * @return The BaseAdapterHelper for chaining.\n     */\n    public BaseAdapterHelper setTag(int viewId, int key, Object tag) {\n        View view = retrieveView(viewId);\n        view.setTag(key, tag);\n        return this;\n    }\n\n    /**\n     * Sets the checked status of a checkable.\n     *\n     * @param viewId  The view id.\n     * @param checked The checked status;\n     * @return The BaseAdapterHelper for chaining.\n     */\n    public BaseAdapterHelper setChecked(int viewId, boolean checked) {\n        Checkable view = (Checkable) retrieveView(viewId);\n        view.setChecked(checked);\n        return this;\n    }\n\n    /**\n     * Sets the adapter of a adapter view.\n     *\n     * @param viewId  The view id.\n     * @param adapter The adapter;\n     * @return The BaseAdapterHelper for chaining.\n     */\n    public BaseAdapterHelper setAdapter(int viewId, Adapter adapter) {\n        AdapterView view = retrieveView(viewId);\n        view.setAdapter(adapter);\n        return this;\n    }\n\n    /**\n     * Sets the on click listener of the view.\n     *\n     * @param viewId   The view id.\n     * @param listener The on click listener;\n     * @return The BaseAdapterHelper for chaining.\n     */\n    public BaseAdapterHelper setOnClickListener(int viewId,\n                                                View.OnClickListener listener) {\n        View view = retrieveView(viewId);\n        view.setOnClickListener(listener);\n        return this;\n    }\n\n    /**\n     * Sets the on touch listener of the view.\n     *\n     * @param viewId   The view id.\n     * @param listener The on touch listener;\n     * @return The BaseAdapterHelper for chaining.\n     */\n    public BaseAdapterHelper setOnTouchListener(int viewId,\n                                                View.OnTouchListener listener) {\n        View view = retrieveView(viewId);\n        view.setOnTouchListener(listener);\n        return this;\n    }\n\n    /**\n     * Sets the on long click listener of the view.\n     *\n     * @param viewId   The view id.\n     * @param listener The on long click listener;\n     * @return The BaseAdapterHelper for chaining.\n     */\n    public BaseAdapterHelper setOnLongClickListener(int viewId,\n                                                    View.OnLongClickListener listener) {\n        View view = retrieveView(viewId);\n        view.setOnLongClickListener(listener);\n        return this;\n    }\n\n    /**\n     * Retrieve the convertView\n     *\n     * @return na\n     */\n    public View getView() {\n        return convertView;\n    }\n\n    /**\n     * Retrieve the overall position of the data in the list.\n     *\n     * @return na\n     * @throws IllegalArgumentException If the position hasn't been set at the construction of the\n     *                                  this helper.\n     */\n    public int getPosition() {\n        if (position == -1)\n            throw new IllegalStateException(\n                    \"Use BaseAdapterHelper constructor \"\n                            + \"with position if you need to retrieve the position.\");\n        return position;\n    }\n\n    /**\n     * Retrieves the last converted object on this view.\n     *\n     * @return na\n     */\n    public Object getAssociatedObject() {\n        return associatedObject;\n    }\n\n    /**\n     * Should be called during convert\n     *\n     * @param associatedObject na\n     */\n    public void setAssociatedObject(Object associatedObject) {\n        this.associatedObject = associatedObject;\n    }\n}"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/quickAdapter/extBaseAdapter/BaseQuickAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.quickAdapter.extBaseAdapter;\n\n/**\n * Copyright 2013 Joan Zapata\n * <p/>\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * <p/>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p/>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport android.content.Context;\nimport android.view.Gravity;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.BaseAdapter;\nimport android.widget.FrameLayout;\nimport android.widget.ProgressBar;\n\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.extUtimateRVA.MultiItemTypeSupport;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Abstraction class of a BaseAdapter in which you only need to provide the\n * convert() implementation.\n * Using the provided BaseAdapterHelper, your code is minimalist.\n *\n * @param <T> The type of the items in the list.\n */\n\npublic abstract class BaseQuickAdapter<T, H extends BaseAdapterHelper> extends BaseAdapter {\n\n    protected static final String TAG = BaseQuickAdapter.class.getSimpleName();\n\n    protected final Context context;\n\n    protected int layoutResId;\n\n    protected final List<T> data;\n\n    protected boolean displayIndeterminateProgress = false;\n\n    /**\n     * Create a QuickAdapter.\n     *\n     * @param context     The context.\n     * @param layoutResId The layout resource id of each item.\n     */\n    public BaseQuickAdapter(Context context, int layoutResId) {\n        this(context, layoutResId, null);\n    }\n\n    /**\n     * Same as QuickAdapter#QuickAdapter(Context,int) but with some\n     * initialization data.\n     *\n     * @param context     The context.\n     * @param layoutResId The layout resource id of each item.\n     * @param data        A new list is created out of this one to avoid mutable list\n     */\n    public BaseQuickAdapter(Context context, int layoutResId, List<T> data) {\n        this.data = data == null ? new ArrayList<T>() : new ArrayList<T>(data);\n        this.context = context;\n        this.layoutResId = layoutResId;\n    }\n\n    protected MultiItemTypeSupport<T> mMultiItemSupport;\n\n    public BaseQuickAdapter(Context context, ArrayList<T> data,\n                            MultiItemTypeSupport<T> multiItemSupport) {\n        this.mMultiItemSupport = multiItemSupport;\n        this.data = data == null ? new ArrayList<T>() : new ArrayList<T>(data);\n        this.context = context;\n    }\n\n    @Override\n    public int getCount() {\n        int extra = displayIndeterminateProgress ? 1 : 0;\n        return data.size() + extra;\n    }\n\n    @Override\n    public T getItem(int position) {\n        if (position >= data.size())\n            return null;\n        return data.get(position);\n    }\n\n    @Override\n    public long getItemId(int position) {\n        return position;\n    }\n\n    @Override\n    public int getViewTypeCount() {\n        if (mMultiItemSupport != null)\n            return mMultiItemSupport.getViewTypeCount() + 1;\n        return 2;\n    }\n\n    @Override\n    public int getItemViewType(int position) {\n        if (displayIndeterminateProgress) {\n            if (mMultiItemSupport != null)\n                return position >= data.size() ? 0 : mMultiItemSupport\n                        .getItemViewType(position, data.get(position));\n        } else {\n            if (mMultiItemSupport != null)\n                return mMultiItemSupport.getItemViewType(position,\n                        data.get(position));\n        }\n\n        return position >= data.size() ? 0 : 1;\n\n    }\n\n    @Override\n    public View getView(int position, View convertView, ViewGroup parent) {\n        if (getItemViewType(position) == 0) {\n            return createIndeterminateProgressView(convertView, parent);\n        }\n        final H helper = getAdapterHelper(position, convertView, parent);\n        T item = getItem(position);\n        helper.setAssociatedObject(item);\n        convert(helper, item);\n        return helper.getView();\n\n    }\n\n    private View createIndeterminateProgressView(View convertView,\n                                                 ViewGroup parent) {\n        if (convertView == null) {\n            FrameLayout container = new FrameLayout(context);\n            container.setForegroundGravity(Gravity.CENTER);\n            ProgressBar progress = new ProgressBar(context);\n            container.addView(progress);\n            convertView = container;\n        }\n        return convertView;\n    }\n\n    @Override\n    public boolean isEnabled(int position) {\n        return position < data.size();\n    }\n\n    public void add(T elem) {\n        data.add(elem);\n        notifyDataSetChanged();\n    }\n\n    public void addAll(List<T> elem) {\n        data.addAll(elem);\n        notifyDataSetChanged();\n    }\n\n    public void set(T oldElem, T newElem) {\n        set(data.indexOf(oldElem), newElem);\n    }\n\n    public void set(int index, T elem) {\n        data.set(index, elem);\n        notifyDataSetChanged();\n    }\n\n    public void remove(T elem) {\n        data.remove(elem);\n        notifyDataSetChanged();\n    }\n\n    public void remove(int index) {\n        data.remove(index);\n        notifyDataSetChanged();\n    }\n\n    public void replaceAll(List<T> elem) {\n        data.clear();\n        data.addAll(elem);\n        notifyDataSetChanged();\n    }\n\n    public boolean contains(T elem) {\n        return data.contains(elem);\n    }\n\n    /**\n     * Clear data list\n     */\n    public void clear() {\n        data.clear();\n        notifyDataSetChanged();\n    }\n\n    public void showIndeterminateProgress(boolean display) {\n        if (display == displayIndeterminateProgress)\n            return;\n        displayIndeterminateProgress = display;\n        notifyDataSetChanged();\n    }\n\n    /**\n     * Implement this method and use the helper to adapt the view to the given\n     * item.\n     *\n     * @param helper A fully initialized helper.\n     * @param item   The item that needs to be displayed.\n     */\n    protected abstract void convert(H helper, T item);\n\n    /**\n     * You can override this method to use a custom BaseAdapterHelper in order\n     * to fit your needs\n     *\n     * @param position    The position of the item within the adapter's data set of the\n     *                    item whose view we want.\n     * @param convertView The old view to reuse, if possible. Note: You should check\n     *                    that this view is non-null and of an appropriate type before\n     *                    using. If it is not possible to convert this view to display\n     *                    the correct data, this method can create a new view.\n     *                    Heterogeneous lists can specify their number of view types, so\n     *                    that this View is always of the right type (see\n     *                    {@link #getViewTypeCount()} and {@link #getItemViewType(int)}\n     *                    ).\n     * @param parent      The parent that this view will eventually be attached to\n     * @return An instance of BaseAdapterHelper\n     */\n    protected abstract H getAdapterHelper(int position, View convertView,\n                                          ViewGroup parent);\n\n}"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/quickAdapter/extBaseAdapter/EnhancedQuickAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.quickAdapter.extBaseAdapter;\n\n/**\n * Copyright 2013 Joan Zapata\n * <p/>\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * <p/>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p/>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport android.content.Context;\n\nimport java.util.List;\n\n/**\n * Same as QuickAdapter, but adds an \"itemChanged\" boolean in the\n * convert() method params, which allows you to know if you are\n * adapting the new view to the same item or not, and therefore\n * make a difference between dataset changed / dataset invalidated.\n * Abstraction class of a BaseAdapter in which you only need\n * to provide the convert() implementation.\n * Using the provided BaseAdapterHelper, your code is minimalist.\n * @param <T> The type of the items in the list.\n */\n\npublic abstract class EnhancedQuickAdapter<T> extends QuickAdapter<T> {\n\n    /**\n     * Create a QuickAdapter.\n     * @param context     The context.\n     * @param layoutResId The layout resource id of each item.\n     */\n    public EnhancedQuickAdapter(Context context, int layoutResId) {\n        super(context, layoutResId);\n    }\n\n    /**\n     * Same as QuickAdapter#QuickAdapter(Context,int) but with\n     * some initialization data.\n     * @param context     The context.\n     * @param layoutResId The layout resource id of each item.\n     * @param data        A new list is created out of this one to avoid mutable list\n     */\n    public EnhancedQuickAdapter(Context context, int layoutResId, List<T> data) {\n        super(context, layoutResId, data);\n    }\n\n    @Override\n    protected final void convert(BaseAdapterHelper helper, T item) {\n        boolean itemChanged = helper.associatedObject == null || !helper.associatedObject.equals(item);\n        helper.associatedObject = item;\n        convert(helper, item, itemChanged);\n    }\n\n    /**\n     * @param helper      The helper to use to adapt the view.\n     * @param item        The item you should adapt the view to.\n     * @param itemChanged Whether or not the helper was bound to another object before.\n     */\n    protected abstract void convert(BaseAdapterHelper helper, T item, boolean itemChanged);\n}"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/quickAdapter/extBaseAdapter/QuickAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.quickAdapter.extBaseAdapter;\n\n\nimport android.content.Context;\n\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.extUtimateRVA.MultiItemTypeSupport;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport static com.marshalchen.ultimaterecyclerview.quickAdapter.extBaseAdapter.BaseAdapterHelper.get;\n\n/**\n * Abstraction class of a BaseAdapter in which you only need to provide the\n * convert() implementation.\n * Using the provided BaseAdapterHelper, your code is minimalist.\n *\n * @param <T> The type of the items in the list.\n */\npublic abstract class QuickAdapter<T> extends\n        BaseQuickAdapter<T, BaseAdapterHelper> {\n\n    /**\n     * Create a QuickAdapter.\n     *\n     * @param context     The context.\n     * @param layoutResId The layout resource id of each item.\n     */\n    public QuickAdapter(Context context, int layoutResId) {\n        super(context, layoutResId);\n    }\n\n    /**\n     * Same as QuickAdapter#QuickAdapter(Context,int) but with some\n     * initialization data.\n     *\n     * @param context     The context.\n     * @param layoutResId The layout resource id of each item.\n     * @param data        A new list is created out of this one to avoid mutable list\n     */\n    public QuickAdapter(Context context, int layoutResId, List<T> data) {\n        super(context, layoutResId, data);\n    }\n\n    public QuickAdapter(Context context, ArrayList<T> data,\n                        MultiItemTypeSupport<T> multiItemSupport) {\n        super(context, data, multiItemSupport);\n    }\n\n    protected BaseAdapterHelper getAdapterHelper(int position,\n                                                 View convertView,\n                                                 ViewGroup parent) {\n\n        if (mMultiItemSupport != null) {\n            return get(context,\n                    convertView,\n                    parent,\n                    mMultiItemSupport.getLayoutId(position, data.get(position)),\n                    position);\n        } else {\n            return get(context, convertView, parent, layoutResId, position);\n        }\n    }\n\n}"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/quickAdapter/extUtimateRVA/MultiItemTypeSupport.java",
    "content": "package com.marshalchen.ultimaterecyclerview.quickAdapter.extUtimateRVA;\n\n/**\n * Created by hesk on 31/7/15.\n */\npublic interface MultiItemTypeSupport<T> {\n    int getLayoutId(int position, T t);\n\n    int getViewTypeCount();\n\n    int getItemViewType(int postion, T t);\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/stickyheadersrecyclerview/HeaderPositionCalculator.java",
    "content": "package com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview;\n\nimport android.graphics.Rect;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.View;\n\nimport com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.caching.HeaderProvider;\nimport com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.calculation.DimensionCalculator;\nimport com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.util.OrientationProvider;\n\n/**\n * Calculates the position and location of header views\n */\npublic class HeaderPositionCalculator {\n\n    private final StickyRecyclerHeadersAdapter mAdapter;\n    private final OrientationProvider mOrientationProvider;\n    private final HeaderProvider mHeaderProvider;\n    private final DimensionCalculator mDimensionCalculator;\n\n    public HeaderPositionCalculator(StickyRecyclerHeadersAdapter adapter, HeaderProvider headerProvider,\n                                    OrientationProvider orientationProvider, DimensionCalculator dimensionCalculator) {\n        mAdapter = adapter;\n        mHeaderProvider = headerProvider;\n        mOrientationProvider = orientationProvider;\n        mDimensionCalculator = dimensionCalculator;\n    }\n\n    /**\n     * Determines if an item in the list should have a header that is different than the item in the\n     * list that immediately precedes it. Items with no headers will always return false.\n     *\n     * @param position of the list item in questions\n     * @return true if this item has a different header than the previous item in the list\n     */\n    public boolean hasNewHeader(int position) {\n        if (indexOutOfBounds(position)) {\n            return false;\n        }\n\n        long headerId = mAdapter.getHeaderId(position);\n\n        if (headerId < 0) {\n            return false;\n        }\n\n        return position == 0 || headerId != mAdapter.getHeaderId(position - 1);\n    }\n\n    private boolean indexOutOfBounds(int position) {\n        return position < 0 || position >= mAdapter.getItemCount();\n    }\n\n    public Rect getHeaderBounds(RecyclerView recyclerView, View header, View firstView, boolean firstHeader) {\n        int orientation = mOrientationProvider.getOrientation(recyclerView);\n        Rect bounds = getDefaultHeaderOffset(recyclerView, header, firstView, orientation);\n\n        if (firstHeader && isStickyHeaderBeingPushedOffscreen(recyclerView, header)) {\n            View viewAfterNextHeader = getFirstViewUnobscuredByHeader(recyclerView, header);\n            int firstViewUnderHeaderPosition = recyclerView.getChildAdapterPosition(viewAfterNextHeader);\n            View secondHeader = mHeaderProvider.getHeader(recyclerView, firstViewUnderHeaderPosition);\n            translateHeaderWithNextHeader(recyclerView, mOrientationProvider.getOrientation(recyclerView), bounds,\n                    header, viewAfterNextHeader, secondHeader);\n        }\n\n        return bounds;\n    }\n\n    private Rect getDefaultHeaderOffset(RecyclerView recyclerView, View header, View firstView, int orientation) {\n        int translationX, translationY;\n        Rect headerMargins = mDimensionCalculator.getMargins(header);\n        if (orientation == LinearLayoutManager.VERTICAL) {\n            translationX = firstView.getLeft() + headerMargins.left;\n            translationY = Math.max(\n                    firstView.getTop() - header.getHeight() - headerMargins.bottom,\n                    getListTop(recyclerView) + headerMargins.top);\n        } else {\n            translationY = firstView.getTop() + headerMargins.top;\n            translationX = Math.max(\n                    firstView.getLeft() - header.getWidth() - headerMargins.right,\n                    getListLeft(recyclerView) + headerMargins.left);\n        }\n\n        return new Rect(translationX, translationY, translationX + header.getWidth(),\n                translationY + header.getHeight());\n    }\n\n    private boolean isStickyHeaderBeingPushedOffscreen(RecyclerView recyclerView, View stickyHeader) {\n        View viewAfterHeader = getFirstViewUnobscuredByHeader(recyclerView, stickyHeader);\n        int firstViewUnderHeaderPosition = recyclerView.getChildAdapterPosition(viewAfterHeader);\n        if (firstViewUnderHeaderPosition == RecyclerView.NO_POSITION) {\n            return false;\n        }\n\n        if (firstViewUnderHeaderPosition > 0 && hasNewHeader(firstViewUnderHeaderPosition)) {\n            View nextHeader = mHeaderProvider.getHeader(recyclerView, firstViewUnderHeaderPosition);\n            Rect nextHeaderMargins = mDimensionCalculator.getMargins(nextHeader);\n            Rect headerMargins = mDimensionCalculator.getMargins(stickyHeader);\n\n            if (mOrientationProvider.getOrientation(recyclerView) == LinearLayoutManager.VERTICAL) {\n                int topOfNextHeader = viewAfterHeader.getTop() - nextHeaderMargins.bottom - nextHeader.getHeight() - nextHeaderMargins.top;\n                int bottomOfThisHeader = recyclerView.getPaddingTop() + stickyHeader.getBottom() + headerMargins.top + headerMargins.bottom;\n                if (topOfNextHeader < bottomOfThisHeader) {\n                    return true;\n                }\n            } else {\n                int leftOfNextHeader = viewAfterHeader.getLeft() - nextHeaderMargins.right - nextHeader.getWidth() - nextHeaderMargins.left;\n                int rightOfThisHeader = recyclerView.getPaddingLeft() + stickyHeader.getRight() + headerMargins.left + headerMargins.right;\n                if (leftOfNextHeader < rightOfThisHeader) {\n                    return true;\n                }\n            }\n        }\n\n        return false;\n    }\n\n    private void translateHeaderWithNextHeader(RecyclerView recyclerView, int orientation, Rect translation,\n                                               View currentHeader, View viewAfterNextHeader, View nextHeader) {\n        Rect nextHeaderMargins = mDimensionCalculator.getMargins(nextHeader);\n        Rect stickyHeaderMargins = mDimensionCalculator.getMargins(currentHeader);\n        if (orientation == LinearLayoutManager.VERTICAL) {\n            int topOfStickyHeader = getListTop(recyclerView) + stickyHeaderMargins.top + stickyHeaderMargins.bottom;\n            int shiftFromNextHeader = viewAfterNextHeader.getTop() - nextHeader.getHeight() - nextHeaderMargins.bottom - nextHeaderMargins.top - currentHeader.getHeight() - topOfStickyHeader;\n            if (shiftFromNextHeader < topOfStickyHeader) {\n                translation.top += shiftFromNextHeader;\n            }\n        } else {\n            int leftOfStickyHeader = getListLeft(recyclerView) + stickyHeaderMargins.left + stickyHeaderMargins.right;\n            int shiftFromNextHeader = viewAfterNextHeader.getLeft() - nextHeader.getWidth() - nextHeaderMargins.right - nextHeaderMargins.left - currentHeader.getWidth() - leftOfStickyHeader;\n            if (shiftFromNextHeader < leftOfStickyHeader) {\n                translation.left += shiftFromNextHeader;\n            }\n        }\n    }\n\n    /**\n     * Returns the first item currently in the RecyclerView that is not obscured by a header.\n     *\n     * @param parent Recyclerview containing all the list items\n     * @return first item that is fully beneath a header\n     */\n    private View getFirstViewUnobscuredByHeader(RecyclerView parent, View firstHeader) {\n        for (int i = 0; i < parent.getChildCount(); i++) {\n            View child = parent.getChildAt(i);\n            if (!itemIsObscuredByHeader(parent, child, firstHeader, mOrientationProvider.getOrientation(parent))) {\n                return child;\n            }\n        }\n        return null;\n    }\n\n    /**\n     * Determines if an item is obscured by a header\n     *\n     * @param parent\n     * @param item        to determine if obscured by header\n     * @param header      that might be obscuring the item\n     * @param orientation of the {@link RecyclerView}\n     * @return true if the item view is obscured by the header view\n     */\n    private boolean itemIsObscuredByHeader(RecyclerView parent, View item, View header, int orientation) {\n        RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) item.getLayoutParams();\n        Rect headerMargins = mDimensionCalculator.getMargins(header);\n\n        int adapterPosition = parent.getChildAdapterPosition(item);\n        if (adapterPosition == RecyclerView.NO_POSITION || mHeaderProvider.getHeader(parent, adapterPosition) != header) {\n            // Resolves https://github.com/timehop/sticky-headers-recyclerview/issues/36\n            // Handles an edge case where a trailing header is smaller than the current sticky header.\n            return false;\n        }\n\n        if (orientation == LinearLayoutManager.VERTICAL) {\n            int itemTop = item.getTop() - layoutParams.topMargin;\n            int headerBottom = header.getBottom() + headerMargins.bottom + headerMargins.top;\n            if (itemTop > headerBottom) {\n                return false;\n            }\n        } else {\n            int itemLeft = item.getLeft() - layoutParams.leftMargin;\n            int headerRight = header.getRight() + headerMargins.right + headerMargins.left;\n            if (itemLeft > headerRight) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    private int getListTop(RecyclerView view) {\n        if (view.getLayoutManager().getClipToPadding()) {\n            return view.getPaddingTop();\n        } else {\n            return 0;\n        }\n    }\n\n    private int getListLeft(RecyclerView view) {\n        if (view.getLayoutManager().getClipToPadding()) {\n            return view.getPaddingLeft();\n        } else {\n            return 0;\n        }\n    }\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/stickyheadersrecyclerview/StickyRecyclerHeadersAdapter.java",
    "content": "package com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview;\n\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.ViewGroup;\n\npublic interface StickyRecyclerHeadersAdapter<VH extends RecyclerView.ViewHolder> {\n    /**\n     * Get the ID of the header associated with this item.  For example, if your headers group\n     * items by their first letter, you could return the character representation of the first letter.\n     * Return a value smaller than 0 if the view should not have a header (like, a header view or footer view)\n     *\n     * @param position na\n     * @return na\n     */\n    long getHeaderId(int position);\n\n    /**\n     * Creates a new ViewHolder for a header.  This works the same way onCreateViewHolder in\n     * Recycler.Adapter, ViewHolders can be reused for different views.  This is usually a good place\n     * to inflate the layout for the header.\n     *\n     * @param parent na\n     * @return na\n     */\n    VH onCreateHeaderViewHolder(ViewGroup parent);\n\n    /**\n     * Binds an existing ViewHolder to the specified adapter position.\n     *\n     * @param holder   na\n     * @param position na\n     */\n    void onBindHeaderViewHolder(VH holder, int position);\n\n    int getItemCount();\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/stickyheadersrecyclerview/StickyRecyclerHeadersDecoration.java",
    "content": "package com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview;\n\nimport android.graphics.Canvas;\nimport android.graphics.Rect;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.util.SparseArray;\nimport android.view.View;\n\nimport com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.caching.HeaderProvider;\nimport com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.caching.HeaderViewCache;\nimport com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.calculation.DimensionCalculator;\nimport com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.rendering.HeaderRenderer;\nimport com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.util.LinearLayoutOrientationProvider;\nimport com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.util.OrientationProvider;\n\npublic class StickyRecyclerHeadersDecoration extends RecyclerView.ItemDecoration {\n\n    private final com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.StickyRecyclerHeadersAdapter mAdapter;\n    private final SparseArray<Rect> mHeaderRects = new SparseArray<>();\n    private final HeaderProvider mHeaderProvider;\n    private final OrientationProvider mOrientationProvider;\n    private final com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.HeaderPositionCalculator mHeaderPositionCalculator;\n    private final HeaderRenderer mRenderer;\n    private final DimensionCalculator mDimensionCalculator;\n\n    // TODO: Consider passing in orientation to simplify orientation accounting within calculation\n    public StickyRecyclerHeadersDecoration(com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.StickyRecyclerHeadersAdapter adapter) {\n        this(adapter, new LinearLayoutOrientationProvider(), new DimensionCalculator());\n    }\n\n    private StickyRecyclerHeadersDecoration(com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.StickyRecyclerHeadersAdapter adapter, OrientationProvider orientationProvider,\n                                            DimensionCalculator dimensionCalculator) {\n        this(adapter, orientationProvider, dimensionCalculator, new HeaderRenderer(orientationProvider),\n                new HeaderViewCache(adapter, orientationProvider));\n    }\n\n    private StickyRecyclerHeadersDecoration(com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.StickyRecyclerHeadersAdapter adapter, OrientationProvider orientationProvider,\n                                            DimensionCalculator dimensionCalculator, HeaderRenderer headerRenderer, HeaderProvider headerProvider) {\n        this(adapter, headerRenderer, orientationProvider, dimensionCalculator, headerProvider,\n                new com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.HeaderPositionCalculator(adapter, headerProvider, orientationProvider,\n                        dimensionCalculator));\n    }\n\n    private StickyRecyclerHeadersDecoration(com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.StickyRecyclerHeadersAdapter adapter, HeaderRenderer headerRenderer,\n                                            OrientationProvider orientationProvider, DimensionCalculator dimensionCalculator, HeaderProvider headerProvider,\n                                            HeaderPositionCalculator headerPositionCalculator) {\n        mAdapter = adapter;\n        mHeaderProvider = headerProvider;\n        mOrientationProvider = orientationProvider;\n        mRenderer = headerRenderer;\n        mDimensionCalculator = dimensionCalculator;\n        mHeaderPositionCalculator = headerPositionCalculator;\n    }\n\n    @Override\n    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {\n        super.getItemOffsets(outRect, view, parent, state);\n        int itemPosition = parent.getChildAdapterPosition(view);\n        if (itemPosition == RecyclerView.NO_POSITION) {\n            return;\n        }\n        if (mHeaderPositionCalculator.hasNewHeader(itemPosition)) {\n            View header = getHeaderView(parent, itemPosition);\n            setItemOffsetsForHeader(outRect, header, mOrientationProvider.getOrientation(parent));\n        }\n    }\n\n    /**\n     * Sets the offsets for the first item in a section to make room for the header view\n     *\n     * @param itemOffsets rectangle to define offsets for the item\n     * @param header      view used to calculate offset for the item\n     * @param orientation used to calculate offset for the item\n     */\n    private void setItemOffsetsForHeader(Rect itemOffsets, View header, int orientation) {\n        Rect headerMargins = mDimensionCalculator.getMargins(header);\n        if (orientation == LinearLayoutManager.VERTICAL) {\n            itemOffsets.top = header.getHeight() + headerMargins.top + headerMargins.bottom;\n        } else {\n            itemOffsets.left = header.getWidth() + headerMargins.left + headerMargins.right;\n        }\n    }\n\n    @Override\n    public void onDrawOver(Canvas canvas, RecyclerView parent, RecyclerView.State state) {\n        super.onDrawOver(canvas, parent, state);\n        mHeaderRects.clear();\n\n        if (parent.getChildCount() <= 0 || mAdapter.getItemCount() <= 0) {\n            return;\n        }\n\n        for (int i = 0; i < parent.getChildCount(); i++) {\n            View itemView = parent.getChildAt(i);\n            int position = parent.getChildAdapterPosition(itemView);\n            if (position == RecyclerView.NO_POSITION) {\n                continue;\n            }\n            if (hasStickyHeader(i, position) || mHeaderPositionCalculator.hasNewHeader(position)) {\n                View header = mHeaderProvider.getHeader(parent, position);\n                Rect headerOffset = mHeaderPositionCalculator.getHeaderBounds(parent, header,\n                        itemView, hasStickyHeader(i, position));\n                mRenderer.drawHeader(parent, canvas, header, headerOffset);\n                mHeaderRects.put(position, headerOffset);\n            }\n        }\n    }\n\n    private boolean hasStickyHeader(int listChildPosition, int indexInList) {\n        if (listChildPosition > 0 || mAdapter.getHeaderId(indexInList) < 0) {\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * Gets the position of the header under the specified (x, y) coordinates.\n     *\n     * @param x x-coordinate\n     * @param y y-coordinate\n     * @return position of header, or -1 if not found\n     */\n    public int findHeaderPositionUnder(int x, int y) {\n        for (int i = 0; i < mHeaderRects.size(); i++) {\n            Rect rect = mHeaderRects.get(mHeaderRects.keyAt(i));\n            if (rect.contains(x, y)) {\n                return mHeaderRects.keyAt(i);\n            }\n        }\n        return -1;\n    }\n\n    /**\n     * Gets the header view for the associated position.  If it doesn't exist yet, it will be\n     * created, measured, and laid out.\n     *\n     * @param parent   na\n     * @param position na\n     * @return Header view      na\n     */\n    public View getHeaderView(RecyclerView parent, int position) {\n        return mHeaderProvider.getHeader(parent, position);\n    }\n\n    /**\n     * Invalidates cached headers.  This does not invalidate the recyclerview, you should do that manually after\n     * calling this method.\n     */\n    public void invalidateHeaders() {\n        mHeaderProvider.invalidate();\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/stickyheadersrecyclerview/StickyRecyclerHeadersTouchListener.java",
    "content": "package com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview;\n\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.GestureDetector;\nimport android.view.MotionEvent;\nimport android.view.SoundEffectConstants;\nimport android.view.View;\n\npublic class StickyRecyclerHeadersTouchListener implements RecyclerView.OnItemTouchListener {\n  private final GestureDetector mTapDetector;\n  private final RecyclerView mRecyclerView;\n  private final com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.StickyRecyclerHeadersDecoration mDecor;\n  private OnHeaderClickListener mOnHeaderClickListener;\n\n  public interface OnHeaderClickListener {\n    public void onHeaderClick(View header, int position, long headerId);\n  }\n\n  public StickyRecyclerHeadersTouchListener(final RecyclerView recyclerView,\n      final com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.StickyRecyclerHeadersDecoration decor) {\n    mTapDetector = new GestureDetector(recyclerView.getContext(), new SingleTapDetector());\n    mRecyclerView = recyclerView;\n    mDecor = decor;\n  }\n\n  public com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.StickyRecyclerHeadersAdapter getAdapter() {\n    if (mRecyclerView.getAdapter() instanceof com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.StickyRecyclerHeadersAdapter) {\n      return (com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.StickyRecyclerHeadersAdapter) mRecyclerView.getAdapter();\n    } else {\n      throw new IllegalStateException(\"A RecyclerView with \" +\n          StickyRecyclerHeadersTouchListener.class.getSimpleName() +\n          \" requires a \" + StickyRecyclerHeadersAdapter.class.getSimpleName());\n    }\n  }\n\n\n  public void setOnHeaderClickListener(OnHeaderClickListener listener) {\n    mOnHeaderClickListener = listener;\n  }\n\n  @Override\n  public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {\n    return mOnHeaderClickListener != null && mTapDetector.onTouchEvent(e);\n  }\n\n  @Override\n  public void onTouchEvent(RecyclerView view, MotionEvent e) { /* do nothing? */ }\n  @Override\n  public void  onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {\n\n  }\n  private class SingleTapDetector extends GestureDetector.SimpleOnGestureListener {\n    @Override\n    public boolean onSingleTapUp(MotionEvent e) {\n      int position = mDecor.findHeaderPositionUnder((int) e.getX(), (int) e.getY());\n      if (position != -1) {\n        View headerView = mDecor.getHeaderView(mRecyclerView, position);\n        long headerId = getAdapter().getHeaderId(position);\n        mOnHeaderClickListener.onHeaderClick(headerView, position, headerId);\n        mRecyclerView.playSoundEffect(SoundEffectConstants.CLICK);\n        headerView.onTouchEvent(e);\n        return true;\n      }\n      return false;\n    }\n\n    @Override\n    public boolean onDoubleTap(MotionEvent e) {\n      return true;\n    }\n  }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/stickyheadersrecyclerview/caching/HeaderProvider.java",
    "content": "package com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.caching;\n\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.View;\n\n/**\n * Implemented by objects that provide header views for decoration\n */\npublic interface HeaderProvider {\n\n  /**\n   * Will provide a header view for a given position in the RecyclerView\n   *\n   * @param recyclerView that will display the header\n   * @param position     that will be headed by the header\n   * @return a header view for the given position and list\n   */\n  public View getHeader(RecyclerView recyclerView, int position);\n\n  /**\n   * TODO: describe this functionality and its necessity\n   */\n  void invalidate();\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/stickyheadersrecyclerview/caching/HeaderViewCache.java",
    "content": "package com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.caching;\n\nimport androidx.collection.LongSparseArray;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.StickyRecyclerHeadersAdapter;\nimport com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.util.OrientationProvider;\n\n/**\n * An implementation of {@link com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.caching.HeaderProvider} that creates and caches header views\n */\npublic class HeaderViewCache implements com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.caching.HeaderProvider {\n\n  private final StickyRecyclerHeadersAdapter mAdapter;\n  private final LongSparseArray<View> mHeaderViews = new LongSparseArray<>();\n  private final OrientationProvider mOrientationProvider;\n\n  public HeaderViewCache(StickyRecyclerHeadersAdapter adapter,\n      OrientationProvider orientationProvider) {\n    mAdapter = adapter;\n    mOrientationProvider = orientationProvider;\n  }\n\n  @Override\n  public View getHeader(RecyclerView parent, int position) {\n    long headerId = mAdapter.getHeaderId(position);\n\n    View header = mHeaderViews.get(headerId);\n    if (header == null) {\n      //TODO - recycle views\n      RecyclerView.ViewHolder viewHolder = mAdapter.onCreateHeaderViewHolder(parent);\n      mAdapter.onBindHeaderViewHolder(viewHolder, position);\n      header = viewHolder.itemView;\n      if (header.getLayoutParams() == null) {\n        header.setLayoutParams(new ViewGroup.LayoutParams(\n            ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));\n      }\n\n      int widthSpec;\n      int heightSpec;\n\n      if (mOrientationProvider.getOrientation(parent) == LinearLayoutManager.VERTICAL) {\n        widthSpec = View.MeasureSpec.makeMeasureSpec(parent.getWidth(), View.MeasureSpec.EXACTLY);\n        heightSpec = View.MeasureSpec.makeMeasureSpec(parent.getHeight(), View.MeasureSpec.UNSPECIFIED);\n      } else {\n        widthSpec = View.MeasureSpec.makeMeasureSpec(parent.getWidth(), View.MeasureSpec.UNSPECIFIED);\n        heightSpec = View.MeasureSpec.makeMeasureSpec(parent.getHeight(), View.MeasureSpec.EXACTLY);\n      }\n\n      int childWidth = ViewGroup.getChildMeasureSpec(widthSpec,\n          parent.getPaddingLeft() + parent.getPaddingRight(), header.getLayoutParams().width);\n      int childHeight = ViewGroup.getChildMeasureSpec(heightSpec,\n          parent.getPaddingTop() + parent.getPaddingBottom(), header.getLayoutParams().height);\n      header.measure(childWidth, childHeight);\n      header.layout(0, 0, header.getMeasuredWidth(), header.getMeasuredHeight());\n      mHeaderViews.put(headerId, header);\n    }\n    return header;\n  }\n\n  @Override\n  public void invalidate() {\n    mHeaderViews.clear();\n  }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/stickyheadersrecyclerview/calculation/DimensionCalculator.java",
    "content": "package com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.calculation;\n\nimport android.graphics.Rect;\nimport android.view.View;\n\nimport static android.view.ViewGroup.LayoutParams;\nimport static android.view.ViewGroup.MarginLayoutParams;\n\n/**\n * Helper to calculate various view dimensions\n */\npublic class DimensionCalculator {\n\n  /**\n   * Returns {@link Rect} representing margins for any view.\n   *\n   * @param view for which to get margins\n   * @return margins for the given view. All 0 if the view does not support margins\n   */\n  public Rect getMargins(View view) {\n    LayoutParams layoutParams = view.getLayoutParams();\n\n    if (layoutParams instanceof MarginLayoutParams) {\n      MarginLayoutParams marginLayoutParams = (MarginLayoutParams) layoutParams;\n      return getMarginRect(marginLayoutParams);\n    } else {\n      return new Rect();\n    }\n  }\n\n  /**\n   * Converts {@link MarginLayoutParams} into a representative {@link Rect}\n   *\n   * @param marginLayoutParams margins to convert to a Rect\n   * @return Rect representing margins, where {@link MarginLayoutParams#leftMargin} is equivalent to\n   * {@link Rect#left}, etc.\n   */\n  private Rect getMarginRect(MarginLayoutParams marginLayoutParams) {\n    return new Rect(\n        marginLayoutParams.leftMargin,\n        marginLayoutParams.topMargin,\n        marginLayoutParams.rightMargin,\n        marginLayoutParams.bottomMargin\n    );\n  }\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/stickyheadersrecyclerview/rendering/HeaderRenderer.java",
    "content": "package com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.rendering;\n\nimport android.graphics.Canvas;\nimport android.graphics.Rect;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.View;\nimport android.widget.LinearLayout;\n\nimport com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.calculation.DimensionCalculator;\nimport com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.util.OrientationProvider;\n\n/**\n * Responsible for drawing headers to the canvas provided by the item decoration\n */\npublic class HeaderRenderer {\n\n  private final DimensionCalculator mDimensionCalculator;\n  private final OrientationProvider mOrientationProvider;\n\n  public HeaderRenderer(OrientationProvider orientationProvider) {\n    this(orientationProvider, new DimensionCalculator());\n  }\n\n  private HeaderRenderer(OrientationProvider orientationProvider,\n      DimensionCalculator dimensionCalculator) {\n    mOrientationProvider = orientationProvider;\n    mDimensionCalculator = dimensionCalculator;\n  }\n\n  /**\n   * Draws a header to a canvas, offsetting by some x and y amount\n   *\n   * @param recyclerView the parent recycler view for drawing the header into\n   * @param canvas       the canvas on which to draw the header\n   * @param header       the view to draw as the header\n   * @param offset       a Rect used to define the x/y offset of the header. Specify x/y offset by setting\n   *                     the {@link Rect#left} and {@link Rect#top} properties, respectively.\n   */\n  public void drawHeader(RecyclerView recyclerView, Canvas canvas, View header, Rect offset) {\n    canvas.save();\n\n    if (recyclerView.getLayoutManager().getClipToPadding()) {\n      // Clip drawing of headers to the padding of the RecyclerView. Avoids drawing in the padding\n      Rect clipRect = getClipRectForHeader(recyclerView, header);\n      canvas.clipRect(clipRect);\n    }\n\n    canvas.translate(offset.left, offset.top);\n\n    header.draw(canvas);\n    canvas.restore();\n  }\n\n  /**\n   * Gets a clipping rect for the header based on the margins of the header and the padding of the\n   * recycler.\n   * FIXME: Currently right margin in VERTICAL orientation and bottom margin in HORIZONTAL\n   * orientation are clipped so they look accurate, but the headers are not being drawn at the\n   * correctly smaller width and height respectively.\n   *\n   * @param recyclerView for which to provide a header\n   * @param header       for clipping\n   * @return a {@link Rect} for clipping a provided header to the padding of a recycler view\n   */\n  private Rect getClipRectForHeader(RecyclerView recyclerView, View header) {\n    Rect headerMargins = mDimensionCalculator.getMargins(header);\n    if (mOrientationProvider.getOrientation(recyclerView) == LinearLayout.VERTICAL) {\n      return new Rect(\n          recyclerView.getPaddingLeft(),\n          recyclerView.getPaddingTop(),\n          recyclerView.getWidth() - recyclerView.getPaddingRight() - headerMargins.right,\n          recyclerView.getHeight() - recyclerView.getPaddingBottom());\n    } else {\n      return new Rect(\n          recyclerView.getPaddingLeft(),\n          recyclerView.getPaddingTop(),\n          recyclerView.getWidth() - recyclerView.getPaddingRight(),\n          recyclerView.getHeight() - recyclerView.getPaddingBottom() - headerMargins.bottom);\n    }\n  }\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/stickyheadersrecyclerview/util/LinearLayoutOrientationProvider.java",
    "content": "package com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.util;\n\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\n\n/**\n * OrientationProvider for ReyclerViews who use a LinearLayoutManager\n */\npublic class LinearLayoutOrientationProvider implements com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.util.OrientationProvider {\n\n  @Override\n  public int getOrientation(RecyclerView recyclerView) {\n    RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();\n\n    if (layoutManager instanceof LinearLayoutManager) {\n      return ((LinearLayoutManager) layoutManager).getOrientation();\n    } else {\n      throw new IllegalStateException(\"StickyListHeadersDecoration can only be used with a \" +\n          \"LinearLayoutManager.\");\n    }\n  }\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/stickyheadersrecyclerview/util/OrientationProvider.java",
    "content": "package com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.util;\n\nimport androidx.recyclerview.widget.RecyclerView;\n\n/**\n * Interface for getting the orientation of a RecyclerView from its LayoutManager\n */\npublic interface OrientationProvider {\n\n  public int getOrientation(RecyclerView recyclerView);\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/swipe/SimpleSwipeListener.java",
    "content": "package com.marshalchen.ultimaterecyclerview.swipe;\n\npublic class SimpleSwipeListener implements SwipeLayout.SwipeListener {\n\n    @Override\n    public void onStartOpen(SwipeLayout layout) {\n    }\n\n    @Override\n    public void onOpen(SwipeLayout layout) {\n    }\n\n    @Override\n    public void onStartClose(SwipeLayout layout) {\n    }\n\n    @Override\n    public void onClose(SwipeLayout layout) {\n    }\n\n    @Override\n    public void onUpdate(SwipeLayout layout, int leftOffset, int topOffset) {\n    }\n\n    @Override\n    public void onHandRelease(SwipeLayout layout, float xvel, float yvel) {\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/swipe/SwipeItemManagerImpl.java",
    "content": "package com.marshalchen.ultimaterecyclerview.swipe;\n\n\nimport androidx.recyclerview.widget.RecyclerView;\n\n\nimport com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * SwipeItemMangerImpl is a helper class to help maintain swipe status\n */\npublic class SwipeItemManagerImpl implements SwipeItemManagerInterface {\n    public final int INVALID_POSITION = -1;\n\n    private Mode mode = Mode.Single;\n\n    protected int mOpenPosition = INVALID_POSITION;\n\n    protected Set<Integer> mOpenPositions = new HashSet<>();\n    protected Set<SwipeLayout> mShownLayouts = new HashSet<>();\n\n    protected RecyclerView.Adapter mAdapter;\n\n    public SwipeItemManagerImpl(RecyclerView.Adapter adapter) {\n        if (adapter == null)\n            throw new IllegalArgumentException(\"Adapter can not be null\");\n\n        if (!(adapter instanceof SwipeItemManagerInterface))\n            throw new IllegalArgumentException(\"adapter should implement the SwipeAdapterInterface\");\n\n        this.mAdapter = adapter;\n    }\n\n    public Mode getMode() {\n        return mode;\n    }\n\n    public void setMode(Mode mode) {\n        this.mode = mode;\n        mOpenPositions.clear();\n        mShownLayouts.clear();\n        mOpenPosition = INVALID_POSITION;\n    }\n\n\n    private void initialize(UltimateRecyclerviewViewHolder targetViewHolder, int position) {\n        targetViewHolder.onLayoutListener = new OnLayoutListener(position);\n        targetViewHolder.swipeMemory = new SwipeMemory(position);\n        targetViewHolder.position = position;\n\n        targetViewHolder.swipeLayout.addSwipeListener(targetViewHolder.swipeMemory);\n        targetViewHolder.swipeLayout.addOnLayoutListener(targetViewHolder.onLayoutListener);\n    }\n\n\n    public void updateConvertView(UltimateRecyclerviewViewHolder targetViewHolder, int position) {\n        if (targetViewHolder.onLayoutListener == null) {\n            initialize(targetViewHolder, position);\n        }\n\n        SwipeLayout swipeLayout = targetViewHolder.swipeLayout;\n        if (swipeLayout == null)\n            throw new IllegalStateException(\"can not find SwipeLayout in target view\");\n\n        mShownLayouts.add(swipeLayout);\n\n        ((SwipeMemory) targetViewHolder.swipeMemory).setPosition(position);\n        ((OnLayoutListener) targetViewHolder.onLayoutListener).setPosition(position);\n        targetViewHolder.position = position;\n    }\n\n    @Override\n    public void openItem(int position) {\n        if (mode == Mode.Multiple) {\n            if (!mOpenPositions.contains(position))\n                mOpenPositions.add(position);\n        } else {\n            mOpenPosition = position;\n        }\n    }\n\n    @Override\n    public void closeItem(int position) {\n        if (mode == Mode.Multiple) {\n            mOpenPositions.remove(position);\n        } else {\n            if (mOpenPosition == position)\n                mOpenPosition = INVALID_POSITION;\n        }\n    }\n\n    @Override\n    public void closeAllExcept(SwipeLayout layout) {\n        for (SwipeLayout s : mShownLayouts) {\n            if (s != layout)\n                s.close();\n        }\n    }\n\n    @Override\n    public void removeShownLayouts(SwipeLayout layout) {\n        mShownLayouts.remove(layout);\n    }\n\n    @Override\n    public List<Integer> getOpenItems() {\n        if (mode == SwipeItemManagerInterface.Mode.Multiple) {\n            return new ArrayList<>(mOpenPositions);\n        } else {\n            return Arrays.asList(mOpenPosition);\n        }\n    }\n\n    @Override\n    public List<SwipeLayout> getOpenLayouts() {\n        return new ArrayList<>(mShownLayouts);\n    }\n\n    @Override\n    public boolean isOpen(int position) {\n        if (mode == Mode.Multiple) {\n            return mOpenPositions.contains(position);\n        } else {\n            return mOpenPosition == position;\n        }\n    }\n\n    private class OnLayoutListener implements SwipeLayout.OnLayout {\n\n        private int position;\n\n        OnLayoutListener(int position) {\n            this.position = position;\n        }\n\n        public void setPosition(int position) {\n            this.position = position;\n        }\n\n        @Override\n        public void onLayout(SwipeLayout v) {\n            if (isOpen(position)) {\n                v.open(false, false);\n            } else {\n                v.close(false, false);\n            }\n        }\n\n    }\n\n    private class SwipeMemory extends SimpleSwipeListener {\n\n        private int position;\n\n        SwipeMemory(int position) {\n            this.position = position;\n        }\n\n        @Override\n        public void onClose(SwipeLayout layout) {\n            if (mode == Mode.Multiple) {\n                mOpenPositions.remove(position);\n            } else {\n                mOpenPosition = INVALID_POSITION;\n            }\n        }\n\n        @Override\n        public void onStartOpen(SwipeLayout layout) {\n            if (mode == Mode.Single) {\n                closeAllExcept(layout);\n            }\n        }\n\n        @Override\n        public void onOpen(SwipeLayout layout) {\n            if (mode == SwipeItemManagerInterface.Mode.Multiple)\n                mOpenPositions.add(position);\n            else {\n                closeAllExcept(layout);\n                mOpenPosition = position;\n            }\n        }\n\n        public void setPosition(int position) {\n            this.position = position;\n        }\n    }\n\n}\n\n\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/swipe/SwipeItemManagerInterface.java",
    "content": "package com.marshalchen.ultimaterecyclerview.swipe;\n\n\nimport java.util.List;\n\npublic interface SwipeItemManagerInterface {\n\n    void openItem(int position);\n\n    void closeItem(int position);\n\n    void closeAllExcept(SwipeLayout layout);\n\n    List<Integer> getOpenItems();\n\n    List<SwipeLayout> getOpenLayouts();\n\n    void removeShownLayouts(SwipeLayout layout);\n\n    boolean isOpen(int position);\n\n    Mode getMode();\n\n    void setMode(Mode mode);\n\n\n    enum Mode {\n        Single, Multiple\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/swipe/SwipeLayout.java",
    "content": "package com.marshalchen.ultimaterecyclerview.swipe;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.Rect;\nimport androidx.annotation.Nullable;\nimport androidx.core.view.GravityCompat;\nimport androidx.core.view.ViewCompat;\nimport androidx.customview.widget.ViewDragHelper;\nimport android.util.AttributeSet;\nimport android.view.GestureDetector;\nimport android.view.Gravity;\nimport android.view.HapticFeedbackConstants;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewConfiguration;\nimport android.view.ViewGroup;\nimport android.view.ViewParent;\nimport android.widget.AbsListView;\nimport android.widget.AdapterView;\nimport android.widget.FrameLayout;\n\nimport com.marshalchen.ultimaterecyclerview.R;\n\nimport java.lang.reflect.Method;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.LinkedHashMap;\nimport java.util.List;\nimport java.util.Map;\n\npublic class SwipeLayout extends FrameLayout {\n    @Deprecated\n    public static final int EMPTY_LAYOUT = -1;\n    private static final int DRAG_LEFT = 1;\n    private static final int DRAG_RIGHT = 2;\n    private static final int DRAG_TOP = 4;\n    private static final int DRAG_BOTTOM = 8;\n    private static final DragEdge DefaultDragEdge = DragEdge.Right;\n\n    private int mTouchSlop;\n\n    private DragEdge mCurrentDragEdge = DefaultDragEdge;\n    private ViewDragHelper mDragHelper;\n\n    private int mDragDistance = 0;\n    private LinkedHashMap<DragEdge, View> mDragEdges = new LinkedHashMap<>();\n    private ShowMode mShowMode;\n\n    private float[] mEdgeSwipesOffset = new float[4];\n\n    private List<SwipeListener> mSwipeListeners = new ArrayList<>();\n    private List<SwipeDenier> mSwipeDeniers = new ArrayList<>();\n    private Map<View, ArrayList<OnRevealListener>> mRevealListeners = new HashMap<>();\n    private Map<View, Boolean> mShowEntirely = new HashMap<>();\n\n    private DoubleClickListener mDoubleClickListener;\n\n    private boolean mSwipeEnabled = true;\n    private boolean[] mSwipesEnabled = new boolean[]{true, true, true, true};\n    private boolean mClickToClose = false;\n\n    public enum DragEdge {\n        Left,\n        Top,\n        Right,\n        Bottom\n    }\n\n    public enum ShowMode {\n        LayDown,\n        PullOut\n    }\n\n    public SwipeLayout(Context context) {\n        this(context, null);\n    }\n\n    public SwipeLayout(Context context, AttributeSet attrs) {\n        this(context, attrs, 0);\n    }\n\n    public SwipeLayout(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n        mDragHelper = ViewDragHelper.create(this, mDragHelperCallback);\n        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();\n\n        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SwipeLayout);\n        int dragEdgeChoices = a.getInt(R.styleable.SwipeLayout_drag_edge, DRAG_RIGHT);\n        mEdgeSwipesOffset[DragEdge.Left.ordinal()] = a.getDimension(R.styleable.SwipeLayout_leftEdgeSwipeOffset, 0);\n        mEdgeSwipesOffset[DragEdge.Right.ordinal()] = a.getDimension(R.styleable.SwipeLayout_rightEdgeSwipeOffset, 0);\n        mEdgeSwipesOffset[DragEdge.Top.ordinal()] = a.getDimension(R.styleable.SwipeLayout_topEdgeSwipeOffset, 0);\n        mEdgeSwipesOffset[DragEdge.Bottom.ordinal()] = a.getDimension(R.styleable.SwipeLayout_bottomEdgeSwipeOffset, 0);\n        setClickToClose(a.getBoolean(R.styleable.SwipeLayout_clickToClose, mClickToClose));\n\n        if ((dragEdgeChoices & DRAG_LEFT) == DRAG_LEFT) {\n            mDragEdges.put(DragEdge.Left, null);\n        }\n        if ((dragEdgeChoices & DRAG_TOP) == DRAG_TOP) {\n            mDragEdges.put(DragEdge.Top, null);\n        }\n        if ((dragEdgeChoices & DRAG_RIGHT) == DRAG_RIGHT) {\n            mDragEdges.put(DragEdge.Right, null);\n        }\n        if ((dragEdgeChoices & DRAG_BOTTOM) == DRAG_BOTTOM) {\n            mDragEdges.put(DragEdge.Bottom, null);\n        }\n        int ordinal = a.getInt(R.styleable.SwipeLayout_show_mode, ShowMode.PullOut.ordinal());\n        mShowMode = ShowMode.values()[ordinal];\n        a.recycle();\n\n    }\n\n    public interface SwipeListener {\n        void onStartOpen(SwipeLayout layout);\n\n        void onOpen(SwipeLayout layout);\n\n        void onStartClose(SwipeLayout layout);\n\n        void onClose(SwipeLayout layout);\n\n        void onUpdate(SwipeLayout layout, int leftOffset, int topOffset);\n\n        void onHandRelease(SwipeLayout layout, float xvel, float yvel);\n    }\n\n    public void addSwipeListener(SwipeListener l) {\n        mSwipeListeners.add(l);\n    }\n\n    public void removeSwipeListener(SwipeListener l) {\n        mSwipeListeners.remove(l);\n    }\n\n    public void removeAllSwipeListener() {\n        mSwipeListeners.clear();\n    }\n\n    public interface SwipeDenier {\n        /*\n         * Called in onInterceptTouchEvent Determines if this swipe event should\n         * be denied Implement this interface if you are using views with swipe\n         * gestures As a child of SwipeLayout\n         * \n         * @return true deny false allow\n         */\n        boolean shouldDenySwipe(MotionEvent ev);\n    }\n\n    public void addSwipeDenier(SwipeDenier denier) {\n        mSwipeDeniers.add(denier);\n    }\n\n    public void removeSwipeDenier(SwipeDenier denier) {\n        mSwipeDeniers.remove(denier);\n    }\n\n    public void removeAllSwipeDeniers() {\n        mSwipeDeniers.clear();\n    }\n\n    public interface OnRevealListener {\n        void onReveal(View child, DragEdge edge, float fraction, int distance);\n    }\n\n    /**\n     * bind a view with a specific\n     * {@link com.marshalchen.ultimaterecyclerview.swipe.SwipeLayout.OnRevealListener}\n     *\n     * @param childId the view id.\n     * @param l       the target\n     *                {@link com.marshalchen.ultimaterecyclerview.swipe.SwipeLayout.OnRevealListener}\n     */\n    public void addRevealListener(int childId, OnRevealListener l) {\n        View child = findViewById(childId);\n        if (child == null) {\n            throw new IllegalArgumentException(\"Child does not belong to SwipeListener.\");\n        }\n\n        if (!mShowEntirely.containsKey(child)) {\n            mShowEntirely.put(child, false);\n        }\n        if (mRevealListeners.get(child) == null)\n            mRevealListeners.put(child, new ArrayList<OnRevealListener>());\n\n        mRevealListeners.get(child).add(l);\n    }\n\n    /**\n     * bind multiple views with an\n     * {@link com.marshalchen.ultimaterecyclerview.swipe.SwipeLayout.OnRevealListener}.\n     *\n     * @param childIds the view id.\n     * @param l        the {@link com.marshalchen.ultimaterecyclerview.swipe.SwipeLayout.OnRevealListener}\n     */\n    public void addRevealListener(int[] childIds, OnRevealListener l) {\n        for (int i : childIds)\n            addRevealListener(i, l);\n    }\n\n    public void removeRevealListener(int childId, OnRevealListener l) {\n        View child = findViewById(childId);\n\n        if (child == null) return;\n\n        mShowEntirely.remove(child);\n        if (mRevealListeners.containsKey(child)) mRevealListeners.get(child).remove(l);\n    }\n\n    public void removeAllRevealListeners(int childId) {\n        View child = findViewById(childId);\n        if (child != null) {\n            mRevealListeners.remove(child);\n            mShowEntirely.remove(child);\n        }\n    }\n\n    private ViewDragHelper.Callback mDragHelperCallback = new ViewDragHelper.Callback() {\n\n        @Override\n        public int clampViewPositionHorizontal(View child, int left, int dx) {\n            if (child == getSurfaceView()) {\n                switch (mCurrentDragEdge) {\n                    case Top:\n                    case Bottom:\n                        return getPaddingLeft();\n                    case Left:\n                        if (left < getPaddingLeft()) return getPaddingLeft();\n                        if (left > getPaddingLeft() + mDragDistance)\n                            return getPaddingLeft() + mDragDistance;\n                        break;\n                    case Right:\n                        if (left > getPaddingLeft()) return getPaddingLeft();\n                        if (left < getPaddingLeft() - mDragDistance)\n                            return getPaddingLeft() - mDragDistance;\n                        break;\n                }\n            } else if (getCurrentBottomView() == child) {\n\n                switch (mCurrentDragEdge) {\n                    case Top:\n                    case Bottom:\n                        return getPaddingLeft();\n                    case Left:\n                        if (mShowMode == ShowMode.PullOut) {\n                            if (left > getPaddingLeft()) return getPaddingLeft();\n                        }\n                        break;\n                    case Right:\n                        if (mShowMode == ShowMode.PullOut) {\n                            if (left < getMeasuredWidth() - mDragDistance) {\n                                return getMeasuredWidth() - mDragDistance;\n                            }\n                        }\n                        break;\n                }\n            }\n            return left;\n        }\n\n        @Override\n        public int clampViewPositionVertical(View child, int top, int dy) {\n            if (child == getSurfaceView()) {\n                switch (mCurrentDragEdge) {\n                    case Left:\n                    case Right:\n                        return getPaddingTop();\n                    case Top:\n                        if (top < getPaddingTop()) return getPaddingTop();\n                        if (top > getPaddingTop() + mDragDistance)\n                            return getPaddingTop() + mDragDistance;\n                        break;\n                    case Bottom:\n                        if (top < getPaddingTop() - mDragDistance) {\n                            return getPaddingTop() - mDragDistance;\n                        }\n                        if (top > getPaddingTop()) {\n                            return getPaddingTop();\n                        }\n                }\n            } else {\n                View surfaceView = getSurfaceView();\n                int surfaceViewTop = surfaceView == null ? 0 : surfaceView.getTop();\n                switch (mCurrentDragEdge) {\n                    case Left:\n                    case Right:\n                        return getPaddingTop();\n                    case Top:\n                        if (mShowMode == ShowMode.PullOut) {\n                            if (top > getPaddingTop()) return getPaddingTop();\n                        } else {\n                            if (surfaceViewTop + dy < getPaddingTop())\n                                return getPaddingTop();\n                            if (surfaceViewTop + dy > getPaddingTop() + mDragDistance)\n                                return getPaddingTop() + mDragDistance;\n                        }\n                        break;\n                    case Bottom:\n                        if (mShowMode == ShowMode.PullOut) {\n                            if (top < getMeasuredHeight() - mDragDistance)\n                                return getMeasuredHeight() - mDragDistance;\n                        } else {\n                            if (surfaceViewTop + dy >= getPaddingTop())\n                                return getPaddingTop();\n                            if (surfaceViewTop + dy <= getPaddingTop() - mDragDistance)\n                                return getPaddingTop() - mDragDistance;\n                        }\n                }\n            }\n            return top;\n        }\n\n        @Override\n        public boolean tryCaptureView(View child, int pointerId) {\n            boolean result = child == getSurfaceView() || getBottomViews().contains(child);\n            if (result) {\n                isCloseBeforeDrag = getOpenStatus() == Status.Close;\n            }\n            return result;\n        }\n\n        @Override\n        public int getViewHorizontalDragRange(View child) {\n            return mDragDistance;\n        }\n\n        @Override\n        public int getViewVerticalDragRange(View child) {\n            return mDragDistance;\n        }\n\n        boolean isCloseBeforeDrag = true;\n\n        @Override\n        public void onViewReleased(View releasedChild, float xvel, float yvel) {\n            super.onViewReleased(releasedChild, xvel, yvel);\n            processHandRelease(xvel, yvel, isCloseBeforeDrag);\n            for (SwipeListener l : mSwipeListeners) {\n                l.onHandRelease(SwipeLayout.this, xvel, yvel);\n            }\n\n            invalidate();\n        }\n\n        @Override\n        public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {\n            View surfaceView = getSurfaceView();\n            if (surfaceView == null) return;\n            View currentBottomView = getCurrentBottomView();\n            int evLeft = surfaceView.getLeft(),\n                    evRight = surfaceView.getRight(),\n                    evTop = surfaceView.getTop(),\n                    evBottom = surfaceView.getBottom();\n            if (changedView == surfaceView) {\n\n                if (mShowMode == ShowMode.PullOut && currentBottomView != null) {\n                    if (mCurrentDragEdge == DragEdge.Left || mCurrentDragEdge == DragEdge.Right) {\n                        currentBottomView.offsetLeftAndRight(dx);\n                    } else {\n                        currentBottomView.offsetTopAndBottom(dy);\n                    }\n                }\n\n            } else if (getBottomViews().contains(changedView)) {\n\n                if (mShowMode == ShowMode.PullOut) {\n                    surfaceView.offsetLeftAndRight(dx);\n                    surfaceView.offsetTopAndBottom(dy);\n                } else {\n                    Rect rect = computeBottomLayDown(mCurrentDragEdge);\n                    if (currentBottomView != null) {\n                        currentBottomView.layout(rect.left, rect.top, rect.right, rect.bottom);\n                    }\n\n                    int newLeft = surfaceView.getLeft() + dx, newTop = surfaceView.getTop() + dy;\n\n                    if (mCurrentDragEdge == DragEdge.Left && newLeft < getPaddingLeft())\n                        newLeft = getPaddingLeft();\n                    else if (mCurrentDragEdge == DragEdge.Right && newLeft > getPaddingLeft())\n                        newLeft = getPaddingLeft();\n                    else if (mCurrentDragEdge == DragEdge.Top && newTop < getPaddingTop())\n                        newTop = getPaddingTop();\n                    else if (mCurrentDragEdge == DragEdge.Bottom && newTop > getPaddingTop())\n                        newTop = getPaddingTop();\n\n                    surfaceView.layout(newLeft, newTop, newLeft + getMeasuredWidth(), newTop + getMeasuredHeight());\n                }\n            }\n\n            dispatchRevealEvent(evLeft, evTop, evRight, evBottom);\n\n            dispatchSwipeEvent(evLeft, evTop, dx, dy);\n\n            invalidate();\n        }\n    };\n\n    /**\n     * the dispatchRevealEvent method may not always get accurate position, it\n     * makes the view may not always get the event when the view is totally\n     * show( fraction = 1), so , we need to calculate every time.\n     *\n     * @param child            na\n     * @param relativePosition na\n     * @param edge             na\n     * @param surfaceLeft      na\n     * @param surfaceTop       na\n     * @param surfaceRight     na\n     * @param surfaceBottom    na\n     * @return na\n     */\n    protected boolean isViewTotallyFirstShowed(View child, Rect relativePosition, DragEdge edge, int surfaceLeft,\n                                               int surfaceTop, int surfaceRight, int surfaceBottom) {\n        if (mShowEntirely.get(child)) return false;\n        int childLeft = relativePosition.left;\n        int childRight = relativePosition.right;\n        int childTop = relativePosition.top;\n        int childBottom = relativePosition.bottom;\n        boolean r = false;\n        if (getShowMode() == ShowMode.LayDown) {\n            if ((edge == DragEdge.Right && surfaceRight <= childLeft)\n                    || (edge == DragEdge.Left && surfaceLeft >= childRight)\n                    || (edge == DragEdge.Top && surfaceTop >= childBottom)\n                    || (edge == DragEdge.Bottom && surfaceBottom <= childTop)) r = true;\n        } else if (getShowMode() == ShowMode.PullOut) {\n            if ((edge == DragEdge.Right && childRight <= getWidth())\n                    || (edge == DragEdge.Left && childLeft >= getPaddingLeft())\n                    || (edge == DragEdge.Top && childTop >= getPaddingTop())\n                    || (edge == DragEdge.Bottom && childBottom <= getHeight())) r = true;\n        }\n        return r;\n    }\n\n    protected boolean isViewShowing(View child, Rect relativePosition, DragEdge availableEdge, int surfaceLeft,\n                                    int surfaceTop, int surfaceRight, int surfaceBottom) {\n        int childLeft = relativePosition.left;\n        int childRight = relativePosition.right;\n        int childTop = relativePosition.top;\n        int childBottom = relativePosition.bottom;\n        if (getShowMode() == ShowMode.LayDown) {\n            switch (availableEdge) {\n                case Right:\n                    if (surfaceRight > childLeft && surfaceRight <= childRight) {\n                        return true;\n                    }\n                    break;\n                case Left:\n                    if (surfaceLeft < childRight && surfaceLeft >= childLeft) {\n                        return true;\n                    }\n                    break;\n                case Top:\n                    if (surfaceTop >= childTop && surfaceTop < childBottom) {\n                        return true;\n                    }\n                    break;\n                case Bottom:\n                    if (surfaceBottom > childTop && surfaceBottom <= childBottom) {\n                        return true;\n                    }\n                    break;\n            }\n        } else if (getShowMode() == ShowMode.PullOut) {\n            switch (availableEdge) {\n                case Right:\n                    if (childLeft <= getWidth() && childRight > getWidth()) return true;\n                    break;\n                case Left:\n                    if (childRight >= getPaddingLeft() && childLeft < getPaddingLeft()) return true;\n                    break;\n                case Top:\n                    if (childTop < getPaddingTop() && childBottom >= getPaddingTop()) return true;\n                    break;\n                case Bottom:\n                    if (childTop < getHeight() && childTop >= getPaddingTop()) return true;\n                    break;\n            }\n        }\n        return false;\n    }\n\n    protected Rect getRelativePosition(View child) {\n        View t = child;\n        Rect r = new Rect(t.getLeft(), t.getTop(), 0, 0);\n        while (t.getParent() != null && t != getRootView()) {\n            t = (View) t.getParent();\n            if (t == this) break;\n            r.left += t.getLeft();\n            r.top += t.getTop();\n        }\n        r.right = r.left + child.getMeasuredWidth();\n        r.bottom = r.top + child.getMeasuredHeight();\n        return r;\n    }\n\n    private int mEventCounter = 0;\n\n    protected void dispatchSwipeEvent(int surfaceLeft, int surfaceTop, int dx, int dy) {\n        DragEdge edge = getDragEdge();\n        boolean open = true;\n        if (edge == DragEdge.Left) {\n            if (dx < 0) open = false;\n        } else if (edge == DragEdge.Right) {\n            if (dx > 0) open = false;\n        } else if (edge == DragEdge.Top) {\n            if (dy < 0) open = false;\n        } else if (edge == DragEdge.Bottom) {\n            if (dy > 0) open = false;\n        }\n\n        dispatchSwipeEvent(surfaceLeft, surfaceTop, open);\n    }\n\n    protected void dispatchSwipeEvent(int surfaceLeft, int surfaceTop, boolean open) {\n        safeBottomView();\n        Status status = getOpenStatus();\n\n        if (!mSwipeListeners.isEmpty()) {\n            mEventCounter++;\n            for (SwipeListener l : mSwipeListeners) {\n                if (mEventCounter == 1) {\n                    if (open) {\n                        l.onStartOpen(this);\n                    } else {\n                        l.onStartClose(this);\n                    }\n                }\n                l.onUpdate(SwipeLayout.this, surfaceLeft - getPaddingLeft(), surfaceTop - getPaddingTop());\n            }\n\n            if (status == Status.Close) {\n                for (SwipeListener l : mSwipeListeners) {\n                    l.onClose(SwipeLayout.this);\n                }\n                mEventCounter = 0;\n            }\n\n            if (status == Status.Open) {\n                View currentBottomView = getCurrentBottomView();\n                if (currentBottomView != null) {\n                    currentBottomView.setEnabled(true);\n                }\n                for (SwipeListener l : mSwipeListeners) {\n                    l.onOpen(SwipeLayout.this);\n                }\n                mEventCounter = 0;\n            }\n        }\n    }\n\n    /**\n     * prevent bottom view get any touch event. Especially in LayDown mode.\n     */\n    private void safeBottomView() {\n        Status status = getOpenStatus();\n        List<View> bottoms = getBottomViews();\n\n        if (status == Status.Close) {\n            for (View bottom : bottoms) {\n                if (bottom != null && bottom.getVisibility() != INVISIBLE) {\n                    bottom.setVisibility(INVISIBLE);\n                }\n            }\n        } else {\n            View currentBottomView = getCurrentBottomView();\n            if (currentBottomView != null && currentBottomView.getVisibility() != VISIBLE) {\n                currentBottomView.setVisibility(VISIBLE);\n            }\n        }\n    }\n\n    protected void dispatchRevealEvent(final int surfaceLeft, final int surfaceTop, final int surfaceRight,\n                                       final int surfaceBottom) {\n        if (mRevealListeners.isEmpty()) return;\n        for (Map.Entry<View, ArrayList<OnRevealListener>> entry : mRevealListeners.entrySet()) {\n            View child = entry.getKey();\n            Rect rect = getRelativePosition(child);\n            if (isViewShowing(child, rect, mCurrentDragEdge, surfaceLeft, surfaceTop,\n                    surfaceRight, surfaceBottom)) {\n                mShowEntirely.put(child, false);\n                int distance = 0;\n                float fraction = 0f;\n                if (getShowMode() == ShowMode.LayDown) {\n                    switch (mCurrentDragEdge) {\n                        case Left:\n                            distance = rect.left - surfaceLeft;\n                            fraction = distance / (float) child.getWidth();\n                            break;\n                        case Right:\n                            distance = rect.right - surfaceRight;\n                            fraction = distance / (float) child.getWidth();\n                            break;\n                        case Top:\n                            distance = rect.top - surfaceTop;\n                            fraction = distance / (float) child.getHeight();\n                            break;\n                        case Bottom:\n                            distance = rect.bottom - surfaceBottom;\n                            fraction = distance / (float) child.getHeight();\n                            break;\n                    }\n                } else if (getShowMode() == ShowMode.PullOut) {\n                    switch (mCurrentDragEdge) {\n                        case Left:\n                            distance = rect.right - getPaddingLeft();\n                            fraction = distance / (float) child.getWidth();\n                            break;\n                        case Right:\n                            distance = rect.left - getWidth();\n                            fraction = distance / (float) child.getWidth();\n                            break;\n                        case Top:\n                            distance = rect.bottom - getPaddingTop();\n                            fraction = distance / (float) child.getHeight();\n                            break;\n                        case Bottom:\n                            distance = rect.top - getHeight();\n                            fraction = distance / (float) child.getHeight();\n                            break;\n                    }\n                }\n\n                for (OnRevealListener l : entry.getValue()) {\n                    l.onReveal(child, mCurrentDragEdge, Math.abs(fraction), distance);\n                    if (Math.abs(fraction) == 1) {\n                        mShowEntirely.put(child, true);\n                    }\n                }\n            }\n\n            if (isViewTotallyFirstShowed(child, rect, mCurrentDragEdge, surfaceLeft, surfaceTop,\n                    surfaceRight, surfaceBottom)) {\n                mShowEntirely.put(child, true);\n                for (OnRevealListener l : entry.getValue()) {\n                    if (mCurrentDragEdge == DragEdge.Left\n                            || mCurrentDragEdge == DragEdge.Right)\n                        l.onReveal(child, mCurrentDragEdge, 1, child.getWidth());\n                    else\n                        l.onReveal(child, mCurrentDragEdge, 1, child.getHeight());\n                }\n            }\n\n        }\n    }\n\n    @Override\n    public void computeScroll() {\n        super.computeScroll();\n        if (mDragHelper.continueSettling(true)) {\n            ViewCompat.postInvalidateOnAnimation(this);\n        }\n    }\n\n    /**\n     * {@link OnLayoutChangeListener} added in API 11. I need\n     * to support it from API 8.\n     */\n    public interface OnLayout {\n        void onLayout(SwipeLayout v);\n    }\n\n    private List<OnLayout> mOnLayoutListeners;\n\n    public void addOnLayoutListener(OnLayout l) {\n        if (mOnLayoutListeners == null) mOnLayoutListeners = new ArrayList<OnLayout>();\n        mOnLayoutListeners.add(l);\n    }\n\n    public void removeOnLayoutListener(OnLayout l) {\n        if (mOnLayoutListeners != null) mOnLayoutListeners.remove(l);\n    }\n\n    public void clearDragEdge() {\n        mDragEdges.clear();\n    }\n\n    public void setDrag(DragEdge dragEdge, int childId) {\n        clearDragEdge();\n        addDrag(dragEdge, childId);\n    }\n\n    public void setDrag(DragEdge dragEdge, View child) {\n        clearDragEdge();\n        addDrag(dragEdge, child);\n    }\n\n    public void addDrag(DragEdge dragEdge, int childId) {\n        addDrag(dragEdge, findViewById(childId), null);\n    }\n\n    public void addDrag(DragEdge dragEdge, View child) {\n        addDrag(dragEdge, child, null);\n    }\n\n    public void addDrag(DragEdge dragEdge, View child, ViewGroup.LayoutParams params) {\n        if (child == null) return;\n\n        if (params == null) {\n            params = generateDefaultLayoutParams();\n        }\n        if (!checkLayoutParams(params)) {\n            params = generateLayoutParams(params);\n        }\n        int gravity = -1;\n        switch (dragEdge) {\n            case Left:\n                gravity = Gravity.LEFT;\n                break;\n            case Right:\n                gravity = Gravity.RIGHT;\n                break;\n            case Top:\n                gravity = Gravity.TOP;\n                break;\n            case Bottom:\n                gravity = Gravity.BOTTOM;\n                break;\n        }\n        if (params instanceof LayoutParams) {\n            ((LayoutParams) params).gravity = gravity;\n        }\n        addView(child, 0, params);\n    }\n\n    @Override\n    public void addView(View child, int index, ViewGroup.LayoutParams params) {\n        if (child == null) return;\n        int gravity = Gravity.NO_GRAVITY;\n        try {\n            gravity = (Integer) params.getClass().getField(\"gravity\").get(params);\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n\n        if (gravity > 0) {\n            gravity = GravityCompat.getAbsoluteGravity(gravity, ViewCompat.getLayoutDirection(this));\n\n            if ((gravity & Gravity.LEFT) == Gravity.LEFT) {\n                mDragEdges.put(DragEdge.Left, child);\n            }\n            if ((gravity & Gravity.RIGHT) == Gravity.RIGHT) {\n                mDragEdges.put(DragEdge.Right, child);\n            }\n            if ((gravity & Gravity.TOP) == Gravity.TOP) {\n                mDragEdges.put(DragEdge.Top, child);\n            }\n            if ((gravity & Gravity.BOTTOM) == Gravity.BOTTOM) {\n                mDragEdges.put(DragEdge.Bottom, child);\n            }\n        } else {\n            for (Map.Entry<DragEdge, View> entry : mDragEdges.entrySet()) {\n                if (entry.getValue() == null) {\n                    //means used the drag_edge attr, the no gravity child should be use set\n                    mDragEdges.put(entry.getKey(), child);\n                    break;\n                }\n            }\n        }\n        if (child.getParent() == this) {\n            return;\n        }\n        super.addView(child, index, params);\n    }\n\n    @Override\n    protected void onLayout(boolean changed, int l, int t, int r, int b) {\n        updateBottomViews();\n\n        if (mOnLayoutListeners != null) for (int i = 0; i < mOnLayoutListeners.size(); i++) {\n            mOnLayoutListeners.get(i).onLayout(this);\n        }\n    }\n\n    void layoutPullOut() {\n        Rect rect = computeSurfaceLayoutArea(false);\n        View surfaceView = getSurfaceView();\n        if (surfaceView != null) {\n            surfaceView.layout(rect.left, rect.top, rect.right, rect.bottom);\n            bringChildToFront(surfaceView);\n        }\n        rect = computeBottomLayoutAreaViaSurface(ShowMode.PullOut, rect);\n        View currentBottomView = getCurrentBottomView();\n        if (currentBottomView != null) {\n            currentBottomView.layout(rect.left, rect.top, rect.right, rect.bottom);\n        }\n    }\n\n    void layoutLayDown() {\n        Rect rect = computeSurfaceLayoutArea(false);\n        View surfaceView = getSurfaceView();\n        if (surfaceView != null) {\n            surfaceView.layout(rect.left, rect.top, rect.right, rect.bottom);\n            bringChildToFront(surfaceView);\n        }\n        rect = computeBottomLayoutAreaViaSurface(ShowMode.LayDown, rect);\n        View currentBottomView = getCurrentBottomView();\n        if (currentBottomView != null) {\n            currentBottomView.layout(rect.left, rect.top, rect.right, rect.bottom);\n        }\n    }\n\n    private boolean mIsBeingDragged;\n\n    private void checkCanDrag(MotionEvent ev) {\n        if (mIsBeingDragged) return;\n        if (getOpenStatus() == Status.Middle) {\n            mIsBeingDragged = true;\n            return;\n        }\n        Status status = getOpenStatus();\n        float distanceX = ev.getRawX() - sX;\n        float distanceY = ev.getRawY() - sY;\n        float angle = Math.abs(distanceY / distanceX);\n        angle = (float) Math.toDegrees(Math.atan(angle));\n        if (getOpenStatus() == Status.Close) {\n            DragEdge dragEdge;\n            if (angle < 45) {\n                if (distanceX > 0 && isLeftSwipeEnabled()) {\n                    dragEdge = DragEdge.Left;\n                } else if (distanceX < 0 && isRightSwipeEnabled()) {\n                    dragEdge = DragEdge.Right;\n                } else return;\n\n            } else {\n                if (distanceY > 0 && isTopSwipeEnabled()) {\n                    dragEdge = DragEdge.Top;\n                } else if (distanceY < 0 && isBottomSwipeEnabled()) {\n                    dragEdge = DragEdge.Bottom;\n                } else return;\n            }\n            setCurrentDragEdge(dragEdge);\n        }\n\n        boolean doNothing = false;\n        if (mCurrentDragEdge == DragEdge.Right) {\n            boolean suitable = (status == Status.Open && distanceX > mTouchSlop)\n                    || (status == Status.Close && distanceX < -mTouchSlop);\n            suitable = suitable || (status == Status.Middle);\n\n            if (angle > 30 || !suitable) {\n                doNothing = true;\n            }\n        }\n\n        if (mCurrentDragEdge == DragEdge.Left) {\n            boolean suitable = (status == Status.Open && distanceX < -mTouchSlop)\n                    || (status == Status.Close && distanceX > mTouchSlop);\n            suitable = suitable || status == Status.Middle;\n\n            if (angle > 30 || !suitable) {\n                doNothing = true;\n            }\n        }\n\n        if (mCurrentDragEdge == DragEdge.Top) {\n            boolean suitable = (status == Status.Open && distanceY < -mTouchSlop)\n                    || (status == Status.Close && distanceY > mTouchSlop);\n            suitable = suitable || status == Status.Middle;\n\n            if (angle < 60 || !suitable) {\n                doNothing = true;\n            }\n        }\n\n        if (mCurrentDragEdge == DragEdge.Bottom) {\n            boolean suitable = (status == Status.Open && distanceY > mTouchSlop)\n                    || (status == Status.Close && distanceY < -mTouchSlop);\n            suitable = suitable || status == Status.Middle;\n\n            if (angle < 60 || !suitable) {\n                doNothing = true;\n            }\n        }\n        mIsBeingDragged = !doNothing;\n    }\n\n    @Override\n    public boolean onInterceptTouchEvent(MotionEvent ev) {\n        if (!isSwipeEnabled()) {\n            return false;\n        }\n        if (mClickToClose && getOpenStatus() == Status.Open && isTouchOnSurface(ev)) {\n            return true;\n        }\n        for (SwipeDenier denier : mSwipeDeniers) {\n            if (denier != null && denier.shouldDenySwipe(ev)) {\n                return false;\n            }\n        }\n\n        switch (ev.getAction()) {\n            case MotionEvent.ACTION_DOWN:\n                mDragHelper.processTouchEvent(ev);\n                mIsBeingDragged = false;\n                sX = ev.getRawX();\n                sY = ev.getRawY();\n                //if the swipe is in middle state(scrolling), should intercept the touch\n                if (getOpenStatus() == Status.Middle) {\n                    mIsBeingDragged = true;\n                }\n                break;\n            case MotionEvent.ACTION_MOVE:\n                boolean beforeCheck = mIsBeingDragged;\n                checkCanDrag(ev);\n                if (mIsBeingDragged) {\n                    ViewParent parent = getParent();\n                    if (parent != null) {\n                        parent.requestDisallowInterceptTouchEvent(true);\n                    }\n                }\n                if (!beforeCheck && mIsBeingDragged) {\n                    //let children has one chance to catch the touch, and request the swipe not intercept\n                    //useful when swipeLayout wrap a swipeLayout or other gestural layout\n                    return false;\n                }\n                break;\n\n            case MotionEvent.ACTION_CANCEL:\n            case MotionEvent.ACTION_UP:\n                mIsBeingDragged = false;\n                mDragHelper.processTouchEvent(ev);\n                break;\n            default://handle other action, such as ACTION_POINTER_DOWN/UP\n                mDragHelper.processTouchEvent(ev);\n        }\n        return mIsBeingDragged;\n    }\n\n    private float sX = -1, sY = -1;\n\n    @Override\n    public boolean onTouchEvent(MotionEvent event) {\n        if (!isSwipeEnabled()) return super.onTouchEvent(event);\n\n        int action = event.getActionMasked();\n        gestureDetector.onTouchEvent(event);\n\n        switch (action) {\n            case MotionEvent.ACTION_DOWN:\n                mDragHelper.processTouchEvent(event);\n                sX = event.getRawX();\n                sY = event.getRawY();\n\n\n            case MotionEvent.ACTION_MOVE: {\n                //the drag state and the direction are already judged at onInterceptTouchEvent\n                checkCanDrag(event);\n                if (mIsBeingDragged) {\n                    getParent().requestDisallowInterceptTouchEvent(true);\n                    mDragHelper.processTouchEvent(event);\n                }\n                break;\n            }\n            case MotionEvent.ACTION_UP:\n            case MotionEvent.ACTION_CANCEL:\n                mIsBeingDragged = false;\n                mDragHelper.processTouchEvent(event);\n                break;\n\n            default://handle other action, such as ACTION_POINTER_DOWN/UP\n                mDragHelper.processTouchEvent(event);\n        }\n\n        return super.onTouchEvent(event) || mIsBeingDragged || action == MotionEvent.ACTION_DOWN;\n    }\n\n    public boolean isClickToClose() {\n        return mClickToClose;\n    }\n\n    public void setClickToClose(boolean mClickToClose) {\n        this.mClickToClose = mClickToClose;\n    }\n\n    public void setSwipeEnabled(boolean enabled) {\n        mSwipeEnabled = enabled;\n    }\n\n    public boolean isSwipeEnabled() {\n        return mSwipeEnabled;\n    }\n\n    public boolean isLeftSwipeEnabled() {\n        View bottomView = mDragEdges.get(DragEdge.Left);\n        return bottomView != null && bottomView.getParent() == this\n                && bottomView != getSurfaceView() && mSwipesEnabled[DragEdge.Left.ordinal()];\n    }\n\n    public void setLeftSwipeEnabled(boolean leftSwipeEnabled) {\n        this.mSwipesEnabled[DragEdge.Left.ordinal()] = leftSwipeEnabled;\n    }\n\n    public boolean isRightSwipeEnabled() {\n        View bottomView = mDragEdges.get(DragEdge.Right);\n        return bottomView != null && bottomView.getParent() == this\n                && bottomView != getSurfaceView() && mSwipesEnabled[DragEdge.Right.ordinal()];\n    }\n\n    public void setRightSwipeEnabled(boolean rightSwipeEnabled) {\n        this.mSwipesEnabled[DragEdge.Right.ordinal()] = rightSwipeEnabled;\n    }\n\n    public boolean isTopSwipeEnabled() {\n        View bottomView = mDragEdges.get(DragEdge.Top);\n        return bottomView != null && bottomView.getParent() == this\n                && bottomView != getSurfaceView() && mSwipesEnabled[DragEdge.Top.ordinal()];\n    }\n\n    public void setTopSwipeEnabled(boolean topSwipeEnabled) {\n        this.mSwipesEnabled[DragEdge.Top.ordinal()] = topSwipeEnabled;\n    }\n\n    public boolean isBottomSwipeEnabled() {\n        View bottomView = mDragEdges.get(DragEdge.Bottom);\n        return bottomView != null && bottomView.getParent() == this\n                && bottomView != getSurfaceView() && mSwipesEnabled[DragEdge.Bottom.ordinal()];\n    }\n\n    public void setBottomSwipeEnabled(boolean bottomSwipeEnabled) {\n        this.mSwipesEnabled[DragEdge.Bottom.ordinal()] = bottomSwipeEnabled;\n    }\n\n    private boolean insideAdapterView() {\n        return getAdapterView() != null;\n    }\n\n    private AdapterView getAdapterView() {\n        ViewParent t = getParent();\n        if (t instanceof AdapterView) {\n            return (AdapterView) t;\n        }\n        return null;\n    }\n\n    private void performAdapterViewItemClick() {\n        if (getOpenStatus() != Status.Close) return;\n        ViewParent t = getParent();\n        if (t instanceof AdapterView) {\n            AdapterView view = (AdapterView) t;\n            int p = view.getPositionForView(SwipeLayout.this);\n            if (p != AdapterView.INVALID_POSITION) {\n                view.performItemClick(view.getChildAt(p - view.getFirstVisiblePosition()), p, view\n                        .getAdapter().getItemId(p));\n            }\n        }\n    }\n\n    private boolean performAdapterViewItemLongClick() {\n        if (getOpenStatus() != Status.Close) return false;\n        ViewParent t = getParent();\n        if (t instanceof AdapterView) {\n            AdapterView view = (AdapterView) t;\n            int p = view.getPositionForView(SwipeLayout.this);\n            if (p == AdapterView.INVALID_POSITION) return false;\n            long vId = view.getItemIdAtPosition(p);\n            boolean handled = false;\n            try {\n                Method m = AbsListView.class.getDeclaredMethod(\"performLongPress\", View.class, int.class, long.class);\n                m.setAccessible(true);\n                handled = (boolean) m.invoke(view, SwipeLayout.this, p, vId);\n\n            } catch (Exception e) {\n                e.printStackTrace();\n\n                if (view.getOnItemLongClickListener() != null) {\n                    handled = view.getOnItemLongClickListener().onItemLongClick(view, SwipeLayout.this, p, vId);\n                }\n                if (handled) {\n                    view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);\n                }\n            }\n            return handled;\n        }\n        return false;\n    }\n\n    @Override\n    protected void onAttachedToWindow() {\n        super.onAttachedToWindow();\n        if (insideAdapterView()) {\n            if (clickListener == null) {\n                setOnClickListener(new OnClickListener() {\n                    @Override\n                    public void onClick(View v) {\n                        performAdapterViewItemClick();\n                    }\n                });\n            }\n            if (longClickListener == null) {\n                setOnLongClickListener(new OnLongClickListener() {\n                    @Override\n                    public boolean onLongClick(View v) {\n                        performAdapterViewItemLongClick();\n                        return true;\n                    }\n                });\n            }\n        }\n    }\n\n    OnClickListener clickListener;\n\n    @Override\n    public void setOnClickListener(OnClickListener l) {\n        super.setOnClickListener(l);\n        clickListener = l;\n    }\n\n    OnLongClickListener longClickListener;\n\n    @Override\n    public void setOnLongClickListener(OnLongClickListener l) {\n        super.setOnLongClickListener(l);\n        longClickListener = l;\n    }\n\n    private Rect hitSurfaceRect;\n\n    private boolean isTouchOnSurface(MotionEvent ev) {\n        View surfaceView = getSurfaceView();\n        if (surfaceView == null) {\n            return false;\n        }\n        if (hitSurfaceRect == null) {\n            hitSurfaceRect = new Rect();\n        }\n        surfaceView.getHitRect(hitSurfaceRect);\n        return hitSurfaceRect.contains((int) ev.getX(), (int) ev.getY());\n    }\n\n    private GestureDetector gestureDetector = new GestureDetector(getContext(), new SwipeDetector());\n\n    class SwipeDetector extends GestureDetector.SimpleOnGestureListener {\n        @Override\n        public boolean onSingleTapUp(MotionEvent e) {\n            if (mClickToClose && isTouchOnSurface(e)) {\n                close();\n            }\n            return super.onSingleTapUp(e);\n        }\n\n        @Override\n        public boolean onDoubleTap(MotionEvent e) {\n            if (mDoubleClickListener != null) {\n                View target;\n                View bottom = getCurrentBottomView();\n                View surface = getSurfaceView();\n                if (bottom != null && e.getX() > bottom.getLeft() && e.getX() < bottom.getRight()\n                        && e.getY() > bottom.getTop() && e.getY() < bottom.getBottom()) {\n                    target = bottom;\n                } else {\n                    target = surface;\n                }\n                mDoubleClickListener.onDoubleClick(SwipeLayout.this, target == surface);\n            }\n            return true;\n        }\n    }\n\n    /**\n     * set the drag distance, it will force set the bottom view's width or\n     * height via this value.\n     *\n     * @param max max distance in dp unit\n     */\n    public void setDragDistance(int max) {\n        if (max < 0) max = 0;\n        mDragDistance = dp2px(max);\n        requestLayout();\n    }\n\n    /**\n     * There are 2 diffirent show mode.\n     * {@link com.marshalchen.ultimaterecyclerview.swipe.SwipeLayout.ShowMode}.PullOut and\n     * {@link com.marshalchen.ultimaterecyclerview.swipe.SwipeLayout.ShowMode}.LayDown.\n     *\n     * @param mode na\n     */\n    public void setShowMode(ShowMode mode) {\n        mShowMode = mode;\n        requestLayout();\n    }\n\n    public DragEdge getDragEdge() {\n        return mCurrentDragEdge;\n    }\n\n    public int getDragDistance() {\n        return mDragDistance;\n    }\n\n    public ShowMode getShowMode() {\n        return mShowMode;\n    }\n\n    /**\n     * @return null if there is no surface view(no children)\n     */\n    public View getSurfaceView() {\n        if (getChildCount() == 0) return null;\n        return getChildAt(getChildCount() - 1);\n    }\n\n    /**\n     * @return null if there is no bottom view\n     */\n    @Nullable\n    public View getCurrentBottomView() {\n        List<View> bottoms = getBottomViews();\n        if (mCurrentDragEdge.ordinal() < bottoms.size()) {\n            return bottoms.get(mCurrentDragEdge.ordinal());\n        }\n        return null;\n    }\n\n    /**\n     * @return all bottomViews: left, top, right, bottom (may null if the edge is not set)\n     */\n    public List<View> getBottomViews() {\n        ArrayList<View> bottoms = new ArrayList<View>();\n        for (DragEdge dragEdge : DragEdge.values()) {\n            bottoms.add(mDragEdges.get(dragEdge));\n        }\n        return bottoms;\n    }\n\n    public enum Status {\n        Middle,\n        Open,\n        Close\n    }\n\n    /**\n     * get the open status.\n     *\n     * @return {@link com.marshalchen.ultimaterecyclerview.swipe.SwipeLayout.Status} Open , Close or\n     * Middle.\n     */\n    public Status getOpenStatus() {\n        View surfaceView = getSurfaceView();\n        if (surfaceView == null) {\n            return Status.Close;\n        }\n        int surfaceLeft = surfaceView.getLeft();\n        int surfaceTop = surfaceView.getTop();\n        if (surfaceLeft == getPaddingLeft() && surfaceTop == getPaddingTop()) return Status.Close;\n\n        if (surfaceLeft == (getPaddingLeft() - mDragDistance) || surfaceLeft == (getPaddingLeft() + mDragDistance)\n                || surfaceTop == (getPaddingTop() - mDragDistance) || surfaceTop == (getPaddingTop() + mDragDistance))\n            return Status.Open;\n\n        return Status.Middle;\n    }\n\n\n    /**\n     * Process the surface release event.\n     *\n     * @param xvel                 xVelocity\n     * @param yvel                 yVelocity\n     * @param isCloseBeforeDragged the open state before drag\n     */\n    protected void processHandRelease(float xvel, float yvel, boolean isCloseBeforeDragged) {\n        float minVelocity = mDragHelper.getMinVelocity();\n        View surfaceView = getSurfaceView();\n        DragEdge currentDragEdge = mCurrentDragEdge;\n        if (currentDragEdge == null || surfaceView == null) {\n            return;\n        }\n        float willOpenPercent = (isCloseBeforeDragged ? .25f : .75f);\n        if (currentDragEdge == DragEdge.Left) {\n            if (xvel > minVelocity) open();\n            else if (xvel < -minVelocity) close();\n            else {\n                float openPercent = 1f * getSurfaceView().getLeft() / mDragDistance;\n                if (openPercent > willOpenPercent) open();\n                else close();\n            }\n        } else if (currentDragEdge == DragEdge.Right) {\n            if (xvel > minVelocity) close();\n            else if (xvel < -minVelocity) open();\n            else {\n                float openPercent = 1f * (-getSurfaceView().getLeft()) / mDragDistance;\n                if (openPercent > willOpenPercent) open();\n                else close();\n            }\n        } else if (currentDragEdge == DragEdge.Top) {\n            if (yvel > minVelocity) open();\n            else if (yvel < -minVelocity) close();\n            else {\n                float openPercent = 1f * getSurfaceView().getTop() / mDragDistance;\n                if (openPercent > willOpenPercent) open();\n                else close();\n            }\n        } else if (currentDragEdge == DragEdge.Bottom) {\n            if (yvel > minVelocity) close();\n            else if (yvel < -minVelocity) open();\n            else {\n                float openPercent = 1f * (-getSurfaceView().getTop()) / mDragDistance;\n                if (openPercent > willOpenPercent) open();\n                else close();\n            }\n        }\n    }\n\n    /**\n     * smoothly open surface.\n     */\n    public void open() {\n        open(true, true);\n    }\n\n    public void open(boolean smooth) {\n        open(smooth, true);\n    }\n\n    public void open(boolean smooth, boolean notify) {\n        View surface = getSurfaceView(), bottom = getCurrentBottomView();\n        if (surface == null) {\n            return;\n        }\n        int dx, dy;\n        Rect rect = computeSurfaceLayoutArea(true);\n        if (smooth) {\n            mDragHelper.smoothSlideViewTo(surface, rect.left, rect.top);\n        } else {\n            dx = rect.left - surface.getLeft();\n            dy = rect.top - surface.getTop();\n            surface.layout(rect.left, rect.top, rect.right, rect.bottom);\n            if (getShowMode() == ShowMode.PullOut) {\n                Rect bRect = computeBottomLayoutAreaViaSurface(ShowMode.PullOut, rect);\n                if (bottom != null) {\n                    bottom.layout(bRect.left, bRect.top, bRect.right, bRect.bottom);\n                }\n            }\n            if (notify) {\n                dispatchRevealEvent(rect.left, rect.top, rect.right, rect.bottom);\n                dispatchSwipeEvent(rect.left, rect.top, dx, dy);\n            } else {\n                safeBottomView();\n            }\n        }\n        invalidate();\n    }\n\n    public void open(DragEdge edge) {\n        setCurrentDragEdge(edge);\n        open(true, true);\n    }\n\n    public void open(boolean smooth, DragEdge edge) {\n        setCurrentDragEdge(edge);\n        open(smooth, true);\n    }\n\n    public void open(boolean smooth, boolean notify, DragEdge edge) {\n        setCurrentDragEdge(edge);\n        open(smooth, notify);\n    }\n\n    /**\n     * smoothly close surface.\n     */\n    public void close() {\n        close(true, true);\n    }\n\n    public void close(boolean smooth) {\n        close(smooth, true);\n    }\n\n    /**\n     * close surface\n     *\n     * @param smooth smoothly or not.\n     * @param notify if notify all the listeners.\n     */\n    public void close(boolean smooth, boolean notify) {\n        View surface = getSurfaceView();\n        if (surface == null) {\n            return;\n        }\n        int dx, dy;\n        if (smooth)\n            mDragHelper.smoothSlideViewTo(getSurfaceView(), getPaddingLeft(), getPaddingTop());\n        else {\n            Rect rect = computeSurfaceLayoutArea(false);\n            dx = rect.left - surface.getLeft();\n            dy = rect.top - surface.getTop();\n            surface.layout(rect.left, rect.top, rect.right, rect.bottom);\n            if (notify) {\n                dispatchRevealEvent(rect.left, rect.top, rect.right, rect.bottom);\n                dispatchSwipeEvent(rect.left, rect.top, dx, dy);\n            } else {\n                safeBottomView();\n            }\n        }\n        invalidate();\n    }\n\n    public void toggle() {\n        toggle(true);\n    }\n\n    public void toggle(boolean smooth) {\n        if (getOpenStatus() == Status.Open)\n            close(smooth);\n        else if (getOpenStatus() == Status.Close) open(smooth);\n    }\n\n\n    /**\n     * a helper function to compute the Rect area that surface will hold in.\n     *\n     * @param open open status or close status.\n     */\n    private Rect computeSurfaceLayoutArea(boolean open) {\n        int l = getPaddingLeft(), t = getPaddingTop();\n        if (open) {\n            if (mCurrentDragEdge == DragEdge.Left)\n                l = getPaddingLeft() + mDragDistance;\n            else if (mCurrentDragEdge == DragEdge.Right)\n                l = getPaddingLeft() - mDragDistance;\n            else if (mCurrentDragEdge == DragEdge.Top)\n                t = getPaddingTop() + mDragDistance;\n            else t = getPaddingTop() - mDragDistance;\n        }\n        return new Rect(l, t, l + getMeasuredWidth(), t + getMeasuredHeight());\n    }\n\n    private Rect computeBottomLayoutAreaViaSurface(ShowMode mode, Rect surfaceArea) {\n        Rect rect = surfaceArea;\n        View bottomView = getCurrentBottomView();\n\n        int bl = rect.left, bt = rect.top, br = rect.right, bb = rect.bottom;\n        if (mode == ShowMode.PullOut) {\n            if (mCurrentDragEdge == DragEdge.Left)\n                bl = rect.left - mDragDistance;\n            else if (mCurrentDragEdge == DragEdge.Right)\n                bl = rect.right;\n            else if (mCurrentDragEdge == DragEdge.Top)\n                bt = rect.top - mDragDistance;\n            else bt = rect.bottom;\n\n            if (mCurrentDragEdge == DragEdge.Left || mCurrentDragEdge == DragEdge.Right) {\n                bb = rect.bottom;\n                br = bl + (bottomView == null ? 0 : bottomView.getMeasuredWidth());\n            } else {\n                bb = bt + (bottomView == null ? 0 : bottomView.getMeasuredHeight());\n                br = rect.right;\n            }\n        } else if (mode == ShowMode.LayDown) {\n            if (mCurrentDragEdge == DragEdge.Left)\n                br = bl + mDragDistance;\n            else if (mCurrentDragEdge == DragEdge.Right)\n                bl = br - mDragDistance;\n            else if (mCurrentDragEdge == DragEdge.Top)\n                bb = bt + mDragDistance;\n            else bt = bb - mDragDistance;\n\n        }\n        return new Rect(bl, bt, br, bb);\n\n    }\n\n    private Rect computeBottomLayDown(DragEdge dragEdge) {\n        int bl = getPaddingLeft(), bt = getPaddingTop();\n        int br, bb;\n        if (dragEdge == DragEdge.Right) {\n            bl = getMeasuredWidth() - mDragDistance;\n        } else if (dragEdge == DragEdge.Bottom) {\n            bt = getMeasuredHeight() - mDragDistance;\n        }\n        if (dragEdge == DragEdge.Left || dragEdge == DragEdge.Right) {\n            br = bl + mDragDistance;\n            bb = bt + getMeasuredHeight();\n        } else {\n            br = bl + getMeasuredWidth();\n            bb = bt + mDragDistance;\n        }\n        return new Rect(bl, bt, br, bb);\n    }\n\n    public void setOnDoubleClickListener(DoubleClickListener doubleClickListener) {\n        mDoubleClickListener = doubleClickListener;\n    }\n\n    public interface DoubleClickListener {\n        void onDoubleClick(SwipeLayout layout, boolean surface);\n    }\n\n    private int dp2px(float dp) {\n        return (int) (dp * getContext().getResources().getDisplayMetrics().density + 0.5f);\n    }\n\n\n    /**\n     * Deprecated, use {@link #setDrag(DragEdge, View)}\n     *\n     * @param dragEdge na\n     */\n    @Deprecated\n    public void setDragEdge(DragEdge dragEdge) {\n        clearDragEdge();\n        if (getChildCount() >= 2) {\n            mDragEdges.put(dragEdge, getChildAt(getChildCount() - 2));\n        }\n        setCurrentDragEdge(dragEdge);\n    }\n\n    @Override\n    public void onViewRemoved(View child) {\n        for (Map.Entry<DragEdge, View> entry : new HashMap<DragEdge, View>(mDragEdges).entrySet()) {\n            if (entry.getValue() == child) {\n                mDragEdges.remove(entry.getKey());\n            }\n        }\n    }\n\n    public Map<DragEdge, View> getDragEdgeMap() {\n        return mDragEdges;\n    }\n\n    /**\n     * @return Deprecated, use {@link #getDragEdgeMap()}\n     */\n    @Deprecated\n    public List<DragEdge> getDragEdges() {\n        return new ArrayList<DragEdge>(mDragEdges.keySet());\n    }\n\n    /**\n     * Deprecated, use {@link #setDrag(DragEdge, View)}\n     *\n     * @param dragEdges na\n     */\n    @Deprecated\n    public void setDragEdges(List<DragEdge> dragEdges) {\n        clearDragEdge();\n        for (int i = 0, size = Math.min(dragEdges.size(), getChildCount() - 1); i < size; i++) {\n            DragEdge dragEdge = dragEdges.get(i);\n            mDragEdges.put(dragEdge, getChildAt(i));\n        }\n        if (dragEdges.size() == 0 || dragEdges.contains(DefaultDragEdge)) {\n            setCurrentDragEdge(DefaultDragEdge);\n        } else {\n            setCurrentDragEdge(dragEdges.get(0));\n        }\n    }\n\n    /**\n     * Deprecated, use {@link #addDrag(DragEdge, View)}\n     *\n     * @param mDragEdges na\n     */\n    @Deprecated\n    public void setDragEdges(DragEdge... mDragEdges) {\n        clearDragEdge();\n        setDragEdges(Arrays.asList(mDragEdges));\n    }\n\n    /**\n     * Deprecated, use {@link #addDrag(DragEdge, View)}\n     * When using multiple drag edges it's a good idea to pass the ids of the views that\n     * you're using for the left, right, top bottom views (-1 if you're not using a particular view)\n     *\n     * @param leftId   na\n     * @param rightId  na\n     * @param topId    na\n     * @param bottomId na\n     */\n    @Deprecated\n    public void setBottomViewIds(int leftId, int rightId, int topId, int bottomId) {\n        addDrag(DragEdge.Left, findViewById(leftId));\n        addDrag(DragEdge.Right, findViewById(rightId));\n        addDrag(DragEdge.Top, findViewById(topId));\n        addDrag(DragEdge.Bottom, findViewById(bottomId));\n    }\n\n    private float getCurrentOffset() {\n        if (mCurrentDragEdge == null) return 0;\n        return mEdgeSwipesOffset[mCurrentDragEdge.ordinal()];\n    }\n\n    private void setCurrentDragEdge(DragEdge dragEdge) {\n        mCurrentDragEdge = dragEdge;\n        updateBottomViews();\n    }\n\n    private void updateBottomViews() {\n        View currentBottomView = getCurrentBottomView();\n        if (currentBottomView != null) {\n            if (mCurrentDragEdge == DragEdge.Left || mCurrentDragEdge == DragEdge.Right) {\n                mDragDistance = currentBottomView.getMeasuredWidth() - dp2px(getCurrentOffset());\n            } else {\n                mDragDistance = currentBottomView.getMeasuredHeight() - dp2px(getCurrentOffset());\n            }\n        }\n\n        if (mShowMode == ShowMode.PullOut) {\n            layoutPullOut();\n        } else if (mShowMode == ShowMode.LayDown) {\n            layoutLayDown();\n        }\n\n        safeBottomView();\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/swipelistview/BaseSwipeListViewListener.java",
    "content": "package com.marshalchen.ultimaterecyclerview.swipelistview;\n\npublic class BaseSwipeListViewListener implements SwipeListViewListener {\n    @Override\n    public void onOpened(int position, boolean toRight) {\n    }\n\n    @Override\n    public void onClosed(int position, boolean fromRight) {\n    }\n\n    @Override\n    public void onListChanged() {\n    }\n\n    @Override\n    public void onMove(int position, float x) {\n    }\n\n    @Override\n    public void onStartOpen(int position, int action, boolean right) {\n    }\n\n    @Override\n    public void onStartClose(int position, boolean right) {\n    }\n\n    @Override\n    public void onClickFrontView(int position) {\n    }\n\n    @Override\n    public void onClickBackView(int position) {\n    }\n\n    @Override\n    public void onDismiss(int[] reverseSortedPositions) {\n    }\n\n    @Override\n    public int onChangeSwipeMode(int position) {\n        return SwipeListView.SWIPE_MODE_DEFAULT;\n    }\n\n    @Override\n    public void onChoiceChanged(int position, boolean selected) {\n    }\n\n    @Override\n    public void onChoiceStarted() {\n    }\n\n    @Override\n    public void onChoiceEnded() {\n    }\n\n    @Override\n    public void onFirstListItem() {\n    }\n\n    @Override\n    public void onLastListItem() {\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/swipelistview/SwipeListView.java",
    "content": "/*\n * Copyright (C) 2013 47 Degrees, LLC\n * http://47deg.com\n * hello@47deg.com\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.marshalchen.ultimaterecyclerview.swipelistview;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport androidx.core.view.MotionEventCompat;\nimport androidx.core.view.ViewConfigurationCompat;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewConfiguration;\nimport android.view.ViewGroup;\nimport android.widget.ListView;\n\nimport com.marshalchen.ultimaterecyclerview.R;\n\nimport java.util.List;\n\n/**\n * ListView subclass that provides the swipe functionality\n */\npublic class SwipeListView extends RecyclerView {\n\n    /**\n     * log tag\n     */\n    public final static String TAG = \"SwipeListView\";\n\n    /**\n     * whether debug\n     */\n    public final static boolean DEBUG = false;\n\n    /**\n     * Used when user want change swipe list mode on some rows\n     */\n    public final static int SWIPE_MODE_DEFAULT = -1;\n\n    /**\n     * Disables all swipes\n     */\n    public final static int SWIPE_MODE_NONE = 0;\n\n    /**\n     * Enables both left and right swipe\n     */\n    public final static int SWIPE_MODE_BOTH = 1;\n\n    /**\n     * Enables right swipe\n     */\n    public final static int SWIPE_MODE_RIGHT = 2;\n\n    /**\n     * Enables left swipe\n     */\n    public final static int SWIPE_MODE_LEFT = 3;\n\n    /**\n     * Binds the swipe gesture to reveal a view behind the row (Drawer style)\n     */\n    public final static int SWIPE_ACTION_REVEAL = 0;\n\n    /**\n     * Dismisses the cell when swiped over\n     */\n    public final static int SWIPE_ACTION_DISMISS = 1;\n\n    /**\n     * Marks the cell as checked when swiped and release\n     */\n    public final static int SWIPE_ACTION_CHOICE = 2;\n\n    /**\n     * No action when swiped\n     */\n    public final static int SWIPE_ACTION_NONE = 3;\n\n    /**\n     * Default ids for front view\n     */\n    public final static String SWIPE_DEFAULT_FRONT_VIEW = \"swipelist_frontview\";\n\n    /**\n     * Default id for back view\n     */\n    public final static String SWIPE_DEFAULT_BACK_VIEW = \"swipelist_backview\";\n\n    /**\n     * Indicates no movement\n     */\n    private final static int TOUCH_STATE_REST = 0;\n\n    /**\n     * State scrolling x position\n     */\n    private final static int TOUCH_STATE_SCROLLING_X = 1;\n\n    /**\n     * State scrolling y position\n     */\n    private final static int TOUCH_STATE_SCROLLING_Y = 2;\n\n    private int touchState = TOUCH_STATE_REST;\n\n    private float lastMotionX;\n    private float lastMotionY;\n    private int touchSlop;\n\n    int swipeFrontView = 0;\n    int swipeBackView = 0;\n\n\n    private LinearLayoutManager mLayoutManager;\n\n    /**\n     * Internal listener for common swipe events\n     */\n    public SwipeListViewListener swipeListViewListener;\n\n    /**\n     * Internal touch listener\n     */\n    private SwipeListViewTouchListener touchListener;\n\n\n    /**\n     * If you create a View programmatically you need send back and front identifier\n     *\n     * @param context        Context\n     * @param swipeBackView  Back Identifier\n     * @param swipeFrontView Front Identifier\n     */\n    public SwipeListView(Context context, int swipeBackView, int swipeFrontView) {\n        super(context);\n        this.swipeFrontView = swipeFrontView;\n        this.swipeBackView = swipeBackView;\n        //    init(null);\n    }\n\n    /**\n     * @param context na\n     * @param attrs   na\n     * @see ListView#ListView(Context, AttributeSet)\n     */\n    public SwipeListView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        //    init(attrs);\n    }\n\n    /**\n     * @param context  na\n     * @param attrs    na\n     * @param defStyle na\n     * @see ListView#ListView(Context, AttributeSet, int)\n     */\n\n    public SwipeListView(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n        //  init(attrs);\n    }\n\n    /**\n     * Init ListView\n     *\n     * @param attrs AttributeSet\n     */\n    public void init(AttributeSet attrs) {\n        int swipeMode = SWIPE_MODE_BOTH;\n        boolean swipeOpenOnLongPress = true;\n        boolean swipeCloseAllItemsWhenMoveList = true;\n        boolean onlyOneOpenedWhenSwipe = false;\n        long swipeAnimationTime = 0;\n        float swipeOffsetLeft = 0;\n        float swipeOffsetRight = 0;\n        int swipeDrawableChecked = 0;\n        int swipeDrawableUnchecked = 0;\n\n        int swipeActionLeft = SWIPE_ACTION_REVEAL;\n        int swipeActionRight = SWIPE_ACTION_REVEAL;\n\n        if (attrs != null) {\n            TypedArray styled = getContext().obtainStyledAttributes(attrs, R.styleable.SwipeListView);\n            swipeMode = styled.getInt(R.styleable.SwipeListView_swipeMode, SWIPE_MODE_BOTH);\n            swipeActionLeft = styled.getInt(R.styleable.SwipeListView_swipeActionLeft, SWIPE_ACTION_REVEAL);\n            swipeActionRight = styled.getInt(R.styleable.SwipeListView_swipeActionRight, SWIPE_ACTION_REVEAL);\n            onlyOneOpenedWhenSwipe = styled.getBoolean(R.styleable.SwipeListView_onlyOneOpenedWhenSwipe, false);\n            swipeOffsetLeft = styled.getDimension(R.styleable.SwipeListView_swipeOffsetLeft, 0);\n            swipeOffsetRight = styled.getDimension(R.styleable.SwipeListView_swipeOffsetRight, 0);\n            swipeOpenOnLongPress = styled.getBoolean(R.styleable.SwipeListView_swipeOpenOnLongPress, true);\n            swipeAnimationTime = styled.getInteger(R.styleable.SwipeListView_swipeAnimationTime, 0);\n            swipeCloseAllItemsWhenMoveList = styled.getBoolean(R.styleable.SwipeListView_swipeCloseAllItemsWhenMoveList, true);\n            swipeDrawableChecked = styled.getResourceId(R.styleable.SwipeListView_swipeDrawableChecked, 0);\n            swipeDrawableUnchecked = styled.getResourceId(R.styleable.SwipeListView_swipeDrawableUnchecked, 0);\n            swipeFrontView = styled.getResourceId(R.styleable.SwipeListView_swipeFrontView, 0);\n            swipeBackView = styled.getResourceId(R.styleable.SwipeListView_swipeBackView, 0);\n            styled.recycle();\n        }\n\n        if (swipeFrontView == 0 || swipeBackView == 0) {\n            swipeFrontView = getContext().getResources().getIdentifier(SWIPE_DEFAULT_FRONT_VIEW, \"id\", getContext().getPackageName());\n            swipeBackView = getContext().getResources().getIdentifier(SWIPE_DEFAULT_BACK_VIEW, \"id\", getContext().getPackageName());\n\n            if (swipeFrontView == 0 || swipeBackView == 0) {\n                throw new RuntimeException(String.format(\"You forgot the attributes swipeFrontView or swipeBackView. You can add this attributes or use '%s' and '%s' identifiers\", SWIPE_DEFAULT_FRONT_VIEW, SWIPE_DEFAULT_BACK_VIEW));\n            }\n        }\n\n        final ViewConfiguration configuration = ViewConfiguration.get(getContext());\n        touchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(configuration);\n        touchListener = new SwipeListViewTouchListener(this, swipeFrontView, swipeBackView);\n        if (swipeAnimationTime > 0) {\n            touchListener.setAnimationTime(swipeAnimationTime);\n        }\n        touchListener.setRightOffset(swipeOffsetRight);\n        touchListener.setLeftOffset(swipeOffsetLeft);\n        touchListener.setSwipeActionLeft(swipeActionLeft);\n        touchListener.setSwipeActionRight(swipeActionRight);\n        touchListener.setSwipeMode(swipeMode);\n        touchListener.setOnlyOneOpenedWhenSwipe(onlyOneOpenedWhenSwipe);\n        touchListener.setSwipeClosesAllItemsWhenListMoves(swipeCloseAllItemsWhenMoveList);\n        touchListener.setSwipeOpenOnLongPress(swipeOpenOnLongPress);\n        touchListener.setSwipeDrawableChecked(swipeDrawableChecked);\n        touchListener.setSwipeDrawableUnchecked(swipeDrawableUnchecked);\n        setOnTouchListener(touchListener);\n        setOnScrollListener(touchListener.makeScrollListener());\n    }\n\n    /**\n     * Recycle cell. This method should be called from getView in Adapter when use SWIPE_ACTION_CHOICE\n     *\n     * @param convertView parent view\n     * @param position    position in list\n     */\n    public void recycle(View convertView, int position) {\n        touchListener.reloadChoiceStateInView(convertView.findViewById(swipeFrontView), position);\n        touchListener.reloadSwipeStateInView(convertView.findViewById(swipeFrontView), position);\n\n        // Clean pressed state (if dismiss is fire from a cell, to this cell, with a press drawable, in a swipelistview\n        // when this cell will be recycle it will still have his pressed state. This ensure the pressed state is\n        // cleaned.\n        for (int j = 0; j < ((ViewGroup) convertView).getChildCount(); ++j) {\n            View nextChild = ((ViewGroup) convertView).getChildAt(j);\n            nextChild.setPressed(false);\n        }\n    }\n\n    /**\n     * Get if item is selected\n     *\n     * @param position position in list\n     * @return na\n     */\n    public boolean isChecked(int position) {\n        return touchListener.isChecked(position);\n    }\n\n    /**\n     * Get positions selected\n     *\n     * @return na\n     */\n    public List<Integer> getPositionsSelected() {\n        return touchListener.getPositionsSelected();\n    }\n\n    /**\n     * Count selected\n     *\n     * @return na\n     */\n    public int getCountSelected() {\n        return touchListener.getCountSelected();\n    }\n\n    /**\n     * Unselected choice state in item\n     */\n    public void unselectedChoiceStates() {\n        touchListener.unselectedChoiceStates();\n    }\n\n    /**\n     * @see ListView#setAdapter(android.widget.ListAdapter)\n     */\n    @Override\n    public void setAdapter(Adapter adapter) {\n        super.setAdapter(adapter);\n        touchListener.resetItems();\n//        adapter.registerDataSetObserver(new DataSetObserver() {\n//\n//            @Override\n//            public void onChanged() {\n//                super.onChanged();\n//                onListChanged();\n//                touchListener.resetItems();\n//            }\n//        });\n\n        adapter.registerAdapterDataObserver(new AdapterDataObserver() {\n\n            @Override\n            public void onChanged() {\n\n                super.onChanged();\n                onListChanged();\n                touchListener.resetItems();\n\n            }\n\n        });\n    }\n\n    @Override\n    public void setLayoutManager(LayoutManager layoutManager) {\n\n        super.setLayoutManager(layoutManager);\n        mLayoutManager = (LinearLayoutManager) layoutManager;\n        if (touchListener != null) {\n\n            touchListener.setLayoutManager(mLayoutManager);\n        }\n\n    }\n\n    /**\n     * Dismiss item\n     *\n     * @param position Position that you want open\n     */\n    public void dismiss(int position) {\n        int height = touchListener.dismiss(position);\n        if (height > 0) {\n            touchListener.handlerPendingDismisses(height);\n        } else {\n            int[] dismissPositions = new int[1];\n            dismissPositions[0] = position;\n            onDismiss(dismissPositions);\n            touchListener.resetPendingDismisses();\n        }\n    }\n\n    /**\n     * Dismiss items selected\n     */\n    public void dismissSelected() {\n        List<Integer> list = touchListener.getPositionsSelected();\n        int[] dismissPositions = new int[list.size()];\n        int height = 0;\n        for (int i = 0; i < list.size(); i++) {\n            int position = list.get(i);\n            dismissPositions[i] = position;\n            int auxHeight = touchListener.dismiss(position);\n            if (auxHeight > 0) {\n                height = auxHeight;\n            }\n        }\n        if (height > 0) {\n            touchListener.handlerPendingDismisses(height);\n        } else {\n            onDismiss(dismissPositions);\n            touchListener.resetPendingDismisses();\n        }\n        touchListener.returnOldActions();\n    }\n\n    /**\n     * Open ListView's item\n     *\n     * @param position Position that you want open\n     */\n    public void openAnimate(int position) {\n        touchListener.openAnimate(position);\n    }\n\n    /**\n     * Close ListView's item\n     *\n     * @param position Position that you want open\n     */\n    public void closeAnimate(int position) {\n        touchListener.closeAnimate(position);\n    }\n\n    /**\n     * Notifies onDismiss\n     *\n     * @param reverseSortedPositions All dismissed positions\n     */\n    protected void onDismiss(int[] reverseSortedPositions) {\n        if (swipeListViewListener != null) {\n            swipeListViewListener.onDismiss(reverseSortedPositions);\n        }\n    }\n\n    /**\n     * Start open item\n     *\n     * @param position list item\n     * @param action   current action\n     * @param right    to right\n     */\n    protected void onStartOpen(int position, int action, boolean right) {\n        if (swipeListViewListener != null && position != ListView.INVALID_POSITION) {\n            swipeListViewListener.onStartOpen(position, action, right);\n        }\n    }\n\n    /**\n     * Start close item\n     *\n     * @param position list item\n     * @param right    na\n     */\n    protected void onStartClose(int position, boolean right) {\n        if (swipeListViewListener != null && position != ListView.INVALID_POSITION) {\n            swipeListViewListener.onStartClose(position, right);\n        }\n    }\n\n    /**\n     * Notifies onClickFrontView\n     *\n     * @param position item clicked\n     */\n    protected void onClickFrontView(int position) {\n        if (swipeListViewListener != null && position != ListView.INVALID_POSITION) {\n            swipeListViewListener.onClickFrontView(position);\n        }\n    }\n\n    /**\n     * Notifies onClickBackView\n     *\n     * @param position back item clicked\n     */\n    protected void onClickBackView(int position) {\n        if (swipeListViewListener != null && position != ListView.INVALID_POSITION) {\n            swipeListViewListener.onClickBackView(position);\n        }\n    }\n\n    /**\n     * Notifies onOpened\n     *\n     * @param position Item opened\n     * @param toRight  If should be opened toward the right\n     */\n    protected void onOpened(int position, boolean toRight) {\n        if (swipeListViewListener != null && position != ListView.INVALID_POSITION) {\n            swipeListViewListener.onOpened(position, toRight);\n        }\n    }\n\n    /**\n     * Notifies onClosed\n     *\n     * @param position  Item closed\n     * @param fromRight If open from right\n     */\n    protected void onClosed(int position, boolean fromRight) {\n        if (swipeListViewListener != null && position != ListView.INVALID_POSITION) {\n            swipeListViewListener.onClosed(position, fromRight);\n        }\n    }\n\n    /**\n     * Notifies onChoiceChanged\n     *\n     * @param position position that choice\n     * @param selected if item is selected or not\n     */\n    protected void onChoiceChanged(int position, boolean selected) {\n        if (swipeListViewListener != null && position != ListView.INVALID_POSITION) {\n            swipeListViewListener.onChoiceChanged(position, selected);\n        }\n    }\n\n    /**\n     * User start choice items\n     */\n    protected void onChoiceStarted() {\n        if (swipeListViewListener != null) {\n            swipeListViewListener.onChoiceStarted();\n        }\n    }\n\n    /**\n     * User end choice items\n     */\n    protected void onChoiceEnded() {\n        if (swipeListViewListener != null) {\n            swipeListViewListener.onChoiceEnded();\n        }\n    }\n\n    /**\n     * User is in first item of list\n     */\n    protected void onFirstListItem() {\n        if (swipeListViewListener != null) {\n            swipeListViewListener.onFirstListItem();\n        }\n    }\n\n    /**\n     * User is in last item of list\n     */\n    protected void onLastListItem() {\n        if (swipeListViewListener != null) {\n            swipeListViewListener.onLastListItem();\n        }\n    }\n\n    /**\n     * Notifies onListChanged\n     */\n    protected void onListChanged() {\n        if (swipeListViewListener != null) {\n            swipeListViewListener.onListChanged();\n        }\n    }\n\n    /**\n     * Notifies onMove\n     *\n     * @param position Item moving\n     * @param x        Current position\n     */\n    protected void onMove(int position, float x) {\n        if (swipeListViewListener != null && position != ListView.INVALID_POSITION) {\n            swipeListViewListener.onMove(position, x);\n        }\n    }\n\n    protected int changeSwipeMode(int position) {\n        if (swipeListViewListener != null && position != ListView.INVALID_POSITION) {\n            return swipeListViewListener.onChangeSwipeMode(position);\n        }\n        return SWIPE_MODE_DEFAULT;\n    }\n\n    /**\n     * Sets the Listener\n     *\n     * @param swipeListViewListener Listener\n     */\n    public void setSwipeListViewListener(SwipeListViewListener swipeListViewListener) {\n        this.swipeListViewListener = swipeListViewListener;\n    }\n\n    /**\n     * Resets scrolling\n     */\n    public void resetScrolling() {\n        touchState = TOUCH_STATE_REST;\n    }\n\n    /**\n     * Set offset on right\n     *\n     * @param offsetRight Offset\n     */\n    public void setOffsetRight(float offsetRight) {\n        touchListener.setRightOffset(offsetRight);\n    }\n\n    /**\n     * Set offset on left\n     *\n     * @param offsetLeft Offset\n     */\n    public void setOffsetLeft(float offsetLeft) {\n        touchListener.setLeftOffset(offsetLeft);\n    }\n\n    public void setOnlyOneOpenedWhenSwipe(boolean onlyOneOpenedWhenSwipe) {\n\n        touchListener.setOnlyOneOpenedWhenSwipe(onlyOneOpenedWhenSwipe);\n    }\n\n    /**\n     * Set if all items opened will be closed when the user moves the ListView\n     *\n     * @param swipeCloseAllItemsWhenMoveList na\n     */\n    public void setSwipeCloseAllItemsWhenMoveList(boolean swipeCloseAllItemsWhenMoveList) {\n        touchListener.setSwipeClosesAllItemsWhenListMoves(swipeCloseAllItemsWhenMoveList);\n    }\n\n    /**\n     * Sets if the user can open an item with long pressing on cell\n     *\n     * @param swipeOpenOnLongPress na\n     */\n    public void setSwipeOpenOnLongPress(boolean swipeOpenOnLongPress) {\n        touchListener.setSwipeOpenOnLongPress(swipeOpenOnLongPress);\n    }\n\n    /**\n     * Set swipe mode\n     *\n     * @param swipeMode na\n     */\n    public void setSwipeMode(int swipeMode) {\n        touchListener.setSwipeMode(swipeMode);\n    }\n\n    /**\n     * Return action on left\n     *\n     * @return Action\n     */\n    public int getSwipeActionLeft() {\n        return touchListener.getSwipeActionLeft();\n    }\n\n    /**\n     * Set action on left\n     *\n     * @param swipeActionLeft Action\n     */\n    public void setSwipeActionLeft(int swipeActionLeft) {\n        touchListener.setSwipeActionLeft(swipeActionLeft);\n    }\n\n    /**\n     * Return action on right\n     *\n     * @return Action\n     */\n    public int getSwipeActionRight() {\n        return touchListener.getSwipeActionRight();\n    }\n\n    /**\n     * Set action on right\n     *\n     * @param swipeActionRight Action\n     */\n    public void setSwipeActionRight(int swipeActionRight) {\n        touchListener.setSwipeActionRight(swipeActionRight);\n    }\n\n    /**\n     * Sets animation time when user drops cell\n     *\n     * @param animationTime milliseconds\n     */\n    public void setAnimationTime(long animationTime) {\n        touchListener.setAnimationTime(animationTime);\n    }\n\n    /**\n     * @see ListView#onInterceptTouchEvent(MotionEvent)\n     */\n    @Override\n    public boolean onInterceptTouchEvent(MotionEvent ev) {\n        int action = MotionEventCompat.getActionMasked(ev);\n        final float x = ev.getX();\n        final float y = ev.getY();\n\n        if (isEnabled() && touchListener.isSwipeEnabled()) {\n\n            if (touchState == TOUCH_STATE_SCROLLING_X) {\n                return touchListener.onTouch(this, ev);\n            }\n\n            switch (action) {\n                case MotionEvent.ACTION_MOVE:\n                    checkInMoving(x, y);\n                    return touchState == TOUCH_STATE_SCROLLING_Y;\n                case MotionEvent.ACTION_DOWN:\n                    super.onInterceptTouchEvent(ev);\n                    touchListener.onTouch(this, ev);\n                    touchState = TOUCH_STATE_REST;\n                    lastMotionX = x;\n                    lastMotionY = y;\n                    return false;\n                case MotionEvent.ACTION_CANCEL:\n                    touchState = TOUCH_STATE_REST;\n                    break;\n                case MotionEvent.ACTION_UP:\n                    touchListener.onTouch(this, ev);\n                    return touchState == TOUCH_STATE_SCROLLING_Y;\n                default:\n                    break;\n            }\n        }\n\n        return super.onInterceptTouchEvent(ev);\n    }\n\n    /**\n     * Check if the user is moving the cell\n     *\n     * @param x Position X\n     * @param y Position Y\n     */\n    private void checkInMoving(float x, float y) {\n        final int xDiff = (int) Math.abs(x - lastMotionX);\n        final int yDiff = (int) Math.abs(y - lastMotionY);\n\n        final int touchSlop = this.touchSlop;\n        boolean xMoved = xDiff > touchSlop;\n        boolean yMoved = yDiff > touchSlop;\n\n        if (xMoved) {\n            touchState = TOUCH_STATE_SCROLLING_X;\n            lastMotionX = x;\n            lastMotionY = y;\n        }\n\n        if (yMoved) {\n            touchState = TOUCH_STATE_SCROLLING_Y;\n            lastMotionX = x;\n            lastMotionY = y;\n        }\n    }\n\n    /**\n     * Close all opened items\n     */\n    public void closeOpenedItems() {\n        touchListener.closeOpenedItems();\n    }\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/swipelistview/SwipeListViewListener.java",
    "content": "/*\n * Copyright (C) 2013 47 Degrees, LLC\n * http://47deg.com\n * hello@47deg.com\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.marshalchen.ultimaterecyclerview.swipelistview;\n\n/**\n * Listener to get callback notifications for the SwipeListView\n */\npublic interface SwipeListViewListener {\n\n    /**\n     * Called when open animation finishes\n     * @param position of the view in the list\n     * @param toRight Open to right\n     */\n    void onOpened(int position, boolean toRight);\n\n    /**\n     * Called when close animation finishes\n     * @param position of the view in the list\n     * @param fromRight Close from right\n     */\n    void onClosed(int position, boolean fromRight);\n\n    /**\n     * Called when the list changed\n     */\n    void onListChanged();\n\n    /**\n     * Called when user is moving an item\n     * @param position of the view in the list\n     * @param x Current position X\n     */\n    void onMove(int position, float x);\n\n    /**\n     * Start open item\n     * @param position of the view in the list\n     * @param action current action\n     * @param right to right\n     */\n    void onStartOpen(int position, int action, boolean right);\n\n    /**\n     * Start close item\n     * @param position of the view in the list\n     * @param right  na\n     */\n    void onStartClose(int position, boolean right);\n\n    /**\n     * Called when user clicks on the front view\n     * @param position of the view in the list\n     */\n    void onClickFrontView(int position);\n\n    /**\n     * Called when user clicks on the back view\n     * @param position of the view in the list\n     */\n    void onClickBackView(int position);\n\n    /**\n     * Called when user dismisses items\n     * @param reverseSortedPositions Items dismissed\n     */\n    void onDismiss(int[] reverseSortedPositions);\n\n    /**\n     * Used when user want to change swipe list mode on some rows. Return SWIPE_MODE_DEFAULT\n     * if you don't want to change swipe list mode\n     * @param position position that you want to change\n     * @return type\n     */\n    int onChangeSwipeMode(int position);\n\n    /**\n     * Called when user choice item\n     * @param position of the view in the list that choice\n     * @param selected if item is selected or not\n     */\n    void onChoiceChanged(int position, boolean selected);\n\n    /**\n     * User start choice items\n     */\n    void onChoiceStarted();\n\n    /**\n     * User end choice items\n     */\n    void onChoiceEnded();\n\n    /**\n     * User is in first item of list\n     */\n    void onFirstListItem();\n\n    /**\n     * User is in last item of list\n     */\n    void onLastListItem();\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/swipelistview/SwipeListViewTouchListener.java",
    "content": "/*\n * Copyright (C) 2013 47 Degrees, LLC\n * http://47deg.com\n * hello@47deg.com\n *\n * Copyright 2012 Roman Nurik\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.marshalchen.ultimaterecyclerview.swipelistview;\n\nimport android.animation.Animator;\nimport android.animation.AnimatorListenerAdapter;\nimport android.animation.ValueAnimator;\nimport android.graphics.Rect;\nimport android.os.Handler;\nimport androidx.core.view.MotionEventCompat;\nimport androidx.core.view.ViewCompat;\nimport androidx.core.view.ViewPropertyAnimatorListener;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.util.Log;\nimport android.view.MotionEvent;\nimport android.view.VelocityTracker;\nimport android.view.View;\nimport android.view.ViewConfiguration;\nimport android.view.ViewGroup;\nimport android.widget.ListView;\n\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\n\n\n/**\n * Touch listener impl for the SwipeListView\n */\npublic class SwipeListViewTouchListener implements View.OnTouchListener {\n\n    private static final int DISPLACE_CHOICE = 80;\n\n    private int swipeMode = SwipeListView.SWIPE_MODE_BOTH;\n    private boolean swipeOpenOnLongPress = true;\n    private boolean swipeClosesAllItemsWhenListMoves = true;\n\n    private int swipeFrontView = 0;\n    private int swipeBackView = 0;\n\n    private Rect rect = new Rect();\n\n    // Cached ViewConfiguration and system-wide constant values\n    private int slop;\n    private int minFlingVelocity;\n    private int maxFlingVelocity;\n    private long configShortAnimationTime;\n    private long animationTime;\n\n    private float leftOffset = 0;\n    private float rightOffset = 0;\n\n    private int swipeDrawableChecked = 0;\n    private int swipeDrawableUnchecked = 0;\n\n    private boolean onlyOneOpenedWhenSwipe = false;\n\n    private LinearLayoutManager mLayoutManager;\n\n    // Fixed properties\n    private SwipeListView swipeListView;\n    private int viewWidth = 1; // 1 and not 0 to prevent dividing by zero\n\n    private List<PendingDismissData> pendingDismisses = new ArrayList<PendingDismissData>();\n    private int dismissAnimationRefCount = 0;\n\n    private float downX;\n    private boolean swiping;\n    private boolean swipingRight;\n    private VelocityTracker velocityTracker;\n    private int downPosition;\n    private View parentView;\n    private View frontView;\n    private View backView;\n    private boolean paused;\n\n    private int swipeCurrentAction = SwipeListView.SWIPE_ACTION_NONE;\n\n    private int swipeActionLeft = SwipeListView.SWIPE_ACTION_REVEAL;\n    private int swipeActionRight = SwipeListView.SWIPE_ACTION_REVEAL;\n\n    private List<Boolean> opened = new ArrayList<Boolean>();\n    private List<Boolean> openedRight = new ArrayList<Boolean>();\n    private boolean listViewMoving;\n    private List<Boolean> checked = new ArrayList<Boolean>();\n    private int oldSwipeActionRight;\n    private int oldSwipeActionLeft;\n\n    /**\n     * Constructor\n     *\n     * @param swipeListView  SwipeListView\n     * @param swipeFrontView front view Identifier\n     * @param swipeBackView  back view Identifier\n     */\n    public SwipeListViewTouchListener(SwipeListView swipeListView, int swipeFrontView, int swipeBackView) {\n        this.swipeFrontView = swipeFrontView;\n        this.swipeBackView = swipeBackView;\n        ViewConfiguration vc = ViewConfiguration.get(swipeListView.getContext());\n        slop = vc.getScaledTouchSlop();\n        minFlingVelocity = vc.getScaledMinimumFlingVelocity();\n        maxFlingVelocity = vc.getScaledMaximumFlingVelocity();\n        configShortAnimationTime = swipeListView.getContext().getResources().getInteger(android.R.integer.config_shortAnimTime);\n        animationTime = configShortAnimationTime;\n        this.swipeListView = swipeListView;\n    }\n\n    /**\n     * Sets current item's parent view\n     *\n     * @param parentView Parent view\n     */\n    private void setParentView(View parentView) {\n        this.parentView = parentView;\n    }\n\n    public void setLayoutManager(LinearLayoutManager layoutManager) {\n\n        mLayoutManager = layoutManager;\n    }\n\n    /**\n     * Sets current item's front view\n     *\n     * @param frontView Front view\n     */\n    private void setFrontView(View frontView, final int childPosition) {\n        this.frontView = frontView;\n        frontView.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                swipeListView.onClickFrontView(downPosition);\n            }\n        });\n\n        frontView.setOnLongClickListener(new View.OnLongClickListener() {\n            @Override\n            public boolean onLongClick(View v) {\n                if (swipeOpenOnLongPress) {\n                    if (downPosition >= 0) {\n                        openAnimate(childPosition);\n                    }\n                } else {\n                    swapChoiceState(childPosition);\n                }\n                return false;\n            }\n\n        });\n    }\n\n    /**\n     * Set current item's back view\n     *\n     * @param backView\n     */\n    private void setBackView(View backView) {\n        this.backView = backView;\n        backView.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                swipeListView.onClickBackView(downPosition);\n            }\n        });\n    }\n\n    public void setOnlyOneOpenedWhenSwipe(boolean onlyOneOpenedWhenSwipe) {\n\n        this.onlyOneOpenedWhenSwipe = onlyOneOpenedWhenSwipe;\n    }\n\n    /**\n     * @return true if the list is in motion\n     */\n    public boolean isListViewMoving() {\n        return listViewMoving;\n    }\n\n    /**\n     * Sets animation time when the user drops the cell\n     *\n     * @param animationTime milliseconds\n     */\n    public void setAnimationTime(long animationTime) {\n        if (animationTime > 0) {\n            this.animationTime = animationTime;\n        } else {\n            this.animationTime = configShortAnimationTime;\n        }\n    }\n\n    /**\n     * Sets the right offset\n     *\n     * @param rightOffset Offset\n     */\n    public void setRightOffset(float rightOffset) {\n        this.rightOffset = rightOffset;\n    }\n\n    /**\n     * Set the left offset\n     *\n     * @param leftOffset Offset\n     */\n    public void setLeftOffset(float leftOffset) {\n        this.leftOffset = leftOffset;\n    }\n\n    /**\n     * Set if all item opened will be close when the user move ListView\n     *\n     * @param swipeClosesAllItemsWhenListMoves na\n     */\n    public void setSwipeClosesAllItemsWhenListMoves(boolean swipeClosesAllItemsWhenListMoves) {\n        this.swipeClosesAllItemsWhenListMoves = swipeClosesAllItemsWhenListMoves;\n    }\n\n    /**\n     * Set if the user can open an item with long press on cell\n     *\n     * @param swipeOpenOnLongPress na\n     */\n    public void setSwipeOpenOnLongPress(boolean swipeOpenOnLongPress) {\n        this.swipeOpenOnLongPress = swipeOpenOnLongPress;\n    }\n\n    /**\n     * Sets the swipe mode\n     *\n     * @param swipeMode na\n     */\n    public void setSwipeMode(int swipeMode) {\n        this.swipeMode = swipeMode;\n    }\n\n    /**\n     * Check is swiping is enabled\n     *\n     * @return na\n     */\n    protected boolean isSwipeEnabled() {\n        return swipeMode != SwipeListView.SWIPE_MODE_NONE;\n    }\n\n    /**\n     * Return action on left\n     *\n     * @return Action\n     */\n    public int getSwipeActionLeft() {\n        return swipeActionLeft;\n    }\n\n    /**\n     * Set action on left\n     *\n     * @param swipeActionLeft Action\n     */\n    public void setSwipeActionLeft(int swipeActionLeft) {\n        this.swipeActionLeft = swipeActionLeft;\n    }\n\n    /**\n     * Return action on right\n     *\n     * @return Action\n     */\n    public int getSwipeActionRight() {\n        return swipeActionRight;\n    }\n\n    /**\n     * Set action on right\n     *\n     * @param swipeActionRight Action\n     */\n    public void setSwipeActionRight(int swipeActionRight) {\n        this.swipeActionRight = swipeActionRight;\n    }\n\n    /**\n     * Set drawable checked (only SWIPE_ACTION_CHOICE)\n     *\n     * @param swipeDrawableChecked drawable\n     */\n    protected void setSwipeDrawableChecked(int swipeDrawableChecked) {\n        this.swipeDrawableChecked = swipeDrawableChecked;\n    }\n\n    /**\n     * Set drawable unchecked (only SWIPE_ACTION_CHOICE)\n     *\n     * @param swipeDrawableUnchecked drawable\n     */\n    protected void setSwipeDrawableUnchecked(int swipeDrawableUnchecked) {\n        this.swipeDrawableUnchecked = swipeDrawableUnchecked;\n    }\n\n    /**\n     * Adds new items when adapter is modified\n     */\n    public void resetItems() {\n        if (swipeListView.getAdapter() != null) {\n            int count = swipeListView.getAdapter().getItemCount();\n            for (int i = opened.size(); i <= count; i++) {\n                opened.add(false);\n                openedRight.add(false);\n                checked.add(false);\n            }\n        }\n    }\n\n    /**\n     * Open item\n     *\n     * @param position Position of list\n     */\n    protected void openAnimate(int position) {\n        final View child = swipeListView.getChildAt(position - mLayoutManager.findFirstVisibleItemPosition()).findViewById(swipeFrontView);\n\n        if (child != null) {\n            openAnimate(child, position);\n        }\n    }\n\n    /**\n     * Close item\n     *\n     * @param position Position of list\n     */\n    protected void closeAnimate(int position) {\n        if (swipeListView != null) {\n            int firstVisibleChildPosition = mLayoutManager.findFirstVisibleItemPosition();\n            final View childContainer = swipeListView.getChildAt(position - firstVisibleChildPosition);\n            if (childContainer != null) {\n                final View child = childContainer.findViewById(swipeFrontView);\n\n                if (child != null) {\n                    closeAnimate(child, position);\n                }\n            }\n        }\n    }\n\n    /**\n     * Swap choice state in item\n     *\n     * @param position position of list\n     */\n    private void swapChoiceState(int position) {\n        int lastCount = getCountSelected();\n        boolean lastChecked = checked.get(position);\n        checked.set(position, !lastChecked);\n        int count = lastChecked ? lastCount - 1 : lastCount + 1;\n        if (lastCount == 0 && count == 1) {\n            swipeListView.onChoiceStarted();\n            closeOpenedItems();\n            setActionsTo(SwipeListView.SWIPE_ACTION_CHOICE);\n        }\n        if (lastCount == 1 && count == 0) {\n            swipeListView.onChoiceEnded();\n            returnOldActions();\n        }\n//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {\n//            swipeListView.setItemChecked(position, !lastChecked);\n//        }\n        swipeListView.onChoiceChanged(position, !lastChecked);\n        reloadChoiceStateInView(frontView, position);\n    }\n\n    /**\n     * Unselected choice state in item\n     */\n    protected void unselectedChoiceStates() {\n        int start = mLayoutManager.findFirstVisibleItemPosition();\n        int end = mLayoutManager.findLastVisibleItemPosition();\n        for (int i = 0; i < checked.size(); i++) {\n            if (checked.get(i) && i >= start && i <= end) {\n                reloadChoiceStateInView(swipeListView.getChildAt(i - start).findViewById(swipeFrontView), i);\n            }\n            checked.set(i, false);\n        }\n        swipeListView.onChoiceEnded();\n        returnOldActions();\n    }\n\n    /**\n     * Dismiss an item.\n     *\n     * @param position is the position of the item to delete.\n     * @return 0 if the item is not visible. Otherwise return the height of the cell to dismiss.\n     */\n    protected int dismiss(int position) {\n        opened.remove(position);\n        checked.remove(position);\n        int start = mLayoutManager.findFirstVisibleItemPosition();\n        int end = mLayoutManager.findLastVisibleItemPosition();\n        View view = swipeListView.getChildAt(position - start);\n        ++dismissAnimationRefCount;\n        if (position >= start && position <= end) {\n            performDismiss(view, position, false);\n            return view.getHeight();\n        } else {\n            pendingDismisses.add(new PendingDismissData(position, null));\n            return 0;\n        }\n    }\n\n    /**\n     * Draw cell for display if item is selected or not\n     *\n     * @param frontView view to draw\n     * @param position  position in list\n     */\n    protected void reloadChoiceStateInView(View frontView, int position) {\n        if (isChecked(position)) {\n            if (swipeDrawableChecked > 0) frontView.setBackgroundResource(swipeDrawableChecked);\n        } else {\n            if (swipeDrawableUnchecked > 0) frontView.setBackgroundResource(swipeDrawableUnchecked);\n        }\n    }\n\n    /**\n     * Reset the state of front view when the it's recycled by ListView\n     *\n     * @param frontView view to re-draw\n     * @param position  na\n     */\n    protected void reloadSwipeStateInView(View frontView, int position) {\n        if (!opened.get(position)) {\n            ViewCompat.setTranslationX(frontView, 0.0f);\n        } else {\n            if (openedRight.get(position)) {\n                ViewCompat.setTranslationX(frontView, swipeListView.getWidth());\n            } else {\n                ViewCompat.setTranslationX(frontView, -swipeListView.getWidth());\n            }\n        }\n\n    }\n\n    /**\n     * Get if item is selected\n     *\n     * @param position position in list\n     * @return na\n     */\n    protected boolean isChecked(int position) {\n        return position < checked.size() && checked.get(position);\n    }\n\n    /**\n     * Count selected\n     *\n     * @return na\n     */\n    protected int getCountSelected() {\n        int count = 0;\n        for (int i = 0; i < checked.size(); i++) {\n            if (checked.get(i)) {\n                count++;\n            }\n        }\n        if (SwipeListView.DEBUG) {\n            Log.d(SwipeListView.TAG, \"selected: \" + count);\n        }\n        return count;\n    }\n\n    /**\n     * Get positions selected\n     *\n     * @return na\n     */\n    protected List<Integer> getPositionsSelected() {\n        List<Integer> list = new ArrayList<Integer>();\n        for (int i = 0; i < checked.size(); i++) {\n            if (checked.get(i)) {\n                list.add(i);\n            }\n        }\n        return list;\n    }\n\n    /**\n     * Open item\n     *\n     * @param view     affected view\n     * @param position Position of list\n     */\n    private void openAnimate(View view, int position) {\n        if (!opened.get(position)) {\n            generateRevealAnimate(view, true, false, position);\n        }\n    }\n\n    /**\n     * Close item\n     *\n     * @param view     affected view\n     * @param position Position of list\n     */\n    private void closeAnimate(View view, int position) {\n        if (opened.get(position)) {\n            generateRevealAnimate(view, true, false, position);\n        }\n    }\n\n    /**\n     * Create animation\n     *\n     * @param view      affected view\n     * @param swap      If state should change. If \"false\" returns to the original position\n     * @param swapRight If swap is true, this parameter tells if move is to the right or left\n     * @param position  Position of list\n     */\n    private void generateAnimate(final View view, final boolean swap, final boolean swapRight, final int position) {\n        if (SwipeListView.DEBUG) {\n            Log.d(SwipeListView.TAG, \"swap: \" + swap + \" - swapRight: \" + swapRight + \" - position: \" + position);\n        }\n        if (swipeCurrentAction == SwipeListView.SWIPE_ACTION_REVEAL) {\n            generateRevealAnimate(view, swap, swapRight, position);\n        }\n        if (swipeCurrentAction == SwipeListView.SWIPE_ACTION_DISMISS) {\n            generateDismissAnimate(parentView, swap, swapRight, position);\n        }\n        if (swipeCurrentAction == SwipeListView.SWIPE_ACTION_CHOICE) {\n            generateChoiceAnimate(view, position);\n        }\n    }\n\n    /**\n     * Create choice animation\n     *\n     * @param view     affected view\n     * @param position list position\n     */\n    private void generateChoiceAnimate(final View view, final int position) {\n        ViewCompat.animate(view)\n                .translationX(0)\n                .setDuration(animationTime)\n              /*  .setListener(new AnimatorListenerAdapter() {\n                    @Override\n                    public void onAnimationEnd(Animator animation) {\n                        swipeListView.resetScrolling();\n                        resetCell();\n                    }\n                });*/\n                .setListener(new defaultAnimation() {\n                    @Override\n                    public void onAnimationEnd(View view) {\n                        swipeListView.resetScrolling();\n                        resetCell();\n                    }\n                });\n    }\n\n    /**\n     * Create dismiss animation\n     *\n     * @param view      affected view\n     * @param swap      If will change state. If is \"false\" returns to the original position\n     * @param swapRight If swap is true, this parameter tells if move is to the right or left\n     * @param position  Position of list\n     */\n    private void generateDismissAnimate(final View view, final boolean swap, final boolean swapRight, final int position) {\n        int moveTo = 0;\n        if (opened.get(position)) {\n            if (!swap) {\n                moveTo = openedRight.get(position) ? (int) (viewWidth - rightOffset) : (int) (-viewWidth + leftOffset);\n            }\n        } else {\n            if (swap) {\n                moveTo = swapRight ? (int) (viewWidth - rightOffset) : (int) (-viewWidth + leftOffset);\n            }\n        }\n\n        int alpha = 1;\n        if (swap) {\n            ++dismissAnimationRefCount;\n            alpha = 0;\n        }\n\n        ViewCompat.animate(view)\n                .translationX(moveTo)\n                .alpha(alpha)\n                .setDuration(animationTime)\n                /*.setListener(new AnimatorListenerAdapter() {\n                    @Override\n                    public void onAnimationEnd(Animator animation) {\n                        if (swap) {\n                            closeOpenedItems();\n                            performDismiss(view, position, true);\n                        }\n                        resetCell();\n                    }\n                });*/\n                .setListener(new defaultAnimation() {\n\n\n                    @Override\n                    public void onAnimationEnd(View view) {\n                        if (swap) {\n                            closeOpenedItems();\n                            performDismiss(view, position, true);\n                        }\n                        resetCell();\n                    }\n\n\n                });\n\n    }\n\n    /**\n     * Create reveal animation\n     *\n     * @param view      affected view\n     * @param swap      If will change state. If \"false\" returns to the original position\n     * @param swapRight If swap is true, this parameter tells if movement is toward right or left\n     * @param position  list position\n     */\n    private void generateRevealAnimate(final View view, final boolean swap, final boolean swapRight, final int position) {\n        int moveTo = 0;\n        if (opened.get(position)) {\n            if (!swap) {\n                moveTo = openedRight.get(position) ? (int) (viewWidth - rightOffset) : (int) (-viewWidth + leftOffset);\n            }\n        } else {\n            if (swap) {\n                moveTo = swapRight ? (int) (viewWidth - rightOffset) : (int) (-viewWidth + leftOffset);\n            }\n        }\n\n        final boolean aux = !opened.get(position);\n        if (onlyOneOpenedWhenSwipe) {\n            if (swap) {\n                opened.set(position, aux);\n                openedRight.set(position, swapRight);\n            }\n        }\n\n        ViewCompat.animate(view)\n                .translationX(moveTo)\n                .setDuration(animationTime)\n                .setListener(new defaultAnimation() {\n                    @Override\n                    public void onAnimationEnd(View view) {\n                        swipeListView.resetScrolling();\n                        if (swap) {\n                            if (onlyOneOpenedWhenSwipe) {\n                                if (aux) {\n                                    swipeListView.onOpened(position, swapRight);\n                                } else {\n                                    swipeListView.onClosed(position, openedRight.get(position));\n                                }\n                            } else {\n\n                            }\n                            opened.set(position, aux);\n                            if (aux) {\n                                swipeListView.onOpened(position, swapRight);\n                                openedRight.set(position, swapRight);\n                            } else {\n                                swipeListView.onClosed(position, openedRight.get(position));\n                            }\n                        }\n\n\n                        if (!onlyOneOpenedWhenSwipe)\n\n                        {\n                            resetCell();\n                        }\n\n                    }\n\n                });\n\n\n    }\n\n    private void resetCell() {\n        if (downPosition != ListView.INVALID_POSITION) {\n            if (swipeCurrentAction == SwipeListView.SWIPE_ACTION_CHOICE) {\n                backView.setVisibility(View.VISIBLE);\n            }\n            frontView.setClickable(opened.get(downPosition));\n            frontView.setLongClickable(opened.get(downPosition));\n            frontView = null;\n            backView = null;\n            downPosition = ListView.INVALID_POSITION;\n        }\n    }\n\n    /**\n     * Set enabled\n     *\n     * @param enabled na\n     */\n    public void setEnabled(boolean enabled) {\n        paused = !enabled;\n    }\n\n    /**\n     * Return ScrollListener for ListView\n     *\n     * @return OnScrollListener\n     */\n    public RecyclerView.OnScrollListener makeScrollListener() {\n        return new RecyclerView.OnScrollListener() {\n\n            private boolean isFirstItem = false;\n            private boolean isLastItem = false;\n\n            @Override\n            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {\n                setEnabled(newState != recyclerView.SCROLL_STATE_DRAGGING);\n                if (swipeClosesAllItemsWhenListMoves && newState == recyclerView.SCROLL_STATE_DRAGGING) {\n                    closeOpenedItems();\n                }\n                if (newState == recyclerView.SCROLL_STATE_DRAGGING) {\n                    listViewMoving = true;\n                    setEnabled(false);\n                }\n                if (newState != recyclerView.SCROLL_STATE_SETTLING && newState != recyclerView.SCROLL_STATE_DRAGGING) {\n                    listViewMoving = false;\n                    downPosition = ListView.INVALID_POSITION;\n                    swipeListView.resetScrolling();\n                    new Handler().postDelayed(new Runnable() {\n                        public void run() {\n                            setEnabled(true);\n                        }\n                    }, 500);\n                }\n            }\n\n            @Override\n            public void onScrolled(RecyclerView view, int dx, int dy) {\n//                if (isFirstItem) {\n//                    boolean onSecondItemList = firstVisibleItem == 1;\n//                    if (onSecondItemList) {\n//                        isFirstItem = false;\n//                    }\n//                } else {\n//                    boolean onFirstItemList = firstVisibleItem == 0;\n//                    if (onFirstItemList)\n//                        isFirstItem = true;\n//                        swipeListView.onFirstListItem();\n//                    }\n//                }\n//                if (isLastItem) {\n//                    boolean onBeforeLastItemList = firstVisibleItem + visibleItemCount == totalItemCount - 1;\n//                    if (onBeforeLastItemList) {\n//                        isLastItem = false;\n//                    }\n//                } else {\n//                    boolean onLastItemList = firstVisibleItem + visibleItemCount >= totalItemCount;\n//                    if (onLastItemList) {\n//                        isLastItem = true;\n//                        swipeListView.onLastListItem();\n//                    }\n//                }\n            }\n        };\n    }\n\n    /**\n     * Close all opened items\n     */\n    void closeOpenedItems() {\n        if (opened != null) {\n            int start = mLayoutManager.findFirstVisibleItemPosition();\n            int end = mLayoutManager.findLastVisibleItemPosition();\n            for (int i = start; i <= end; i++) {\n                if (opened.get(i)) {\n                    closeAnimate(swipeListView.getChildAt(i - start).findViewById(swipeFrontView), i);\n                }\n            }\n        }\n\n    }\n\n    /**\n     * @see View.OnTouchListener#onTouch(View, MotionEvent)\n     */\n    @Override\n    public boolean onTouch(View view, MotionEvent motionEvent) {\n        if (!isSwipeEnabled()) {\n            return false;\n        }\n\n        if (viewWidth < 2) {\n            viewWidth = swipeListView.getWidth();\n        }\n\n        switch (MotionEventCompat.getActionMasked(motionEvent)) {\n            case MotionEvent.ACTION_DOWN: {\n                if (paused && downPosition != ListView.INVALID_POSITION) {\n                    return false;\n                }\n                swipeCurrentAction = SwipeListView.SWIPE_ACTION_NONE;\n\n                int childCount = swipeListView.getChildCount();\n                int[] listViewCoords = new int[2];\n                swipeListView.getLocationOnScreen(listViewCoords);\n                int x = (int) motionEvent.getRawX() - listViewCoords[0];\n                int y = (int) motionEvent.getRawY() - listViewCoords[1];\n                View child;\n                for (int i = 0; i < childCount; i++) {\n                    child = swipeListView.getChildAt(i);\n                    child.getHitRect(rect);\n\n                    int childPosition = swipeListView.getChildPosition(child);\n\n                    // dont allow swiping if this is on the header or footer or IGNORE_ITEM_VIEW_TYPE or enabled is false on the adapter\n                    //boolean allowSwipe = swipeListView.getAdapter().isEnabled(childPosition) && swipeListView.getAdapter().getItemViewType(childPosition) >= 0;\n\n                    boolean allowSwipe = true;\n\n                    if (allowSwipe && rect.contains(x, y)) {\n                        setParentView(child);\n                        setFrontView(child.findViewById(swipeFrontView), childPosition);\n\n                        downX = motionEvent.getRawX();\n                        downPosition = childPosition;\n\n                        frontView.setClickable(!opened.get(downPosition));\n                        frontView.setLongClickable(!opened.get(downPosition));\n\n                        velocityTracker = VelocityTracker.obtain();\n                        velocityTracker.addMovement(motionEvent);\n                        if (swipeBackView > 0) {\n                            setBackView(child.findViewById(swipeBackView));\n                        }\n                        break;\n                    }\n                }\n                view.onTouchEvent(motionEvent);\n                return true;\n            }\n\n            case MotionEvent.ACTION_UP: {\n                if (velocityTracker == null || !swiping || downPosition == ListView.INVALID_POSITION) {\n                    break;\n                }\n\n                float deltaX = motionEvent.getRawX() - downX;\n                velocityTracker.addMovement(motionEvent);\n                velocityTracker.computeCurrentVelocity(1000);\n                float velocityX = Math.abs(velocityTracker.getXVelocity());\n                if (!opened.get(downPosition)) {\n                    if (swipeMode == SwipeListView.SWIPE_MODE_LEFT && velocityTracker.getXVelocity() > 0) {\n                        velocityX = 0;\n                    }\n                    if (swipeMode == SwipeListView.SWIPE_MODE_RIGHT && velocityTracker.getXVelocity() < 0) {\n                        velocityX = 0;\n                    }\n                }\n                float velocityY = Math.abs(velocityTracker.getYVelocity());\n                boolean swap = false;\n                boolean swapRight = false;\n                if (minFlingVelocity <= velocityX && velocityX <= maxFlingVelocity && velocityY * 2 < velocityX) {\n                    swapRight = velocityTracker.getXVelocity() > 0;\n                    if (SwipeListView.DEBUG) {\n                        Log.d(SwipeListView.TAG, \"swapRight: \" + swapRight + \" - swipingRight: \" + swipingRight);\n                    }\n                    if (swapRight != swipingRight && swipeActionLeft != swipeActionRight) {\n                        swap = false;\n                    } else if (opened.get(downPosition) && openedRight.get(downPosition) && swapRight) {\n                        swap = false;\n                    } else if (opened.get(downPosition) && !openedRight.get(downPosition) && !swapRight) {\n                        swap = false;\n                    } else {\n                        swap = true;\n                    }\n                } else if (Math.abs(deltaX) > viewWidth / 2) {\n                    swap = true;\n                    swapRight = deltaX > 0;\n                }\n\n\n                generateAnimate(frontView, swap, swapRight, downPosition);\n                if (swipeCurrentAction == SwipeListView.SWIPE_ACTION_CHOICE) {\n                    swapChoiceState(downPosition);\n                }\n\n                velocityTracker.recycle();\n                velocityTracker = null;\n                downX = 0;\n                // change clickable front view\n//                if (swap) {\n//                    frontView.setClickable(opened.get(downPosition));\n//                    frontView.setLongClickable(opened.get(downPosition));\n//                }\n                swiping = false;\n                break;\n            }\n\n            case MotionEvent.ACTION_MOVE: {\n                if (velocityTracker == null || paused || downPosition == ListView.INVALID_POSITION) {\n                    break;\n                }\n\n                velocityTracker.addMovement(motionEvent);\n                velocityTracker.computeCurrentVelocity(1000);\n                float velocityX = Math.abs(velocityTracker.getXVelocity());\n                float velocityY = Math.abs(velocityTracker.getYVelocity());\n\n                float deltaX = motionEvent.getRawX() - downX;\n                float deltaMode = Math.abs(deltaX);\n\n                int swipeMode = this.swipeMode;\n                int changeSwipeMode = swipeListView.changeSwipeMode(downPosition);\n                if (changeSwipeMode >= 0) {\n                    swipeMode = changeSwipeMode;\n                }\n\n                if (swipeMode == SwipeListView.SWIPE_MODE_NONE) {\n                    deltaMode = 0;\n                } else if (swipeMode != SwipeListView.SWIPE_MODE_BOTH) {\n                    if (opened.get(downPosition)) {\n                        if (swipeMode == SwipeListView.SWIPE_MODE_LEFT && deltaX < 0) {\n                            deltaMode = 0;\n                        } else if (swipeMode == SwipeListView.SWIPE_MODE_RIGHT && deltaX > 0) {\n                            deltaMode = 0;\n                        }\n                    } else {\n                        if (swipeMode == SwipeListView.SWIPE_MODE_LEFT && deltaX > 0) {\n                            deltaMode = 0;\n                        } else if (swipeMode == SwipeListView.SWIPE_MODE_RIGHT && deltaX < 0) {\n                            deltaMode = 0;\n                        }\n                    }\n                }\n                if (deltaMode > slop && swipeCurrentAction == SwipeListView.SWIPE_ACTION_NONE && velocityY < velocityX) {\n                    swiping = true;\n                    swipingRight = (deltaX > 0);\n                    if (SwipeListView.DEBUG) {\n                        Log.d(SwipeListView.TAG, \"deltaX: \" + deltaX + \" - swipingRight: \" + swipingRight);\n                    }\n                    if (opened.get(downPosition)) {\n                        swipeListView.onStartClose(downPosition, swipingRight);\n                        swipeCurrentAction = SwipeListView.SWIPE_ACTION_REVEAL;\n                    } else {\n                        if (swipingRight && swipeActionRight == SwipeListView.SWIPE_ACTION_DISMISS) {\n                            swipeCurrentAction = SwipeListView.SWIPE_ACTION_DISMISS;\n                        } else if (!swipingRight && swipeActionLeft == SwipeListView.SWIPE_ACTION_DISMISS) {\n                            swipeCurrentAction = SwipeListView.SWIPE_ACTION_DISMISS;\n                        } else if (swipingRight && swipeActionRight == SwipeListView.SWIPE_ACTION_CHOICE) {\n                            swipeCurrentAction = SwipeListView.SWIPE_ACTION_CHOICE;\n                        } else if (!swipingRight && swipeActionLeft == SwipeListView.SWIPE_ACTION_CHOICE) {\n                            swipeCurrentAction = SwipeListView.SWIPE_ACTION_CHOICE;\n                        } else {\n                            swipeCurrentAction = SwipeListView.SWIPE_ACTION_REVEAL;\n                        }\n                        swipeListView.onStartOpen(downPosition, swipeCurrentAction, swipingRight);\n                    }\n                    swipeListView.requestDisallowInterceptTouchEvent(true);\n                    MotionEvent cancelEvent = MotionEvent.obtain(motionEvent);\n                    cancelEvent.setAction(MotionEvent.ACTION_CANCEL |\n                            (MotionEventCompat.getActionIndex(motionEvent) << MotionEventCompat.ACTION_POINTER_INDEX_SHIFT));\n                    swipeListView.onTouchEvent(cancelEvent);\n                    if (swipeCurrentAction == SwipeListView.SWIPE_ACTION_CHOICE) {\n                        backView.setVisibility(View.GONE);\n                    }\n                }\n\n                if (swiping && downPosition != ListView.INVALID_POSITION) {\n                    if (opened.get(downPosition)) {\n                        deltaX += openedRight.get(downPosition) ? viewWidth - rightOffset : -viewWidth + leftOffset;\n                    }\n                    move(deltaX);\n                    return true;\n                }\n                break;\n            }\n        }\n\n        if (onlyOneOpenedWhenSwipe) {\n            closeOtherOpenedItems();\n            view.onTouchEvent(motionEvent);\n            return true;\n        }\n        return false;\n    }\n\n    private void closeOtherOpenedItems() {\n        if (opened != null && downPosition != SwipeListView.NO_POSITION) {\n            int start = mLayoutManager.findFirstVisibleItemPosition();\n            int end = mLayoutManager.findLastVisibleItemPosition();\n            for (int i = start; i <= end; i++) {\n                if (opened.get(i) && i != downPosition) {\n                    closeAnimate(swipeListView.getChildAt(i - start).findViewById(swipeFrontView), i);\n                }\n            }\n        }\n    }\n\n    private void setActionsTo(int action) {\n        oldSwipeActionRight = swipeActionRight;\n        oldSwipeActionLeft = swipeActionLeft;\n        swipeActionRight = action;\n        swipeActionLeft = action;\n    }\n\n    protected void returnOldActions() {\n        swipeActionRight = oldSwipeActionRight;\n        swipeActionLeft = oldSwipeActionLeft;\n    }\n\n    /**\n     * Moves the view\n     *\n     * @param deltaX delta\n     */\n    public void move(float deltaX) {\n        swipeListView.onMove(downPosition, deltaX);\n        float posX = ViewCompat.getX(frontView);\n        if (opened.get(downPosition)) {\n            posX += openedRight.get(downPosition) ? -viewWidth + rightOffset : viewWidth - leftOffset;\n        }\n        if (posX > 0 && !swipingRight) {\n            if (SwipeListView.DEBUG) {\n                Log.d(SwipeListView.TAG, \"change to right\");\n            }\n            swipingRight = !swipingRight;\n            swipeCurrentAction = swipeActionRight;\n            if (swipeCurrentAction == SwipeListView.SWIPE_ACTION_CHOICE) {\n                backView.setVisibility(View.GONE);\n            } else {\n                backView.setVisibility(View.VISIBLE);\n            }\n        }\n        if (posX < 0 && swipingRight) {\n            if (SwipeListView.DEBUG) {\n                Log.d(SwipeListView.TAG, \"change to left\");\n            }\n            swipingRight = !swipingRight;\n            swipeCurrentAction = swipeActionLeft;\n            if (swipeCurrentAction == SwipeListView.SWIPE_ACTION_CHOICE) {\n                backView.setVisibility(View.GONE);\n            } else {\n                backView.setVisibility(View.VISIBLE);\n            }\n        }\n        if (swipeCurrentAction == SwipeListView.SWIPE_ACTION_DISMISS) {\n            ViewCompat.setTranslationX(parentView, deltaX);\n            ViewCompat.setAlpha(parentView, Math.max(0f, Math.min(1f,\n                    1f - 2f * Math.abs(deltaX) / viewWidth)));\n        } else if (swipeCurrentAction == SwipeListView.SWIPE_ACTION_CHOICE) {\n            if ((swipingRight && deltaX > 0 && posX < DISPLACE_CHOICE)\n                    || (!swipingRight && deltaX < 0 && posX > -DISPLACE_CHOICE)\n                    || (swipingRight && deltaX < DISPLACE_CHOICE)\n                    || (!swipingRight && deltaX > -DISPLACE_CHOICE)) {\n                ViewCompat.setTranslationX(frontView, deltaX);\n            }\n        } else {\n            ViewCompat.setTranslationX(frontView, deltaX);\n        }\n    }\n\n    /**\n     * Class that saves pending dismiss data\n     */\n    class PendingDismissData implements Comparable<PendingDismissData> {\n        public int position;\n        public View view;\n\n        public PendingDismissData(int position, View view) {\n            this.position = position;\n            this.view = view;\n        }\n\n        @Override\n        public int compareTo(PendingDismissData other) {\n            // Sort by descending position\n            return other.position - position;\n        }\n\n    }\n\n    /**\n     * Perform dismiss action\n     *\n     * @param dismissView      View\n     * @param dismissPosition  Position of list\n     * @param doPendingDismiss na\n     */\n    protected void performDismiss(final View dismissView, final int dismissPosition, boolean doPendingDismiss) {\n        enableDisableViewGroup((ViewGroup) dismissView, false);\n        final ViewGroup.LayoutParams lp = dismissView.getLayoutParams();\n        final int originalHeight = dismissView.getHeight();\n\n        ValueAnimator animator = ValueAnimator.ofInt(originalHeight, 1).setDuration(animationTime);\n\n        if (doPendingDismiss) {\n            animator.addListener(new AnimatorListenerAdapter() {\n                @Override\n                public void onAnimationEnd(Animator animation) {\n                    --dismissAnimationRefCount;\n                    if (dismissAnimationRefCount == 0) {\n                        removePendingDismisses(originalHeight);\n                    }\n                }\n            });\n        }\n\n        animator.addListener(new AnimatorListenerAdapter() {\n            @Override\n            public void onAnimationEnd(Animator animation) {\n                enableDisableViewGroup((ViewGroup) dismissView, true);\n            }\n        });\n\n        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator valueAnimator) {\n                lp.height = (Integer) valueAnimator.getAnimatedValue();\n                dismissView.setLayoutParams(lp);\n            }\n        });\n\n        pendingDismisses.add(new PendingDismissData(dismissPosition, dismissView));\n        animator.start();\n    }\n\n    /**\n     * Remove all pending dismisses.\n     */\n    protected void resetPendingDismisses() {\n        pendingDismisses.clear();\n    }\n\n    /**\n     * Will call {@link #removePendingDismisses(int)} in animationTime + 100 ms.\n     *\n     * @param originalHeight will be used to rest the cells height.\n     */\n    protected void handlerPendingDismisses(final int originalHeight) {\n        Handler handler = new Handler();\n        handler.postDelayed(new Runnable() {\n            @Override\n            public void run() {\n                removePendingDismisses(originalHeight);\n            }\n        }, animationTime + 100);\n    }\n\n    /**\n     * Will delete all pending dismisses.\n     * Will call callback onDismiss for all pending dismisses.\n     * Will reset all cell height to originalHeight.\n     *\n     * @param originalHeight is the height of the cell before animation.\n     */\n    private void removePendingDismisses(int originalHeight) {\n        // No active animations, process all pending dismisses.\n        // Sort by descending position\n        Collections.sort(pendingDismisses);\n\n        int[] dismissPositions = new int[pendingDismisses.size()];\n        for (int i = pendingDismisses.size() - 1; i >= 0; i--) {\n            dismissPositions[i] = pendingDismisses.get(i).position;\n        }\n        swipeListView.onDismiss(dismissPositions);\n\n        ViewGroup.LayoutParams lp;\n        for (PendingDismissData pendingDismiss : pendingDismisses) {\n            // Reset view presentation\n            if (pendingDismiss.view != null) {\n                ViewCompat.setAlpha(pendingDismiss.view, 1f);\n                ViewCompat.setTranslationX(pendingDismiss.view, 0);\n                lp = pendingDismiss.view.getLayoutParams();\n                lp.height = originalHeight;\n                pendingDismiss.view.setLayoutParams(lp);\n            }\n        }\n\n        resetPendingDismisses();\n\n    }\n\n    public static void enableDisableViewGroup(ViewGroup viewGroup, boolean enabled) {\n        int childCount = viewGroup.getChildCount();\n        for (int i = 0; i < childCount; i++) {\n            View view = viewGroup.getChildAt(i);\n            view.setEnabled(enabled);\n            if (view instanceof ViewGroup) {\n                enableDisableViewGroup((ViewGroup) view, enabled);\n            }\n        }\n    }\n\n\n    private class defaultAnimation implements ViewPropertyAnimatorListener\n\n\n    {\n        @Override\n        public void onAnimationStart(View view) {\n\n        }\n\n        @Override\n        public void onAnimationEnd(View view) {\n\n        }\n\n        @Override\n        public void onAnimationCancel(View view) {\n\n        }\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/ui/AdGoogleDisplaySupport.java",
    "content": "package com.marshalchen.ultimaterecyclerview.ui;\n\nimport android.app.Activity;\nimport androidx.core.view.ViewCompat;\nimport android.util.DisplayMetrics;\nimport android.view.ViewGroup;\nimport android.widget.RelativeLayout;\n\n/**\n * The final solution hack for quick adaption on Google Admob display defects\n * Created by hesk on 5/8/15.\n * Self developed by Heskeyo Kam 2015\n */\npublic class AdGoogleDisplaySupport {\n    public static final int BANNER = 101;\n    public static final int FULL_BANNER = 102;\n    public static final int LARGE_BANNER = 103;\n    public static final int LEADERBOARD = 104;\n    public static final int MEDIUM_RECTANGLE = 105;\n    public static final int WIDE_SKYSCRAPER = 106;\n\n    public static RelativeLayout initialSupport(Activity activity, DisplayMetrics dm) {\n        activity.getWindowManager().getDefaultDisplay().getMetrics(dm);\n        final RelativeLayout layout = new RelativeLayout(activity);\n        return layout;\n    }\n\n    public static <ad extends ViewGroup> void panelAdjust(ad view, final int height_pixel, int AdType) {\n        panelAdjustApply(view, height_pixel);\n    }\n\n    public static <ad extends ViewGroup> void panelAdjust(ad view, final int height_pixel) {\n        panelAdjustApply(view, height_pixel);\n    }\n\n    private static <ad extends ViewGroup> void panelAdjustApply(ad view, final int height_pixel) {\n        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, height_pixel);\n        params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);\n        params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);\n        params.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);\n        params.addRule(RelativeLayout.ALIGN_BOTTOM, RelativeLayout.TRUE);\n        params.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);\n        view.setLayoutParams(params);\n    }\n\n    public static double ratioMatching(DisplayMetrics Dm) {\n        switch (Dm.densityDpi) {\n            case 320:\n                return 1.2d;\n            default:\n                return 1.2d;\n        }\n    }\n\n    public static int defaultHeight(DisplayMetrics Dm) {\n        return defaultHeightApply(Dm, MEDIUM_RECTANGLE);\n    }\n\n    public static int defaultHeight(DisplayMetrics Dm, int type) {\n        return defaultHeightApply(Dm, type);\n    }\n\n    private static int defaultHeightApply(DisplayMetrics Dm, int type) {\n        if (type == MEDIUM_RECTANGLE) {\n            switch (Dm.widthPixels) {\n                case 1080:\n                    return 600;\n                case 720:\n                    return 400;\n                default:\n                    return 500;\n            }\n        }\n        if (type == BANNER) {\n            switch (Dm.widthPixels) {\n                case 1080:\n                    return 100;\n                case 720:\n                    return 80;\n                default:\n                    return 80;\n            }\n        }\n\n\n        return 100;\n    }\n\n    public static <T extends ViewGroup> void scale(T view, double scaleRatio) {\n        ViewCompat.setScaleX(view, (float) scaleRatio);\n        ViewCompat.setScaleY(view, (float) scaleRatio);\n    }\n\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/ui/AnimationType.java",
    "content": "package com.marshalchen.ultimaterecyclerview.ui;\n\n\nimport android.view.animation.OvershootInterpolator;\n\nimport jp.wasabeef.recyclerview.animators.BaseItemAnimator;\nimport jp.wasabeef.recyclerview.animators.FadeInAnimator;\nimport jp.wasabeef.recyclerview.animators.FadeInDownAnimator;\nimport jp.wasabeef.recyclerview.animators.FadeInLeftAnimator;\nimport jp.wasabeef.recyclerview.animators.FadeInRightAnimator;\nimport jp.wasabeef.recyclerview.animators.FadeInUpAnimator;\nimport jp.wasabeef.recyclerview.animators.FlipInBottomXAnimator;\nimport jp.wasabeef.recyclerview.animators.FlipInLeftYAnimator;\nimport jp.wasabeef.recyclerview.animators.FlipInRightYAnimator;\nimport jp.wasabeef.recyclerview.animators.FlipInTopXAnimator;\nimport jp.wasabeef.recyclerview.animators.LandingAnimator;\nimport jp.wasabeef.recyclerview.animators.OvershootInLeftAnimator;\nimport jp.wasabeef.recyclerview.animators.OvershootInRightAnimator;\nimport jp.wasabeef.recyclerview.animators.ScaleInAnimator;\nimport jp.wasabeef.recyclerview.animators.ScaleInBottomAnimator;\nimport jp.wasabeef.recyclerview.animators.ScaleInLeftAnimator;\nimport jp.wasabeef.recyclerview.animators.ScaleInRightAnimator;\nimport jp.wasabeef.recyclerview.animators.ScaleInTopAnimator;\nimport jp.wasabeef.recyclerview.animators.SlideInDownAnimator;\nimport jp.wasabeef.recyclerview.animators.SlideInLeftAnimator;\nimport jp.wasabeef.recyclerview.animators.SlideInRightAnimator;\nimport jp.wasabeef.recyclerview.animators.SlideInUpAnimator;\n\n/**\n * https://github.com/wasabeef/recyclerview-animators/blob/master/example/src/main/java/jp/wasabeef/example/recyclerview/AnimatorSampleActivity.java\n * Created by zJJ on 2/19/2016.\n */\npublic enum AnimationType {\n\n    FadeIn(new FadeInAnimator(new OvershootInterpolator(1f))),\n    FadeInDown(new FadeInDownAnimator(new OvershootInterpolator(1f))),\n    FadeInUp(new FadeInUpAnimator(new OvershootInterpolator(1f))),\n    FadeInLeft(new FadeInLeftAnimator(new OvershootInterpolator(1f))),\n    FadeInRight(new FadeInRightAnimator(new OvershootInterpolator(1f))),\n    Landing(new LandingAnimator(new OvershootInterpolator(1f))),\n    ScaleIn(new ScaleInAnimator(new OvershootInterpolator(1f))),\n    ScaleInTop(new ScaleInTopAnimator(new OvershootInterpolator(1f))),\n    ScaleInBottom(new ScaleInBottomAnimator(new OvershootInterpolator(1f))),\n    ScaleInLeft(new ScaleInLeftAnimator(new OvershootInterpolator(1f))),\n    ScaleInRight(new ScaleInRightAnimator(new OvershootInterpolator(1f))),\n    FlipInTopX(new FlipInTopXAnimator(new OvershootInterpolator(1f))),\n    FlipInBottomX(new FlipInBottomXAnimator(new OvershootInterpolator(1f))),\n    FlipInLeftY(new FlipInLeftYAnimator(new OvershootInterpolator(1f))),\n    FlipInRightY(new FlipInRightYAnimator(new OvershootInterpolator(1f))),\n    SlideInLeft(new SlideInLeftAnimator(new OvershootInterpolator(1f))),\n    SlideInRight(new SlideInRightAnimator(new OvershootInterpolator(1f))),\n    SlideInDown(new SlideInDownAnimator(new OvershootInterpolator(1f))),\n    SlideInUp(new SlideInUpAnimator(new OvershootInterpolator(1f))),\n    OvershootInRight(new OvershootInRightAnimator(1.0f)),\n    OvershootInLeft(new OvershootInLeftAnimator(1.0f));\n\n    private BaseItemAnimator mAnimator;\n\n    AnimationType(BaseItemAnimator animator) {\n        mAnimator = animator;\n    }\n\n    public BaseItemAnimator getAnimator() {\n        return mAnimator;\n\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/ui/CustomPtr.java",
    "content": "package com.marshalchen.ultimaterecyclerview.ui;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\n\nimport in.srain.cube.views.ptr.PtrFrameLayout;\n\n/**\n * Created by cym on 15/3/21.\n */\npublic class CustomPtr extends PtrFrameLayout {\n    public CustomPtr(Context context) {\n        super(context);\n    }\n\n    public CustomPtr(Context context, AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    public CustomPtr(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n    }\n\n    @Override\n    public boolean dispatchTouchEvent(MotionEvent e) {\n        return dispatchTouchEventSupper(e);\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/ui/DividerItemDecoration.java",
    "content": "package com.marshalchen.ultimaterecyclerview.ui;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.Canvas;\nimport android.graphics.Rect;\nimport android.graphics.drawable.Drawable;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.View;\n\n/**\n * Created by cym on 15-1-27.\n */\npublic class DividerItemDecoration extends RecyclerView.ItemDecoration{\n    private static final int[] ATTRS = new int[]{\n            android.R.attr.listDivider\n    };\n\n    public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;\n\n    public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;\n\n    private Drawable mDivider;\n\n    private int mOrientation;\n\n    public DividerItemDecoration(Context context, int orientation) {\n        final TypedArray a = context.obtainStyledAttributes(ATTRS);\n        mDivider = a.getDrawable(0);\n        a.recycle();\n        setOrientation(orientation);\n    }\n\n    public void setOrientation(int orientation) {\n        if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {\n            throw new IllegalArgumentException(\"invalid orientation\");\n        }\n        mOrientation = orientation;\n    }\n\n    @Override\n    public void onDraw(Canvas c, RecyclerView parent) {\n        if (mOrientation == VERTICAL_LIST) {\n            drawVertical(c, parent);\n        } else {\n            drawHorizontal(c, parent);\n        }\n    }\n\n    public void drawVertical(Canvas c, RecyclerView parent) {\n        final int left = parent.getPaddingLeft();\n        final int right = parent.getWidth() - parent.getPaddingRight();\n\n        final int childCount = parent.getChildCount();\n        for (int i = 0; i < childCount; i++) {\n            final View child = parent.getChildAt(i);\n            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child\n                    .getLayoutParams();\n            final int top = child.getBottom() + params.bottomMargin;\n            final int bottom = top + mDivider.getIntrinsicHeight();\n            mDivider.setBounds(left, top, right, bottom);\n            mDivider.draw(c);\n        }\n    }\n\n    public void drawHorizontal(Canvas c, RecyclerView parent) {\n        final int top = parent.getPaddingTop();\n        final int bottom = parent.getHeight() - parent.getPaddingBottom();\n\n        final int childCount = parent.getChildCount();\n        for (int i = 0; i < childCount; i++) {\n            final View child = parent.getChildAt(i);\n            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child\n                    .getLayoutParams();\n            final int left = child.getRight() + params.rightMargin;\n            final int right = left + mDivider.getIntrinsicHeight();\n            mDivider.setBounds(left, top, right, bottom);\n            mDivider.draw(c);\n        }\n    }\n\n    @Override\n    public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {\n        if (mOrientation == VERTICAL_LIST) {\n            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());\n        } else {\n            outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);\n        }\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/ui/VerticalSwipeRefreshLayout.java",
    "content": "package com.marshalchen.ultimaterecyclerview.ui;\n\nimport android.content.Context;\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\nimport android.view.ViewConfiguration;\n\n\npublic class VerticalSwipeRefreshLayout extends SwipeRefreshLayout {\n\n    private int mTouchSlop;\n    private float mPrevX;\n\n    public VerticalSwipeRefreshLayout(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();\n    }\n\n    @Override\n    public boolean onInterceptTouchEvent(MotionEvent event) {\n\n        switch (event.getAction()) {\n            case MotionEvent.ACTION_DOWN:\n                mPrevX = MotionEvent.obtain(event).getX();\n                break;\n\n            case MotionEvent.ACTION_MOVE:\n                final float eventX = event.getX();\n                float xDiff = Math.abs(eventX - mPrevX);\n                //   Logs.d(\"move----\" + eventX + \"   \" + mPrevX + \"   \" + mTouchSlop);\n                if (xDiff > mTouchSlop) {\n                    return false;\n                }\n        }\n\n        return super.onInterceptTouchEvent(event);\n    }\n\n    @Override\n    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        super.onMeasure(widthMeasureSpec, heightMeasureSpec);\n//        setMeasuredDimension(getMeasuredWidth(), getMeasuredHeight());\n    }\n\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/ui/divideritemdecoration/FlexibleDividerDecoration.java",
    "content": "package com.marshalchen.ultimaterecyclerview.ui.divideritemdecoration;\n\nimport android.content.Context;\nimport android.content.res.Resources;\nimport android.content.res.TypedArray;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.Rect;\nimport android.graphics.drawable.Drawable;\nimport androidx.annotation.ColorRes;\nimport androidx.annotation.DimenRes;\nimport androidx.annotation.DrawableRes;\nimport androidx.core.view.ViewCompat;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.View;\n\n/**\n * Created by yqritc on 2015/01/08.\n */\npublic abstract class FlexibleDividerDecoration extends RecyclerView.ItemDecoration {\n\n    private static final int DEFAULT_SIZE = 2;\n    private static final int[] ATTRS = new int[]{\n            android.R.attr.listDivider\n    };\n\n    protected enum DividerType {\n        DRAWABLE, PAINT, COLOR\n    }\n\n    protected DividerType mDividerType = DividerType.DRAWABLE;\n    protected VisibilityProvider mVisibilityProvider;\n    protected PaintProvider mPaintProvider;\n    protected ColorProvider mColorProvider;\n    protected DrawableProvider mDrawableProvider;\n    protected SizeProvider mSizeProvider;\n    protected boolean mShowLastDivider;\n    private Paint mPaint;\n\n    protected FlexibleDividerDecoration(Builder builder) {\n        if (builder.mPaintProvider != null) {\n            mDividerType = DividerType.PAINT;\n            mPaintProvider = builder.mPaintProvider;\n        } else if (builder.mColorProvider != null) {\n            mDividerType = DividerType.COLOR;\n            mColorProvider = builder.mColorProvider;\n            mPaint = new Paint();\n            setSizeProvider(builder);\n        } else {\n            mDividerType = DividerType.DRAWABLE;\n            if (builder.mDrawableProvider == null) {\n                TypedArray a = builder.mContext.obtainStyledAttributes(ATTRS);\n                final Drawable divider = a.getDrawable(0);\n                a.recycle();\n                mDrawableProvider = new DrawableProvider() {\n                    @Override\n                    public Drawable drawableProvider(int position, RecyclerView parent) {\n                        return divider;\n                    }\n                };\n            } else {\n                mDrawableProvider = builder.mDrawableProvider;\n            }\n            mSizeProvider = builder.mSizeProvider;\n        }\n\n        mVisibilityProvider = builder.mVisibilityProvider;\n        mShowLastDivider = builder.mShowLastDivider;\n    }\n\n    private void setSizeProvider(Builder builder) {\n        mSizeProvider = builder.mSizeProvider;\n        if (mSizeProvider == null) {\n            mSizeProvider = new SizeProvider() {\n                @Override\n                public int dividerSize(int position, RecyclerView parent) {\n                    return DEFAULT_SIZE;\n                }\n            };\n        }\n    }\n\n    @Override\n    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {\n        int lastChildPosition = -1;\n        int childCount = mShowLastDivider ? parent.getChildCount() : parent.getChildCount() - 1;\n        for (int i = 0; i < childCount; i++) {\n            View child = parent.getChildAt(i);\n            int childPosition = parent.getChildAdapterPosition(child);\n\n            if (childPosition < lastChildPosition) {\n                // Avoid remaining divider when animation starts\n                continue;\n            }\n            lastChildPosition = childPosition;\n\n            if (ViewCompat.getAlpha(child) < 1) {\n                // Avoid remaining divider when animation starts\n                continue;\n            }\n\n            if (mVisibilityProvider.shouldHideDivider(childPosition, parent)) {\n                continue;\n            }\n\n            Rect bounds = getDividerBound(childPosition, parent, child);\n            switch (mDividerType) {\n                case DRAWABLE:\n                    Drawable drawable = mDrawableProvider.drawableProvider(childPosition, parent);\n                    drawable.setBounds(bounds);\n                    drawable.draw(c);\n                    break;\n                case PAINT:\n                    mPaint = mPaintProvider.dividerPaint(childPosition, parent);\n                    c.drawLine(bounds.left, bounds.top, bounds.right, bounds.bottom, mPaint);\n                    break;\n                case COLOR:\n                    mPaint.setColor(mColorProvider.dividerColor(childPosition, parent));\n                    mPaint.setStrokeWidth(mSizeProvider.dividerSize(childPosition, parent));\n                    c.drawLine(bounds.left, bounds.top, bounds.right, bounds.bottom, mPaint);\n                    break;\n            }\n        }\n    }\n\n    @Override\n    public void getItemOffsets(Rect rect, View v, RecyclerView parent, RecyclerView.State state) {\n        int position = parent.getChildAdapterPosition(v);\n        setItemOffsets(rect, position, parent);\n    }\n\n    protected abstract Rect getDividerBound(int position, RecyclerView parent, View child);\n\n    protected abstract void setItemOffsets(Rect outRect, int position, RecyclerView parent);\n\n    /**\n     * Interface for controlling divider visibility\n     */\n    public interface VisibilityProvider {\n\n        /**\n         * Returns true if divider should be hidden.\n         *\n         * @param position Divider position\n         * @param parent   RecyclerView\n         * @return True if the divider at position should be hidden\n         */\n        boolean shouldHideDivider(int position, RecyclerView parent);\n    }\n\n    /**\n     * Interface for controlling paint instance for divider drawing\n     */\n    public interface PaintProvider {\n\n        /**\n         * Returns {@link Paint} for divider\n         *\n         * @param position Divider position\n         * @param parent   RecyclerView\n         * @return Paint instance\n         */\n        Paint dividerPaint(int position, RecyclerView parent);\n    }\n\n    /**\n     * Interface for controlling divider color\n     */\n    public interface ColorProvider {\n\n        /**\n         * Returns {@link android.graphics.Color} value of divider\n         *\n         * @param position Divider position\n         * @param parent   RecyclerView\n         * @return Color value\n         */\n        int dividerColor(int position, RecyclerView parent);\n    }\n\n    /**\n     * Interface for controlling drawable object for divider drawing\n     */\n    public interface DrawableProvider {\n\n        /**\n         * Returns drawable instance for divider\n         *\n         * @param position Divider position\n         * @param parent   RecyclerView\n         * @return Drawable instance\n         */\n        Drawable drawableProvider(int position, RecyclerView parent);\n    }\n\n    /**\n     * Interface for controlling divider size\n     */\n    public interface SizeProvider {\n\n        /**\n         * Returns size value of divider.\n         * Height for horizontal divider, width for vertical divider\n         *\n         * @param position Divider position\n         * @param parent   RecyclerView\n         * @return Size of divider\n         */\n        int dividerSize(int position, RecyclerView parent);\n    }\n\n    public static class Builder<T extends Builder> {\n\n        private Context mContext;\n        protected Resources mResources;\n        private PaintProvider mPaintProvider;\n        private ColorProvider mColorProvider;\n        private DrawableProvider mDrawableProvider;\n        private SizeProvider mSizeProvider;\n        private VisibilityProvider mVisibilityProvider = new VisibilityProvider() {\n            @Override\n            public boolean shouldHideDivider(int position, RecyclerView parent) {\n                return false;\n            }\n        };\n        private boolean mShowLastDivider = false;\n\n        public Builder(Context context) {\n            mContext = context;\n            mResources = context.getResources();\n        }\n\n        public T paint(final Paint paint) {\n            return paintProvider(new PaintProvider() {\n                @Override\n                public Paint dividerPaint(int position, RecyclerView parent) {\n                    return paint;\n                }\n            });\n        }\n\n        public T paintProvider(PaintProvider provider) {\n            mPaintProvider = provider;\n            return (T) this;\n        }\n\n        public T color(final int color) {\n            return colorProvider(new ColorProvider() {\n                @Override\n                public int dividerColor(int position, RecyclerView parent) {\n                    return color;\n                }\n            });\n        }\n\n        public T colorResId(@ColorRes int colorId) {\n            return color(mResources.getColor(colorId));\n        }\n\n        public T colorProvider(ColorProvider provider) {\n            mColorProvider = provider;\n            return (T) this;\n        }\n\n        public T drawable(@DrawableRes int id) {\n            return drawable(mResources.getDrawable(id));\n        }\n\n        public T drawable(final Drawable drawable) {\n            return drawableProvider(new DrawableProvider() {\n                @Override\n                public Drawable drawableProvider(int position, RecyclerView parent) {\n                    return drawable;\n                }\n            });\n        }\n\n        public T drawableProvider(DrawableProvider provider) {\n            mDrawableProvider = provider;\n            return (T) this;\n        }\n\n        public T size(final int size) {\n            return sizeProvider(new SizeProvider() {\n                @Override\n                public int dividerSize(int position, RecyclerView parent) {\n                    return size;\n                }\n            });\n        }\n\n        public T sizeResId(@DimenRes int sizeId) {\n            return size(mResources.getDimensionPixelSize(sizeId));\n        }\n\n        public T sizeProvider(SizeProvider provider) {\n            mSizeProvider = provider;\n            return (T) this;\n        }\n\n        public T visibilityProvider(VisibilityProvider provider) {\n            mVisibilityProvider = provider;\n            return (T) this;\n        }\n\n        public T showLastDivider() {\n            mShowLastDivider = true;\n            return (T) this;\n        }\n\n        protected void checkBuilderParams() {\n            if (mPaintProvider != null) {\n                if (mColorProvider != null) {\n                    throw new IllegalArgumentException(\n                            \"Use setColor method of Paint class to specify line color. Do not provider ColorProvider if you set PaintProvider.\");\n                }\n                if (mSizeProvider != null) {\n                    throw new IllegalArgumentException(\n                            \"Use setStrokeWidth method of Paint class to specify line size. Do not provider SizeProvider if you set PaintProvider.\");\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/ui/divideritemdecoration/HorizontalDividerItemDecoration.java",
    "content": "package com.marshalchen.ultimaterecyclerview.ui.divideritemdecoration;\n\nimport android.content.Context;\nimport android.graphics.Rect;\nimport android.graphics.drawable.Drawable;\nimport androidx.annotation.DimenRes;\nimport androidx.core.view.ViewCompat;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.View;\n\n/**\n * Created by yqritc on 2015/01/15.\n */\npublic class HorizontalDividerItemDecoration extends FlexibleDividerDecoration {\n\n    private MarginProvider mMarginProvider;\n\n    protected HorizontalDividerItemDecoration(Builder builder) {\n        super(builder);\n        mMarginProvider = builder.mMarginProvider;\n    }\n\n    @Override\n    protected Rect getDividerBound(int position, RecyclerView parent, View child) {\n        Rect bounds = new Rect(0, 0, 0, 0);\n        int transitionX = (int) ViewCompat.getTranslationX(child);\n        int transitionY = (int) ViewCompat.getTranslationY(child);\n        RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();\n        bounds.left = parent.getPaddingLeft() +\n                mMarginProvider.dividerLeftMargin(position, parent) + transitionX;\n        bounds.right = parent.getWidth() - parent.getPaddingRight() -\n                mMarginProvider.dividerRightMargin(position, parent) + transitionX;\n\n        int dividerSize = getDividerSize(position, parent);\n        if (mDividerType == DividerType.DRAWABLE) {\n            bounds.top = child.getBottom() + params.topMargin + transitionY;\n            bounds.bottom = bounds.top + dividerSize;\n        } else {\n            bounds.top = child.getBottom() + params.topMargin + dividerSize / 2 + transitionY;\n            bounds.bottom = bounds.top;\n        }\n\n        return bounds;\n    }\n\n    @Override\n    protected void setItemOffsets(Rect outRect, int position, RecyclerView parent) {\n        outRect.set(0, 0, 0, getDividerSize(position, parent));\n    }\n\n    private int getDividerSize(int position, RecyclerView parent) {\n        if (mPaintProvider != null) {\n            return (int) mPaintProvider.dividerPaint(position, parent).getStrokeWidth();\n        } else if (mSizeProvider != null) {\n            return mSizeProvider.dividerSize(position, parent);\n        } else if (mDrawableProvider != null) {\n            Drawable drawable = mDrawableProvider.drawableProvider(position, parent);\n            return drawable.getIntrinsicHeight();\n        }\n        throw new RuntimeException(\"failed to get size\");\n    }\n\n    /**\n     * Interface for controlling divider margin\n     */\n    public interface MarginProvider {\n\n        /**\n         * Returns left margin of divider.\n         *\n         * @param position Divider position\n         * @param parent   RecyclerView\n         * @return left margin\n         */\n        int dividerLeftMargin(int position, RecyclerView parent);\n\n        /**\n         * Returns right margin of divider.\n         *\n         * @param position Divider position\n         * @param parent   RecyclerView\n         * @return right margin\n         */\n        int dividerRightMargin(int position, RecyclerView parent);\n    }\n\n    public static class Builder extends FlexibleDividerDecoration.Builder<Builder> {\n\n        private MarginProvider mMarginProvider = new MarginProvider() {\n            @Override\n            public int dividerLeftMargin(int position, RecyclerView parent) {\n                return 0;\n            }\n\n            @Override\n            public int dividerRightMargin(int position, RecyclerView parent) {\n                return 0;\n            }\n        };\n\n        public Builder(Context context) {\n            super(context);\n        }\n\n        public Builder margin(final int leftMargin, final int rightMargin) {\n            return marginProvider(new MarginProvider() {\n                @Override\n                public int dividerLeftMargin(int position, RecyclerView parent) {\n                    return leftMargin;\n                }\n\n                @Override\n                public int dividerRightMargin(int position, RecyclerView parent) {\n                    return rightMargin;\n                }\n            });\n        }\n\n        public Builder margin(int horizontalMargin) {\n            return margin(horizontalMargin, horizontalMargin);\n        }\n\n        public Builder marginResId(@DimenRes int leftMarginId, @DimenRes int rightMarginId) {\n            return margin(mResources.getDimensionPixelSize(leftMarginId),\n                    mResources.getDimensionPixelSize(rightMarginId));\n        }\n\n        public Builder marginResId(@DimenRes int horizontalMarginId) {\n            return marginResId(horizontalMarginId, horizontalMarginId);\n        }\n\n        public Builder marginProvider(MarginProvider provider) {\n            mMarginProvider = provider;\n            return this;\n        }\n\n        public HorizontalDividerItemDecoration build() {\n            checkBuilderParams();\n            return new HorizontalDividerItemDecoration(this);\n        }\n    }\n}"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/ui/divideritemdecoration/VerticalDividerItemDecoration.java",
    "content": "package com.marshalchen.ultimaterecyclerview.ui.divideritemdecoration;\n\nimport android.content.Context;\nimport android.graphics.Rect;\nimport android.graphics.drawable.Drawable;\nimport androidx.annotation.DimenRes;\nimport androidx.core.view.ViewCompat;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.View;\n\n/**\n * Created by yqritc on 2015/01/15.\n */\npublic class VerticalDividerItemDecoration extends FlexibleDividerDecoration {\n\n    private MarginProvider mMarginProvider;\n\n    protected VerticalDividerItemDecoration(Builder builder) {\n        super(builder);\n        mMarginProvider = builder.mMarginProvider;\n    }\n\n    @Override\n    protected Rect getDividerBound(int position, RecyclerView parent, View child) {\n        Rect bounds = new Rect(0, 0, 0, 0);\n        int transitionX = (int) ViewCompat.getTranslationX(child);\n        int transitionY = (int) ViewCompat.getTranslationY(child);\n        RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();\n        bounds.top = parent.getPaddingTop() +\n                mMarginProvider.dividerTopMargin(position, parent) + transitionY;\n        bounds.bottom = parent.getHeight() - parent.getPaddingBottom() -\n                mMarginProvider.dividerBottomMargin(position, parent) + transitionY;\n\n        int dividerSize = getDividerSize(position, parent);\n        if (mDividerType == DividerType.DRAWABLE) {\n            bounds.left = child.getRight() + params.leftMargin + transitionX;\n            bounds.right = bounds.left + dividerSize;\n        } else {\n            bounds.left = child.getRight() + params.leftMargin + dividerSize / 2 + transitionX;\n            bounds.right = bounds.left;\n        }\n\n        return bounds;\n    }\n\n    @Override\n    protected void setItemOffsets(Rect outRect, int position, RecyclerView parent) {\n        outRect.set(0, 0, getDividerSize(position, parent), 0);\n    }\n\n    private int getDividerSize(int position, RecyclerView parent) {\n        if (mPaintProvider != null) {\n            return (int) mPaintProvider.dividerPaint(position, parent).getStrokeWidth();\n        } else if (mSizeProvider != null) {\n            return mSizeProvider.dividerSize(position, parent);\n        } else if (mDrawableProvider != null) {\n            Drawable drawable = mDrawableProvider.drawableProvider(position, parent);\n            return drawable.getIntrinsicWidth();\n        }\n        throw new RuntimeException(\"failed to get size\");\n    }\n\n    /**\n     * Interface for controlling divider margin\n     */\n    public interface MarginProvider {\n\n        /**\n         * Returns top margin of divider.\n         *\n         * @param position Divider position\n         * @param parent   RecyclerView\n         * @return top margin\n         */\n        int dividerTopMargin(int position, RecyclerView parent);\n\n        /**\n         * Returns bottom margin of divider.\n         *\n         * @param position Divider position\n         * @param parent   RecyclerView\n         * @return bottom margin\n         */\n        int dividerBottomMargin(int position, RecyclerView parent);\n    }\n\n    public static class Builder extends FlexibleDividerDecoration.Builder<Builder> {\n\n        private MarginProvider mMarginProvider = new MarginProvider() {\n            @Override\n            public int dividerTopMargin(int position, RecyclerView parent) {\n                return 0;\n            }\n\n            @Override\n            public int dividerBottomMargin(int position, RecyclerView parent) {\n                return 0;\n            }\n        };\n\n        public Builder(Context context) {\n            super(context);\n        }\n\n        public Builder margin(final int topMargin, final int bottomMargin) {\n            return marginProvider(new MarginProvider() {\n                @Override\n                public int dividerTopMargin(int position, RecyclerView parent) {\n                    return topMargin;\n                }\n\n                @Override\n                public int dividerBottomMargin(int position, RecyclerView parent) {\n                    return bottomMargin;\n                }\n            });\n        }\n\n        public Builder margin(int verticalMargin) {\n            return margin(verticalMargin, verticalMargin);\n        }\n\n        public Builder marginResId(@DimenRes int topMarginId, @DimenRes int bottomMarginId) {\n            return margin(mResources.getDimensionPixelSize(topMarginId),\n                    mResources.getDimensionPixelSize(bottomMarginId));\n        }\n\n        public Builder marginResId(@DimenRes int verticalMarginId) {\n            return marginResId(verticalMarginId, verticalMarginId);\n        }\n\n        public Builder marginProvider(MarginProvider provider) {\n            mMarginProvider = provider;\n            return this;\n        }\n\n        public VerticalDividerItemDecoration build() {\n            checkBuilderParams();\n            return new VerticalDividerItemDecoration(this);\n        }\n    }\n}"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/ui/emptyview/emptyViewOnShownListener.java",
    "content": "package com.marshalchen.ultimaterecyclerview.ui.emptyview;\n\nimport android.view.View;\n\n/**\n * Created by zJJ on 2/19/2016.\n */\npublic interface emptyViewOnShownListener {\n    void onEmptyViewShow(final View mView);\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/ui/floatingactionbutton/AddFloatingActionButton.java",
    "content": "package com.marshalchen.ultimaterecyclerview.ui.floatingactionbutton;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.Paint.Style;\nimport android.graphics.drawable.Drawable;\nimport android.graphics.drawable.ShapeDrawable;\nimport android.graphics.drawable.shapes.Shape;\nimport android.util.AttributeSet;\n\nimport com.marshalchen.ultimaterecyclerview.R;\n\n\npublic class AddFloatingActionButton extends FloatingActionButton {\n    protected int mPlusColor;\n\n    public AddFloatingActionButton(Context context) {\n        this(context, null);\n    }\n\n    public AddFloatingActionButton(Context context, AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    public AddFloatingActionButton(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n    }\n\n    @Override\n    protected void init(Context context, AttributeSet attributeSet) {\n        if (attributeSet != null) {\n            TypedArray attr = context.obtainStyledAttributes(attributeSet, R.styleable.AddFloatingActionButton, 0, 0);\n            if (attr != null) {\n                try {\n                    mPlusColor = attr.getColor(R.styleable.AddFloatingActionButton_plusIconColor, getColor(android.R.color.white));\n                } finally {\n                    attr.recycle();\n                }\n            }\n        } else {\n            mPlusColor = getColor(android.R.color.white);\n        }\n\n        super.init(context, attributeSet);\n    }\n\n    /**\n     * generate the PLUS sign\n     *\n     * @return the drawable product\n     */\n    @Override\n    protected Drawable getIconDrawable() {\n        final float iconSize = getDimension(R.dimen.fab_icon_size);\n        final float iconHalfSize = iconSize / 2f;\n\n        final float plusSize = getDimension(R.dimen.fab_plus_icon_size);\n        final float plusHalfStroke = getDimension(R.dimen.fab_plus_icon_stroke) / 2f;\n        final float plusOffset = (iconSize - plusSize) / 2f;\n\n        final Shape shape = new Shape() {\n            @Override\n            public void draw(Canvas canvas, Paint paint) {\n                canvas.drawRect(plusOffset, iconHalfSize - plusHalfStroke, iconSize - plusOffset, iconHalfSize + plusHalfStroke, paint);\n                canvas.drawRect(iconHalfSize - plusHalfStroke, plusOffset, iconHalfSize + plusHalfStroke, iconSize - plusOffset, paint);\n            }\n        };\n\n        ShapeDrawable drawable = new ShapeDrawable(shape);\n\n        final Paint paint = drawable.getPaint();\n        paint.setColor(mPlusColor);\n        paint.setStyle(Style.FILL);\n        paint.setAntiAlias(true);\n\n        return drawable;\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/ui/floatingactionbutton/FloatingActionButton.java",
    "content": "package com.marshalchen.ultimaterecyclerview.ui.floatingactionbutton;\n\nimport android.animation.ObjectAnimator;\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.Bitmap;\nimport android.graphics.Bitmap.Config;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.LinearGradient;\nimport android.graphics.Paint;\nimport android.graphics.Paint.Style;\nimport android.graphics.Point;\nimport android.graphics.RectF;\nimport android.graphics.Shader.TileMode;\nimport android.graphics.drawable.BitmapDrawable;\nimport android.graphics.drawable.ColorDrawable;\nimport android.graphics.drawable.Drawable;\nimport android.graphics.drawable.LayerDrawable;\nimport android.graphics.drawable.StateListDrawable;\nimport android.os.Build;\nimport android.os.Build.VERSION_CODES;\nimport androidx.annotation.ColorRes;\nimport androidx.annotation.DimenRes;\nimport androidx.annotation.DrawableRes;\nimport androidx.core.view.ViewCompat;\nimport android.util.AttributeSet;\nimport android.view.Display;\nimport android.view.WindowManager;\nimport android.view.animation.AccelerateDecelerateInterpolator;\nimport android.view.animation.Interpolator;\nimport android.widget.ImageButton;\n\nimport com.marshalchen.ultimaterecyclerview.R;\n\n\n\npublic class FloatingActionButton extends ImageButton {\n\n    public static final int SIZE_NORMAL = 0;\n    public static final int SIZE_NOSHADOW = 2;\n    public static final int SIZE_MINI = 1;\n\n    private static final int HALF_TRANSPARENT_WHITE = Color.argb(128, 255, 255, 255);\n    private static final int HALF_TRANSPARENT_BLACK = Color.argb(128, 0, 0, 0);\n    private final Interpolator mInterpolator = new AccelerateDecelerateInterpolator();\n    protected int mColorNormal;\n    protected int mColorPressed;\n    @DrawableRes\n    protected int mIcon;\n    protected int mSize;\n    protected float mCircleSize;\n    protected float mShadowRadius;\n    protected float mShadowOffset;\n    protected int mDrawableSize;\n    private boolean mHidden = false;\n    /**\n     * The FAB button's Y position when it is displayed.\n     */\n    private float mYDisplayed = -1;\n    /**\n     * The FAB button's Y position when it is hidden.\n     */\n    private float mYHidden = -1;\n\n    public FloatingActionButton(Context context) {\n        this(context, null);\n    }\n\n    public FloatingActionButton(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        init(context, attrs);\n    }\n\n    public FloatingActionButton(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n        init(context, attrs);\n    }\n\n    protected void init(Context context, AttributeSet attributeSet) {\n        mColorNormal = getColor(android.R.color.holo_blue_dark);\n        mColorPressed = getColor(android.R.color.holo_blue_light);\n        mIcon = 0;\n        mSize = SIZE_NORMAL;\n        if (attributeSet != null) {\n            initAttributes(context, attributeSet);\n        }\n\n        mCircleSize = getCircleSize(mSize);\n        mShadowRadius = getDimension(R.dimen.fab_shadow_radius);\n        mShadowOffset = getDimension(R.dimen.fab_shadow_offset);\n        mDrawableSize = (int) (mCircleSize + 2 * mShadowRadius);\n\n        //point size overhead\n        WindowManager mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);\n        Display display = mWindowManager.getDefaultDisplay();\n        Point size = new Point();\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {\n            display.getSize(size);\n            mYHidden = size.y;\n        } else mYHidden = display.getHeight();\n\n        updateBackground();\n    }\n\n    protected void updateBackground() {\n        float circleLeft = mShadowRadius;\n        float circleTop = mShadowRadius - mShadowOffset;\n        final RectF circleRect = new RectF(circleLeft, circleTop, circleLeft + mCircleSize, circleTop + mCircleSize);\n        final LayerDrawable layerDrawable = generateFinalDrawables(circleRect);\n        float iconOffset = (mCircleSize - getDimension(R.dimen.fab_icon_size)) / 2f;\n        int iconInsetHorizontal = (int) (mShadowRadius + iconOffset);\n        int iconInsetTop = (int) (circleTop + iconOffset);\n        int iconInsetBottom = (int) (mShadowRadius + mShadowOffset + iconOffset);\n        layerDrawable.setLayerInset(layerDrawable.getNumberOfLayers() - 1, iconInsetHorizontal, iconInsetTop, iconInsetHorizontal, iconInsetBottom);\n        setBackgroundCompat(layerDrawable);\n    }\n\n    protected int getColor(@ColorRes int id) {\n        return getResources().getColor(id);\n    }\n\n    protected float getDimension(@DimenRes int id) {\n        return getResources().getDimension(id);\n    }\n\n    protected void initAttributes(Context context, AttributeSet attributeSet) {\n        TypedArray attr = context.obtainStyledAttributes(attributeSet, R.styleable.FloatActionButton, 0, 0);\n        if (attr != null) {\n            try {\n                mColorNormal = attr.getColor(R.styleable.FloatActionButton_urv_fab_colorNormal, getColor(android.R.color.holo_blue_dark));\n                mColorPressed = attr.getColor(R.styleable.FloatActionButton_urv_fab_colorPressed, getColor(android.R.color.holo_blue_light));\n                mSize = attr.getInt(R.styleable.FloatActionButton_urv_fab_size, SIZE_NORMAL);\n                mIcon = attr.getResourceId(R.styleable.FloatActionButton_icon, 0);\n                load_extended_attributes(attr);\n            } finally {\n                attr.recycle();\n            }\n        }\n    }\n\n    protected void load_extended_attributes(TypedArray attr) {\n\n    }\n\n    @Override\n    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        super.onMeasure(widthMeasureSpec, heightMeasureSpec);\n        setMeasuredDimension(mDrawableSize, mDrawableSize);\n    }\n\n    protected float getCircleSize(int mSize) {\n        switch (mSize) {\n            case SIZE_NORMAL:\n                return getDimension(R.dimen.fab_size_normal);\n            case SIZE_MINI:\n                return getDimension(R.dimen.fab_size_mini);\n            case SIZE_NOSHADOW:\n                return getDimension(R.dimen.fab_size_normal);\n            default:\n                return getDimension(R.dimen.fab_size_normal);\n        }\n    }\n\n    @DrawableRes\n    protected int getDrawableBySize(int mSize) {\n        switch (mSize) {\n            case SIZE_NORMAL:\n                return R.drawable.urv_floating_action_button_fab_bg_normal;\n            case SIZE_MINI:\n                return R.drawable.urv_floating_action_button_fab_bg_mini;\n            case SIZE_NOSHADOW:\n                return -1;\n        }\n        return -1;\n    }\n\n    protected LayerDrawable generateFinalDrawables(RectF circleRect) {\n        if (mSize == SIZE_NOSHADOW) {\n            return new LayerDrawable(\n                    new Drawable[]{\n                            createFillDrawable(circleRect),\n                            createStrokesDrawable(circleRect),\n                            getIconDrawable()\n                    });\n        } else {\n            return new LayerDrawable(\n                    new Drawable[]{\n                            getResources().getDrawable(getDrawableBySize(mSize)),\n                            createFillDrawable(circleRect),\n                            createStrokesDrawable(circleRect),\n                            getIconDrawable()\n                    });\n        }\n    }\n\n    protected Drawable getIconDrawable() {\n        if (mIcon != 0) {\n            return getResources().getDrawable(mIcon);\n        } else {\n            return new ColorDrawable(Color.TRANSPARENT);\n        }\n    }\n\n    /**\n     * @param circleRect the defined rectangle\n     * @param alpha      between  0 - 1\n     * @return StateListDrawable\n     */\n    protected StateListDrawable createFillDrawable(RectF circleRect, float alpha) {\n        StateListDrawable drawable = new StateListDrawable();\n        drawable.addState(new int[]{android.R.attr.state_pressed}, createAlphaDrawble(circleRect, mColorPressed, alpha));\n        drawable.addState(new int[]{}, createAlphaDrawble(circleRect, mColorNormal, alpha));\n        return drawable;\n    }\n\n    /**\n     * @param circleRect the defined rectangle\n     * @return StateListDrawable\n     */\n    protected StateListDrawable createFillDrawable(RectF circleRect) {\n        StateListDrawable drawable = new StateListDrawable();\n        drawable.addState(new int[]{android.R.attr.state_pressed}, createCircleDrawable(circleRect, mColorPressed));\n        drawable.addState(new int[]{}, createCircleDrawable(circleRect, mColorNormal));\n        return drawable;\n    }\n\n    protected Drawable createCircleDrawable(RectF circleRect, int color) {\n        final Bitmap bitmap = Bitmap.createBitmap(mDrawableSize, mDrawableSize, Config.ARGB_8888);\n        final Canvas canvas = new Canvas(bitmap);\n        final Paint paint = new Paint();\n        paint.setAntiAlias(true);\n        paint.setColor(color);\n        canvas.drawOval(circleRect, paint);\n        return new BitmapDrawable(getResources(), bitmap);\n    }\n\n    protected Drawable createAlphaDrawble(RectF circleRect, int color, float alpha) {\n        final Bitmap bitmap = Bitmap.createBitmap(mDrawableSize, mDrawableSize, Config.ARGB_8888);\n        final Canvas canvas = new Canvas(bitmap);\n        final Paint paint = new Paint();\n        paint.setAntiAlias(true);\n        paint.setColor(color);\n        paint.setAlpha(opacityToAlpha(alpha));\n        canvas.drawOval(circleRect, paint);\n        return new BitmapDrawable(getResources(), bitmap);\n    }\n\n    protected int opacityToAlpha(float opacity) {\n        return (int) (255f * opacity);\n    }\n\n    protected Drawable createStrokesDrawable(RectF circleRect) {\n        final Bitmap bitmap = Bitmap.createBitmap(mDrawableSize, mDrawableSize, Config.ARGB_8888);\n        final Canvas canvas = new Canvas(bitmap);\n\n        final float strokeWidth = getDimension(R.dimen.fab_stroke_width);\n        final float halfStrokeWidth = strokeWidth / 2f;\n\n        RectF outerStrokeRect = new RectF(\n                circleRect.left - halfStrokeWidth,\n                circleRect.top - halfStrokeWidth,\n                circleRect.right + halfStrokeWidth,\n                circleRect.bottom + halfStrokeWidth\n        );\n\n        RectF innerStrokeRect = new RectF(\n                circleRect.left + halfStrokeWidth,\n                circleRect.top + halfStrokeWidth,\n                circleRect.right - halfStrokeWidth,\n                circleRect.bottom - halfStrokeWidth\n        );\n\n        final Paint paint = new Paint();\n        paint.setAntiAlias(true);\n        paint.setStrokeWidth(strokeWidth);\n        paint.setStyle(Style.STROKE);\n\n        // outer\n        paint.setColor(Color.BLACK);\n        paint.setAlpha(opacityToAlpha(0.02f));\n        canvas.drawOval(outerStrokeRect, paint);\n\n        // inner bottom\n        paint.setShader(new LinearGradient(innerStrokeRect.centerX(), innerStrokeRect.top, innerStrokeRect.centerX(), innerStrokeRect.bottom,\n                new int[]{Color.TRANSPARENT, HALF_TRANSPARENT_BLACK, Color.BLACK},\n                new float[]{0f, 0.8f, 1f},\n                TileMode.CLAMP\n        ));\n        paint.setAlpha(opacityToAlpha(0.04f));\n        canvas.drawOval(innerStrokeRect, paint);\n\n        // inner top\n        paint.setShader(new LinearGradient(innerStrokeRect.centerX(), innerStrokeRect.top, innerStrokeRect.centerX(), innerStrokeRect.bottom,\n                new int[]{Color.WHITE, HALF_TRANSPARENT_WHITE, Color.TRANSPARENT},\n                new float[]{0f, 0.2f, 1f},\n                TileMode.CLAMP\n        ));\n        paint.setAlpha(opacityToAlpha(0.8f));\n        canvas.drawOval(innerStrokeRect, paint);\n\n        return new BitmapDrawable(getResources(), bitmap);\n    }\n\n    @SuppressWarnings(\"deprecation\")\n    @SuppressLint(\"NewApi\")\n    private void setBackgroundCompat(Drawable drawable) {\n        if (Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN) {\n            setBackground(drawable);\n        } else {\n            setBackgroundDrawable(drawable);\n        }\n    }\n\n    public void hide(boolean hide) {\n        // If the hidden state is being updated\n        if (mHidden != hide) {\n\n            // Store the new hidden state\n            mHidden = hide;\n\n            // Animate the FAB to it's new Y position\n            ObjectAnimator animator = ObjectAnimator.ofFloat(this, \"translationY\", mHidden ? mYHidden - mYDisplayed : 0).setDuration(500);\n\n            animator.setInterpolator(mInterpolator);\n            animator.start();\n        }\n    }\n\n    @Override\n    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {\n        super.onLayout(changed, left, top, right, bottom);\n        if (mYDisplayed == -1) {\n            mYDisplayed =    ViewCompat.getY(this);\n        }\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/ui/floatingactionbutton/FloatingActionsMenu.java",
    "content": "package com.marshalchen.ultimaterecyclerview.ui.floatingactionbutton;\n\nimport android.animation.AnimatorSet;\nimport android.animation.ObjectAnimator;\nimport android.annotation.TargetApi;\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.Canvas;\nimport android.graphics.Point;\nimport android.graphics.drawable.Drawable;\nimport android.graphics.drawable.LayerDrawable;\nimport android.os.Build;\nimport android.os.Parcel;\nimport android.os.Parcelable;\nimport androidx.annotation.ColorRes;\nimport androidx.annotation.NonNull;\nimport androidx.core.view.ViewCompat;\nimport android.util.AttributeSet;\nimport android.view.Display;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.WindowManager;\nimport android.view.animation.AccelerateDecelerateInterpolator;\nimport android.view.animation.DecelerateInterpolator;\nimport android.view.animation.Interpolator;\nimport android.view.animation.OvershootInterpolator;\n\nimport com.marshalchen.ultimaterecyclerview.R;\n\n\npublic class FloatingActionsMenu extends ViewGroup {\n    private static final int ANIMATION_DURATION = 300;\n    private static final float COLLAPSED_PLUS_ROTATION = 0f;\n    private static final float EXPANDED_PLUS_ROTATION = 90f + 45f;\n\n    private int mAddButtonPlusColor;\n    private int mAddButtonColorNormal;\n    private int mAddButtonColorPressed;\n\n    private int mButtonSpacing;\n\n    private boolean mExpanded;\n\n    private boolean isHorizontal = false;\n    private AnimatorSet mExpandAnimation = new AnimatorSet().setDuration(ANIMATION_DURATION);\n    private AnimatorSet mCollapseAnimation = new AnimatorSet().setDuration(ANIMATION_DURATION);\n    private AddFloatingActionButton mAddButton;\n    private RotatingDrawable mRotatingDrawable;\n\n    public FloatingActionsMenu(Context context) {\n        this(context, null);\n    }\n\n    public FloatingActionsMenu(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        init(context, attrs);\n    }\n\n    public FloatingActionsMenu(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n        init(context, attrs);\n    }\n\n    private void init(Context context, AttributeSet attributeSet) {\n        mAddButtonPlusColor = getColor(android.R.color.white);\n        mAddButtonColorNormal = getColor(android.R.color.holo_blue_dark);\n        mAddButtonColorPressed = getColor(android.R.color.holo_blue_light);\n\n        mButtonSpacing = (int) (getResources().getDimension(R.dimen.fab_actions_spacing) - getResources().getDimension(R.dimen.fab_shadow_radius) - getResources().getDimension(R.dimen.fab_shadow_offset));\n\n        if (attributeSet != null) {\n            TypedArray attr = context.obtainStyledAttributes(attributeSet, R.styleable.FloatingActionsMenu, 0, 0);\n            if (attr != null) {\n                try {\n                    mAddButtonPlusColor = attr.getColor(R.styleable.FloatingActionsMenu_addButtonPlusIconColor, getColor(android.R.color.white));\n                    mAddButtonColorNormal = attr.getColor(R.styleable.FloatingActionsMenu_addButtonColorNormal, getColor(android.R.color.holo_blue_dark));\n                    mAddButtonColorPressed = attr.getColor(R.styleable.FloatingActionsMenu_addButtonColorPressed, getColor(android.R.color.holo_blue_light));\n                    isHorizontal = attr.getBoolean(R.styleable.FloatingActionsMenu_addButtonIsHorizontal, false);\n                } finally {\n                    attr.recycle();\n                }\n            }\n        }\n        WindowManager mWindowManager = (WindowManager)\n                context.getSystemService(Context.WINDOW_SERVICE);\n        Display display = mWindowManager.getDefaultDisplay();\n        Point size = new Point();\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {\n            display.getSize(size);\n            mYHidden = size.y;\n        } else mYHidden = display.getHeight();\n\n        createAddButton(context);\n    }\n\n    private static class RotatingDrawable extends LayerDrawable {\n        public RotatingDrawable(Drawable drawable) {\n            super(new Drawable[]{drawable});\n        }\n\n        private float mRotation;\n\n        @SuppressWarnings(\"UnusedDeclaration\")\n        public float getRotation() {\n            return mRotation;\n        }\n\n        @SuppressWarnings(\"UnusedDeclaration\")\n        public void setRotation(float rotation) {\n            mRotation = rotation;\n            invalidateSelf();\n        }\n\n        @Override\n        public void draw(Canvas canvas) {\n            canvas.save();\n            canvas.rotate(mRotation, getBounds().centerX(), getBounds().centerY());\n            super.draw(canvas);\n            canvas.restore();\n        }\n    }\n\n    private void createAddButton(Context context) {\n        mAddButton = new AddFloatingActionButton(context) {\n            @Override\n            protected void updateBackground() {\n                mPlusColor = mAddButtonPlusColor;\n                mColorNormal = mAddButtonColorNormal;\n                mColorPressed = mAddButtonColorPressed;\n                super.updateBackground();\n            }\n\n            @TargetApi(Build.VERSION_CODES.HONEYCOMB)\n            @Override\n            protected Drawable getIconDrawable() {\n                final RotatingDrawable rotatingDrawable = new RotatingDrawable(super.getIconDrawable());\n                mRotatingDrawable = rotatingDrawable;\n\n                final OvershootInterpolator interpolator = new OvershootInterpolator();\n\n                final ObjectAnimator collapseAnimator = ObjectAnimator.ofFloat(rotatingDrawable, \"rotation\", EXPANDED_PLUS_ROTATION, COLLAPSED_PLUS_ROTATION);\n                final ObjectAnimator expandAnimator = ObjectAnimator.ofFloat(rotatingDrawable, \"rotation\", COLLAPSED_PLUS_ROTATION, EXPANDED_PLUS_ROTATION);\n\n                collapseAnimator.setInterpolator(interpolator);\n                expandAnimator.setInterpolator(interpolator);\n\n                mExpandAnimation.play(expandAnimator);\n                mCollapseAnimation.play(collapseAnimator);\n\n                return rotatingDrawable;\n            }\n        };\n\n        mAddButton.setId(R.id.fab_expand_menu_button);\n        mAddButton.setOnClickListener(new OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                toggle();\n            }\n        });\n\n        addView(mAddButton, super.generateDefaultLayoutParams());\n    }\n\n    private int getColor(@ColorRes int id) {\n        return getResources().getColor(id);\n    }\n\n    @Override\n    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        measureChildren(widthMeasureSpec, heightMeasureSpec);\n\n        int width = 0;\n        int height = 0;\n        if (!isHorizontal) {\n            for (int i = 0; i < getChildCount(); i++) {\n                View child = getChildAt(i);\n\n                width = Math.max(width, child.getMeasuredWidth());\n                height += child.getMeasuredHeight();\n            }\n\n            height += mButtonSpacing * (getChildCount() - 1);\n            height = height * 12 / 10; // for overshoot\n\n            setMeasuredDimension(width, height);\n        } else {\n            for (int i = 0; i < getChildCount(); i++) {\n                View child = getChildAt(i);\n\n                height = Math.max(height, child.getMeasuredHeight());\n                // height += child.getMeasuredHeight();\n                width += child.getMeasuredWidth();\n            }\n            //height += mButtonSpacing * (getChildCount() - 1);\n            // height = height * 12 / 10; // for overshoot\n            width += mButtonSpacing * (getChildCount() - 1);\n            width = width * 12 / 10; // for overshoot\n\n            setMeasuredDimension(width, height);\n        }\n\n    }\n\n    @Override\n    protected void onLayout(boolean changed, int l, int t, int r, int b) {\n        int addButtonY = b - t - mAddButton.getMeasuredHeight();\n        int addButtonX = r - l - mAddButton.getMeasuredWidth();\n        if (!isHorizontal)\n            mAddButton.layout(0, addButtonY, mAddButton.getMeasuredWidth(), addButtonY + mAddButton.getMeasuredHeight());\n        else\n            mAddButton.layout(addButtonX, 0, addButtonX + mAddButton.getMeasuredWidth(), mAddButton.getMeasuredHeight());\n\n        int bottomY = addButtonY - mButtonSpacing;\n        int bottomX = addButtonX - mButtonSpacing;\n        for (int i = getChildCount() - 1; i >= 0; i--) {\n            final View child = getChildAt(i);\n\n            if (child == mAddButton) continue;\n\n            int childY = bottomY - child.getMeasuredHeight();\n            int childX = bottomX - child.getMeasuredWidth();\n            if (!isHorizontal)\n                child.layout(0, childY, child.getMeasuredWidth(), childY + child.getMeasuredHeight());\n            else {\n                child.layout(childX, 0,\n                        childX + child.getMeasuredWidth(), child.getMeasuredHeight());\n            }\n\n            if (!isHorizontal) {\n                float collapsedTranslation = addButtonY - childY;\n                float expandedTranslation = 0f;\n\n                child.setTranslationY(mExpanded ? expandedTranslation : collapsedTranslation);\n                child.setAlpha(mExpanded ? 1f : 0f);\n\n                LayoutParams params = (LayoutParams) child.getLayoutParams();\n                params.mCollapseY.setFloatValues(expandedTranslation, collapsedTranslation);\n                params.mExpandY.setFloatValues(collapsedTranslation, expandedTranslation);\n                params.setAnimationsTarget(child);\n            } else {\n                float expandedTranslation = addButtonX - childX;\n                float collapsedTranslation = 0f;\n\n                child.setTranslationX(mExpanded ? expandedTranslation : collapsedTranslation);\n                child.setAlpha(mExpanded ? 1f : 0f);\n\n                LayoutParams params = (LayoutParams) child.getLayoutParams();\n                params.mCollapseX.setFloatValues(collapsedTranslation, expandedTranslation);\n                params.mExpandX.setFloatValues(expandedTranslation, collapsedTranslation);\n                params.setAnimationsTarget(child);\n            }\n\n\n            bottomY = childY - mButtonSpacing;\n            bottomX = childX - mButtonSpacing;\n        }\n\n        if (mYDisplayed == -1) {\n            mYDisplayed = ViewCompat.getY(this);\n        }\n    }\n\n    @Override\n    protected ViewGroup.LayoutParams generateDefaultLayoutParams() {\n        return new LayoutParams(super.generateDefaultLayoutParams());\n    }\n\n    @Override\n    public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {\n        return new LayoutParams(super.generateLayoutParams(attrs));\n    }\n\n    @Override\n    protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {\n        return new LayoutParams(super.generateLayoutParams(p));\n    }\n\n    @Override\n    protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {\n        return super.checkLayoutParams(p);\n    }\n\n    private static Interpolator sExpandInterpolator = new OvershootInterpolator();\n    private static Interpolator sCollapseInterpolator = new DecelerateInterpolator(3f);\n    private static Interpolator sAlphaExpandInterpolator = new DecelerateInterpolator();\n\n    private class LayoutParams extends ViewGroup.LayoutParams {\n\n        private ObjectAnimator mExpandY = new ObjectAnimator();\n        private ObjectAnimator mExpandX = new ObjectAnimator();\n        private ObjectAnimator mExpandAlpha = new ObjectAnimator();\n        private ObjectAnimator mCollapseY = new ObjectAnimator();\n        private ObjectAnimator mCollapseX = new ObjectAnimator();\n        private ObjectAnimator mCollapseAlpha = new ObjectAnimator();\n\n        public LayoutParams(ViewGroup.LayoutParams source) {\n            super(source);\n\n            mExpandY.setInterpolator(sExpandInterpolator);\n            mExpandX.setInterpolator(sExpandInterpolator);\n            mExpandAlpha.setInterpolator(sAlphaExpandInterpolator);\n            mCollapseY.setInterpolator(sCollapseInterpolator);\n            mCollapseX.setInterpolator(sCollapseInterpolator);\n            mCollapseAlpha.setInterpolator(sCollapseInterpolator);\n\n            mCollapseAlpha.setProperty(View.ALPHA);\n            mCollapseAlpha.setFloatValues(1f, 0f);\n\n            mExpandAlpha.setProperty(View.ALPHA);\n            mExpandAlpha.setFloatValues(0f, 1f);\n\n            mCollapseY.setProperty(View.TRANSLATION_Y);\n            mCollapseX.setProperty(View.TRANSLATION_X);\n            mExpandY.setProperty(View.TRANSLATION_Y);\n            mExpandX.setProperty(View.TRANSLATION_X);\n            mExpandAnimation.play(mExpandAlpha);\n            if (!isHorizontal)\n                mExpandAnimation.play(mExpandY);\n            else mExpandAnimation.play(mExpandX);\n\n            mCollapseAnimation.play(mCollapseAlpha);\n            if (!isHorizontal)\n                mCollapseAnimation.play(mCollapseY);\n            else mCollapseAnimation.play(mCollapseX);\n        }\n\n        public void setAnimationsTarget(View view) {\n            mCollapseAlpha.setTarget(view);\n            mCollapseY.setTarget(view);\n            mCollapseX.setTarget(view);\n            mExpandAlpha.setTarget(view);\n            mExpandY.setTarget(view);\n            mExpandX.setTarget(view);\n        }\n    }\n\n    @Override\n    protected void onFinishInflate() {\n        super.onFinishInflate();\n        bringChildToFront(mAddButton);\n    }\n\n    public void collapse() {\n        if (mExpanded) {\n            mExpanded = false;\n            mCollapseAnimation.start();\n            mExpandAnimation.cancel();\n        }\n    }\n\n    public void toggle() {\n        if (mExpanded) {\n            collapse();\n        } else {\n            expand();\n        }\n    }\n\n    public void expand() {\n        if (!mExpanded) {\n            mExpanded = true;\n            mCollapseAnimation.cancel();\n            mExpandAnimation.start();\n        }\n    }\n\n    @Override\n    public Parcelable onSaveInstanceState() {\n        Parcelable superState = super.onSaveInstanceState();\n        SavedState savedState = new SavedState(superState);\n        savedState.mExpanded = mExpanded;\n\n        return savedState;\n    }\n\n    @Override\n    public void onRestoreInstanceState(Parcelable state) {\n        if (state instanceof SavedState) {\n            SavedState savedState = (SavedState) state;\n            mExpanded = savedState.mExpanded;\n\n            if (mRotatingDrawable != null) {\n                mRotatingDrawable.setRotation(mExpanded ? EXPANDED_PLUS_ROTATION : COLLAPSED_PLUS_ROTATION);\n            }\n\n            super.onRestoreInstanceState(savedState.getSuperState());\n        } else {\n            super.onRestoreInstanceState(state);\n        }\n    }\n\n    public static class SavedState extends BaseSavedState {\n        public boolean mExpanded;\n\n        public SavedState(Parcelable parcel) {\n            super(parcel);\n        }\n\n        private SavedState(Parcel in) {\n            super(in);\n            mExpanded = in.readInt() == 1;\n        }\n\n        @Override\n        public void writeToParcel(@NonNull Parcel out, int flags) {\n            super.writeToParcel(out, flags);\n            out.writeInt(mExpanded ? 1 : 0);\n        }\n\n        public static final Creator<SavedState> CREATOR = new Creator<SavedState>() {\n\n            @Override\n            public SavedState createFromParcel(Parcel in) {\n                return new SavedState(in);\n            }\n\n            @Override\n            public SavedState[] newArray(int size) {\n                return new SavedState[size];\n            }\n        };\n    }\n\n    private final Interpolator mInterpolator = new AccelerateDecelerateInterpolator();\n    private boolean mHidden = false;\n    /**\n     * The FAB button's Y position when it is displayed.\n     */\n    private float mYDisplayed = -1;\n    /**\n     * The FAB button's Y position when it is hidden.\n     */\n    private float mYHidden = -1;\n\n    public void hide(boolean hide) {\n        // If the hidden state is being updated\n        if (mHidden != hide) {\n\n            // Store the new hidden state\n            mHidden = hide;\n\n            // Animate the FAB to it's new Y position\n            ObjectAnimator animator = ObjectAnimator.ofFloat(this, \"y\", mHidden ? mYHidden : mYDisplayed).setDuration(500);\n            animator.setInterpolator(mInterpolator);\n            animator.start();\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/ui/floatingactionbutton/JellyBeanFloatingActionButton.java",
    "content": "package com.marshalchen.ultimaterecyclerview.ui.floatingactionbutton;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.RectF;\nimport android.graphics.drawable.Drawable;\nimport android.graphics.drawable.LayerDrawable;\nimport android.graphics.drawable.StateListDrawable;\nimport android.util.AttributeSet;\n\nimport com.marshalchen.ultimaterecyclerview.R;\n\n/**\n * it is just another static button to show as the alpha enhanced appearance\n * Created by hesk on 13/10/2015.\n * LICENSE. MIT\n */\npublic class JellyBeanFloatingActionButton extends FloatingActionButton {\n    protected float mAlpha_press, mAlpha_normal;\n\n    public JellyBeanFloatingActionButton(Context context) {\n        super(context);\n    }\n\n    public JellyBeanFloatingActionButton(Context context, AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    public JellyBeanFloatingActionButton(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n    }\n\n    @Override\n    protected void load_extended_attributes(TypedArray attr) {\n        mAlpha_press = attr.getFloat(R.styleable.FloatActionButton_urv_fab_alphaPressed, 0.5f);\n        mAlpha_normal = attr.getFloat(R.styleable.FloatActionButton_urv_fab_alphaNormal, 0.5f);\n        //override important settings\n        mSize = SIZE_NOSHADOW;\n    }\n\n    /**\n     * more advanced usage for fillable in alpha\n     *\n     * @param circleRect the defined rectangle\n     * @return StateListDrawable item\n     */\n    protected StateListDrawable createFillDrawable(RectF circleRect) {\n        StateListDrawable drawable = new StateListDrawable();\n        drawable.addState(new int[]{android.R.attr.state_pressed}, createAlphaDrawble(circleRect, mColorPressed, mAlpha_press));\n        drawable.addState(new int[]{}, createAlphaDrawble(circleRect, mColorNormal, mAlpha_normal));\n        return drawable;\n    }\n\n    protected LayerDrawable generateFinalDrawables(RectF circleRect) {\n        LayerDrawable layerDrawable = new LayerDrawable(\n                new Drawable[]{\n                        createFillDrawable(circleRect),\n                        getIconDrawable()\n                });\n        return layerDrawable;\n    }\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/ui/header/HeaderItemDecoration.java",
    "content": "package com.marshalchen.ultimaterecyclerview.ui.header;\n\nimport android.graphics.Rect;\nimport androidx.recyclerview.widget.GridLayoutManager;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\nimport androidx.recyclerview.widget.StaggeredGridLayoutManager;\nimport android.view.View;\n\n/**\n * Created by hesk on 18/3/16.\n */\npublic class HeaderItemDecoration extends RecyclerView.ItemDecoration {\n    private int mHeaderHeight;\n    private int mNumberOfChildren;\n    private boolean mReversed;\n\n    public HeaderItemDecoration(RecyclerView.LayoutManager layoutManager, int height, boolean isReserse) {\n        if (layoutManager.getClass() == LinearLayoutManager.class) {\n            mNumberOfChildren = 1;\n        } else if (layoutManager.getClass() == GridLayoutManager.class) {\n            mNumberOfChildren = ((GridLayoutManager) layoutManager).getSpanCount();\n        } else if (layoutManager instanceof StaggeredGridLayoutManager) {\n            mNumberOfChildren = ((StaggeredGridLayoutManager) layoutManager).getSpanCount();\n        }\n        mHeaderHeight = height;\n        mReversed = isReserse;\n    }\n\n    @Override\n    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {\n        super.getItemOffsets(outRect, view, parent, state);\n        int value = (parent.getChildLayoutPosition(view) < mNumberOfChildren) ? mHeaderHeight : 0;\n        if (mReversed) {\n            outRect.bottom = value;\n        } else {\n            outRect.top = value;\n        }\n    }\n}"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/ui/header/HeaderShadowDecoration.java",
    "content": "package com.marshalchen.ultimaterecyclerview.ui.header;\n\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.LinearGradient;\nimport android.graphics.Paint;\nimport android.graphics.Rect;\nimport android.graphics.Shader;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.View;\n\n/**\n * Created by hesk on 18/3/16.\n */\npublic class HeaderShadowDecoration extends RecyclerView.ItemDecoration {\n\n    private final View mView;\n    private final boolean mHorizontal;\n    private final float mParallax;\n    private final float mShadowSize;\n    private final int mColumns;\n    private final Paint mShadowPaint;\n\n    public HeaderShadowDecoration(View view, boolean scrollsHorizontally, float parallax, float shadowSize, int columns) {\n        mView = view;\n        mHorizontal = scrollsHorizontally;\n        mParallax = parallax;\n        mShadowSize = shadowSize;\n        mColumns = columns;\n\n        if (mShadowSize > 0) {\n            mShadowPaint = new Paint();\n            mShadowPaint.setShader(mHorizontal ?\n                    new LinearGradient(mShadowSize, 0, 0, 0,\n                            new int[]{Color.argb(55, 0, 0, 0), Color.argb(55, 0, 0, 0), Color.argb(3, 0, 0, 0)},\n                            new float[]{0f, .5f, 1f},\n                            Shader.TileMode.CLAMP) :\n                    new LinearGradient(0, mShadowSize, 0, 0,\n                            new int[]{Color.argb(55, 0, 0, 0), Color.argb(55, 0, 0, 0), Color.argb(3, 0, 0, 0)},\n                            new float[]{0f, .5f, 1f},\n                            Shader.TileMode.CLAMP));\n        } else {\n            mShadowPaint = null;\n        }\n    }\n\n    @Override\n    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {\n        super.onDraw(c, parent, state);\n        // layout basically just gets drawn on the reserved space on top of the first view\n        mView.layout(parent.getLeft(), 0, parent.getRight(), mView.getMeasuredHeight());\n\n        for (int i = 0; i < parent.getChildCount(); i++) {\n            View view = parent.getChildAt(i);\n            if (parent.getChildAdapterPosition(view) == 0) {\n                c.save();\n                if (mHorizontal) {\n                    c.clipRect(parent.getLeft(), parent.getTop(), view.getLeft(), parent.getBottom());\n                    final int width = mView.getMeasuredWidth();\n                    final float left = (view.getLeft() - width) * mParallax;\n                    c.translate(left, 0);\n                    mView.draw(c);\n                    if (mShadowSize > 0) {\n                        c.translate(view.getLeft() - left - mShadowSize, 0);\n                        c.drawRect(parent.getLeft(), parent.getTop(), mShadowSize, parent.getBottom(), mShadowPaint);\n                    }\n                } else {\n                    c.clipRect(parent.getLeft(), parent.getTop(), parent.getRight(), view.getTop());\n                    final int height = mView.getMeasuredHeight();\n                    final float top = (view.getTop() - height) * mParallax;\n                    c.translate(0, top);\n                    mView.draw(c);\n                    if (mShadowSize > 0) {\n                        c.translate(0, view.getTop() - top - mShadowSize);\n                        c.drawRect(parent.getLeft(), parent.getTop(), parent.getRight(), mShadowSize, mShadowPaint);\n                    }\n                }\n                c.restore();\n                break;\n            }\n        }\n    }\n\n    @Override\n    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {\n        if (parent.getChildAdapterPosition(view) < mColumns) {\n            if (mHorizontal) {\n                if (mView.getMeasuredWidth() <= 0) {\n                    mView.measure(View.MeasureSpec.makeMeasureSpec(parent.getMeasuredWidth(), View.MeasureSpec.AT_MOST),\n                            View.MeasureSpec.makeMeasureSpec(parent.getMeasuredHeight(), View.MeasureSpec.AT_MOST));\n                }\n                outRect.set(mView.getMeasuredWidth(), 0, 0, 0);\n            } else {\n                if (mView.getMeasuredHeight() <= 0) {\n                    mView.measure(View.MeasureSpec.makeMeasureSpec(parent.getMeasuredWidth(), View.MeasureSpec.AT_MOST),\n                            View.MeasureSpec.makeMeasureSpec(parent.getMeasuredHeight(), View.MeasureSpec.AT_MOST));\n                }\n                outRect.set(0, mView.getMeasuredHeight(), 0, 0);\n            }\n        } else {\n            outRect.setEmpty();\n        }\n    }\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/ui/header/RecyclerViewHeader.java",
    "content": "package com.marshalchen.ultimaterecyclerview.ui.header;\n\nimport android.widget.RelativeLayout;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\n\nimport androidx.annotation.LayoutRes;\nimport androidx.annotation.NonNull;\nimport androidx.recyclerview.widget.GridLayoutManager;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\nimport androidx.recyclerview.widget.StaggeredGridLayoutManager;\nimport android.util.AttributeSet;\nimport android.view.Gravity;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.ViewParent;\nimport android.view.ViewTreeObserver;\nimport android.widget.FrameLayout;\nimport android.widget.LinearLayout;\n\n/**\n * Created by hesk on 18/3/16.\n */\npublic class RecyclerViewHeader extends RelativeLayout {\n    private RecyclerView mRecycler;\n\n    private int mDownScroll;\n    private int mCurrentScroll;\n    private boolean mReversed;\n    private boolean mAlreadyAligned;\n    private boolean mRecyclerWantsTouchEvent;\n    private RecyclerView.ItemDecoration mDecoration;\n\n    /**\n     * Inflates layout from <code>xml</code> and encapsulates it with <code>RecyclerViewHeader</code>.\n     *\n     * @param context   application context.\n     * @param layoutRes layout resource to be inflated.\n     * @return <code>RecyclerViewHeader</code> view object.\n     */\n    public static RecyclerViewHeader fromXml(Context context, @LayoutRes int layoutRes) {\n        RecyclerViewHeader header = new RecyclerViewHeader(context);\n        View.inflate(context, layoutRes, header);\n        return header;\n    }\n\n    public static RecyclerViewHeader fromXml(Context context, @LayoutRes int layoutRes, RecyclerView.ItemDecoration decoration) {\n        RecyclerViewHeader header = new RecyclerViewHeader(context);\n        View.inflate(context, layoutRes, header);\n        header.setDecor(decoration);\n        return header;\n    }\n\n    public RecyclerViewHeader(Context context) {\n        super(context);\n    }\n\n    public RecyclerViewHeader(Context context, AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    public RecyclerViewHeader(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n    }\n\n    private void setDecor(RecyclerView.ItemDecoration decor) {\n        mDecoration = decor;\n    }\n\n    /**\n     * Attaches <code>RecyclerViewHeader</code> to <code>RecyclerView</code>.\n     * This method will perform necessary actions to properly align the header within <code>RecyclerView</code>.\n     * Be sure that <code>setLayoutManager(...)</code> has been called for <code>RecyclerView</code> before calling this method.\n     * Also, if you were planning to use <code>setOnScrollListener(...)</code> method for your <code>RecyclerView</code>, be sure to do it before calling this method.\n     *\n     * @param recycler <code>RecyclerView</code> to attach <code>RecyclerViewHeader</code> to.\n     */\n    public void attachTo(RecyclerView recycler) {\n        attachTo(recycler, false);\n    }\n\n    /**\n     * Attaches <code>RecyclerViewHeader</code> to <code>RecyclerView</code>.\n     * Be sure that <code>setLayoutManager(...)</code> has been called for <code>RecyclerView</code> before calling this method.\n     * Also, if you were planning to use <code>setOnScrollListener(...)</code> method for your <code>RecyclerView</code>, be sure to do it before calling this method.\n     *\n     * @param recycler             <code>RecyclerView</code> to attach <code>RecyclerViewHeader</code> to.\n     * @param headerAlreadyAligned If set to <code>false</code>, method will perform necessary actions to properly align\n     *                             the header within <code>RecyclerView</code>. If set to <code>true</code> method will assume,\n     *                             that user has already aligned <code>RecyclerViewHeader</code> properly.\n     */\n    public void attachTo(RecyclerView recycler, boolean headerAlreadyAligned) {\n        validateRecycler(recycler, headerAlreadyAligned);\n\n        mRecycler = recycler;\n        mAlreadyAligned = headerAlreadyAligned;\n        mReversed = isLayoutManagerReversed(recycler);\n\n        setupAlignment(recycler);\n        setupHeader(recycler);\n    }\n\n    private boolean isLayoutManagerReversed(RecyclerView recycler) {\n        boolean reversed = false;\n        RecyclerView.LayoutManager manager = recycler.getLayoutManager();\n        if (manager instanceof LinearLayoutManager) {\n            reversed = ((LinearLayoutManager) manager).getReverseLayout();\n        } else if (manager instanceof StaggeredGridLayoutManager) {\n            reversed = ((StaggeredGridLayoutManager) manager).getReverseLayout();\n        }\n        return reversed;\n    }\n\n    private void setupAlignment(RecyclerView recycler) {\n        if (!mAlreadyAligned) {\n            //setting alignment of header\n            ViewGroup.LayoutParams currentParams = getLayoutParams();\n            FrameLayout.LayoutParams newHeaderParams;\n            int width = ViewGroup.LayoutParams.WRAP_CONTENT;\n            int height = ViewGroup.LayoutParams.WRAP_CONTENT;\n            int gravity = (mReversed ? Gravity.BOTTOM : Gravity.TOP) | Gravity.CENTER_HORIZONTAL;\n            if (currentParams != null) {\n                newHeaderParams = new FrameLayout.LayoutParams(getLayoutParams()); //to copy all the margins\n                newHeaderParams.width = width;\n                newHeaderParams.height = height;\n                newHeaderParams.gravity = gravity;\n            } else {\n                newHeaderParams = new FrameLayout.LayoutParams(width, height, gravity);\n            }\n            RecyclerViewHeader.this.setLayoutParams(newHeaderParams);\n\n            //setting alignment of recycler\n            FrameLayout newRootParent = new FrameLayout(recycler.getContext());\n            newRootParent.setLayoutParams(recycler.getLayoutParams());\n            ViewParent currentParent = recycler.getParent();\n            if (currentParent instanceof ViewGroup) {\n                int indexWithinParent = ((ViewGroup) currentParent).indexOfChild(recycler);\n\n                ((ViewGroup) currentParent).removeViewAt(indexWithinParent);\n                recycler.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));\n                newRootParent.addView(recycler);\n                newRootParent.addView(RecyclerViewHeader.this);\n                ((ViewGroup) currentParent).addView(newRootParent, indexWithinParent);\n            }\n        }\n    }\n\n    @SuppressLint(\"NewApi\")\n    private void setupHeader(final RecyclerView recycler) {\n        recycler.addOnScrollListener(new RecyclerView.OnScrollListener() {\n            @Override\n            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {\n                super.onScrolled(recyclerView, dx, dy);\n                mCurrentScroll += dy;\n                RecyclerViewHeader.this.setTranslationY(-mCurrentScroll);\n            }\n        });\n\n        RecyclerViewHeader.this.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {\n            @Override\n            public void onGlobalLayout() {\n                int height = RecyclerViewHeader.this.getHeight();\n                if (height > 0) {\n                    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {\n                        RecyclerViewHeader.this.getViewTreeObserver().removeOnGlobalLayoutListener(this);\n                    } else {\n                        RecyclerViewHeader.this.getViewTreeObserver().removeGlobalOnLayoutListener(this);\n                    }\n\n                    if (mAlreadyAligned) {\n                        MarginLayoutParams params = (MarginLayoutParams) getLayoutParams();\n                        height += params.topMargin;\n                        height += params.bottomMargin;\n                    }\n                    if (mDecoration == null) {\n                        recycler.addItemDecoration(new HeaderItemDecoration(recycler.getLayoutManager(), height, mReversed), 0);\n                    } else {\n                        recycler.addItemDecoration(mDecoration, 0);\n                    }\n                }\n            }\n        });\n    }\n\n    private void validateRecycler(RecyclerView recycler, boolean headerAlreadyAligned) {\n        RecyclerView.LayoutManager layoutManager = recycler.getLayoutManager();\n        if (layoutManager == null) {\n            throw new IllegalStateException(\"Be sure to call RecyclerViewHeader constructor after setting your RecyclerView's LayoutManager.\");\n        } else if (layoutManager.getClass() != LinearLayoutManager.class    //not using instanceof on purpose\n                && layoutManager.getClass() != GridLayoutManager.class\n                && !(layoutManager instanceof StaggeredGridLayoutManager)) {\n            throw new IllegalArgumentException(\"Currently RecyclerViewHeader supports only LinearLayoutManager, GridLayoutManager and StaggeredGridLayoutManager.\");\n        }\n\n        if (layoutManager instanceof LinearLayoutManager) {\n            if (((LinearLayoutManager) layoutManager).getOrientation() != LinearLayoutManager.VERTICAL) {\n                throw new IllegalArgumentException(\"Currently RecyclerViewHeader supports only VERTICAL orientation LayoutManagers.\");\n            }\n        } else if (layoutManager instanceof StaggeredGridLayoutManager) {\n            if (((StaggeredGridLayoutManager) layoutManager).getOrientation() != StaggeredGridLayoutManager.VERTICAL) {\n                throw new IllegalArgumentException(\"Currently RecyclerViewHeader supports only VERTICAL orientation StaggeredGridLayoutManagers.\");\n            }\n        }\n\n        if (!headerAlreadyAligned) {\n            ViewParent parent = recycler.getParent();\n            if (parent != null &&\n                    !(parent instanceof LinearLayout) &&\n                    !(parent instanceof FrameLayout) &&\n                    !(parent instanceof RelativeLayout)) {\n                throw new IllegalStateException(\"Currently, NOT already aligned RecyclerViewHeader \" +\n                        \"can only be used for RecyclerView with a parent of one of types: LinearLayout, FrameLayout, RelativeLayout.\");\n            }\n        }\n    }\n\n    @Override\n    public boolean onInterceptTouchEvent(MotionEvent ev) {\n        mRecyclerWantsTouchEvent = mRecycler.onInterceptTouchEvent(ev);\n        if (mRecyclerWantsTouchEvent && ev.getAction() == MotionEvent.ACTION_DOWN) {\n            mDownScroll = mCurrentScroll;\n        }\n        return mRecyclerWantsTouchEvent || super.onInterceptTouchEvent(ev);\n    }\n\n    @Override\n    public boolean onTouchEvent(@NonNull MotionEvent event) {\n        if (mRecyclerWantsTouchEvent) {\n            int scrollDiff = mCurrentScroll - mDownScroll;\n            MotionEvent recyclerEvent =\n                    MotionEvent.obtain(event.getDownTime(), event.getEventTime(), event.getAction(),\n                            event.getX(), event.getY() - scrollDiff, event.getMetaState());\n            mRecycler.onTouchEvent(recyclerEvent);\n            return false;\n        }\n        return super.onTouchEvent(event);\n    }\n\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/ui/swipe/SwipeableRecyclerViewTouchListener.java",
    "content": "/*\n * Copyright 2013 Google Inc.\n * Copyright 2015 Bruno Romeu Nunes\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.marshalchen.ultimaterecyclerview.ui.swipe;\n\nimport android.animation.Animator;\nimport android.animation.AnimatorListenerAdapter;\nimport android.animation.ValueAnimator;\nimport android.annotation.TargetApi;\nimport android.graphics.Rect;\nimport android.os.Build;\nimport android.os.SystemClock;\nimport androidx.annotation.NonNull;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.MotionEvent;\nimport android.view.VelocityTracker;\nimport android.view.View;\nimport android.view.ViewConfiguration;\nimport android.view.ViewGroup;\nimport android.widget.ListView;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\n\n\n/**\n * A {@link View.OnTouchListener} that makes the list items in a {@link RecyclerView}\n * dismissable by swiping.\n * Example usage:\n * SwipeDismissRecyclerViewTouchListener touchListener =\n * new SwipeDismissRecyclerViewTouchListener(\n * listView,\n * new SwipeDismissRecyclerViewTouchListener.OnDismissCallback() {\n * public void onDismiss(ListView listView, int[] reverseSortedPositions) {\n * for (int position : reverseSortedPositions) {\n * adapter.remove(adapter.getItem(position));\n * }\n * adapter.notifyDataSetChanged();\n * }\n * });\n * listView.setOnTouchListener(touchListener);\n * listView.setOnScrollListener(touchListener.makeScrollListener());\n * This class Requires API level 12 or later due to use of {@link\n * android.view.ViewPropertyAnimator}.\n */\npublic class SwipeableRecyclerViewTouchListener implements RecyclerView.OnItemTouchListener {\n    // Cached ViewConfiguration and system-wide constant values\n    private int mSlop;\n    private int mMinFlingVelocity;\n    private int mMaxFlingVelocity;\n    private long mAnimationTime;\n\n    // Fixed properties\n    private RecyclerView mRecyclerView;\n    private SwipeListener mSwipeListener;\n    private int mViewWidth = 1; // 1 and not 0 to prevent dividing by zero\n\n    // Transient properties\n    private List<PendingDismissData> mPendingDismisses = new ArrayList<>();\n    private int mDismissAnimationRefCount = 0;\n    private float mAlpha;\n    private float mDownX;\n    private float mDownY;\n    private boolean mSwiping;\n    private int mSwipingSlop;\n    private VelocityTracker mVelocityTracker;\n    private int mDownPosition;\n    private int mAnimatingPosition = ListView.INVALID_POSITION;\n    private View mDownView;\n    private boolean mPaused;\n    private float mFinalDelta;\n\n    /**\n     * Constructs a new swipe touch listener for the given {@link RecyclerView}\n     *\n     * @param recyclerView The recycler view whose items should be dismissable by swiping.\n     * @param listener     The listener for the swipe events.\n     */\n    public SwipeableRecyclerViewTouchListener(RecyclerView recyclerView, SwipeListener listener) {\n        ViewConfiguration vc = ViewConfiguration.get(recyclerView.getContext());\n        mSlop = vc.getScaledTouchSlop();\n        mMinFlingVelocity = vc.getScaledMinimumFlingVelocity() * 16;\n        mMaxFlingVelocity = vc.getScaledMaximumFlingVelocity();\n        mAnimationTime = recyclerView.getContext().getResources().getInteger(\n                android.R.integer.config_shortAnimTime);\n        mRecyclerView = recyclerView;\n        mSwipeListener = listener;\n\n\n        /**\n         * This will ensure that this SwipeableRecyclerViewTouchListener is paused during list view scrolling.\n         * If a scroll listener is already assigned, the caller should still pass scroll changes through\n         * to this listener.\n         */\n        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {\n            @Override\n            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {\n                setEnabled(newState != RecyclerView.SCROLL_STATE_DRAGGING);\n            }\n\n            @Override\n            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {\n            }\n        });\n    }\n\n    /**\n     * Enables or disables (pauses or resumes) watching for swipe-to-dismiss gestures.\n     *\n     * @param enabled Whether or not to watch for gestures.\n     */\n    public void setEnabled(boolean enabled) {\n        mPaused = !enabled;\n    }\n\n    @Override\n    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent motionEvent) {\n        return handleTouchEvent(motionEvent);\n    }\n\n    @Override\n    public void onTouchEvent(RecyclerView rv, MotionEvent motionEvent) {\n        handleTouchEvent(motionEvent);\n    }\n\n    @Override\n    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {\n\n    }\n\n    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1)\n    private boolean handleTouchEvent(MotionEvent motionEvent) {\n        if (mViewWidth < 2) {\n            mViewWidth = mRecyclerView.getWidth();\n        }\n\n        switch (motionEvent.getActionMasked()) {\n            case MotionEvent.ACTION_DOWN: {\n                if (mPaused) {\n                    break;\n                }\n\n                // Find the child view that was touched (perform a hit test)\n                Rect rect = new Rect();\n                int childCount = mRecyclerView.getChildCount();\n                int[] listViewCoords = new int[2];\n                mRecyclerView.getLocationOnScreen(listViewCoords);\n                int x = (int) motionEvent.getRawX() - listViewCoords[0];\n                int y = (int) motionEvent.getRawY() - listViewCoords[1];\n                View child;\n                for (int i = 0; i < childCount; i++) {\n                    child = mRecyclerView.getChildAt(i);\n                    child.getHitRect(rect);\n                    if (rect.contains(x, y)) {\n                        mDownView = child;\n                        break;\n                    }\n                }\n\n                if (mDownView != null && mAnimatingPosition != mRecyclerView.getChildPosition(mDownView)) {\n                    mAlpha = mDownView.getAlpha();\n                    mDownX = motionEvent.getRawX();\n                    mDownY = motionEvent.getRawY();\n                    mDownPosition = mRecyclerView.getChildPosition(mDownView);\n                    if (mSwipeListener.canSwipe(mDownPosition)) {\n                        mVelocityTracker = VelocityTracker.obtain();\n                        mVelocityTracker.addMovement(motionEvent);\n                    } else {\n                        mDownView = null;\n                    }\n                }\n                break;\n            }\n\n            case MotionEvent.ACTION_CANCEL: {\n                if (mVelocityTracker == null) {\n                    break;\n                }\n\n                if (mDownView != null && mSwiping) {\n                    // cancel\n                    mDownView.animate()\n                            .translationX(0)\n                            .alpha(mAlpha)\n                            .setDuration(mAnimationTime)\n                            .setListener(null);\n                }\n                mVelocityTracker.recycle();\n                mVelocityTracker = null;\n                mDownX = 0;\n                mDownY = 0;\n                mDownView = null;\n                mDownPosition = ListView.INVALID_POSITION;\n                mSwiping = false;\n                break;\n            }\n\n            case MotionEvent.ACTION_UP: {\n                if (mVelocityTracker == null) {\n                    break;\n                }\n\n                mFinalDelta = motionEvent.getRawX() - mDownX;\n                mVelocityTracker.addMovement(motionEvent);\n                mVelocityTracker.computeCurrentVelocity(1000);\n                float velocityX = mVelocityTracker.getXVelocity();\n                float absVelocityX = Math.abs(velocityX);\n                float absVelocityY = Math.abs(mVelocityTracker.getYVelocity());\n                boolean dismiss = false;\n                boolean dismissRight = false;\n                if (Math.abs(mFinalDelta) > mViewWidth / 2 && mSwiping) {\n                    dismiss = true;\n                    dismissRight = mFinalDelta > 0;\n                } else if (mMinFlingVelocity <= absVelocityX && absVelocityX <= mMaxFlingVelocity\n                        && absVelocityY < absVelocityX && mSwiping) {\n                    // dismiss only if flinging in the same direction as dragging\n                    dismiss = (velocityX < 0) == (mFinalDelta < 0);\n                    dismissRight = mVelocityTracker.getXVelocity() > 0;\n                }\n                if (dismiss && mDownPosition != mAnimatingPosition && mDownPosition != ListView.INVALID_POSITION) {\n                    // dismiss\n                    final View downView = mDownView; // mDownView gets null'd before animation ends\n                    final int downPosition = mDownPosition;\n                    ++mDismissAnimationRefCount;\n                    mAnimatingPosition = mDownPosition;\n                    mDownView.animate()\n                            .translationX(dismissRight ? mViewWidth : -mViewWidth)\n                            .alpha(0)\n                            .setDuration(mAnimationTime)\n                            .setListener(new AnimatorListenerAdapter() {\n                                @Override\n                                public void onAnimationEnd(Animator animation) {\n                                    performDismiss(downView, downPosition);\n                                }\n                            });\n                } else {\n                    // cancel\n                    mDownView.animate()\n                            .translationX(0)\n                            .alpha(mAlpha)\n                            .setDuration(mAnimationTime)\n                            .setListener(null);\n                }\n                mVelocityTracker.recycle();\n                mVelocityTracker = null;\n                mDownX = 0;\n                mDownY = 0;\n                mDownView = null;\n                mDownPosition = ListView.INVALID_POSITION;\n                mSwiping = false;\n                break;\n            }\n\n            case MotionEvent.ACTION_MOVE: {\n                if (mVelocityTracker == null || mPaused) {\n                    break;\n                }\n\n                mVelocityTracker.addMovement(motionEvent);\n                float deltaX = motionEvent.getRawX() - mDownX;\n                float deltaY = motionEvent.getRawY() - mDownY;\n                if (!mSwiping && Math.abs(deltaX) > mSlop && Math.abs(deltaY) < Math.abs(deltaX) / 2) {\n                    mSwiping = true;\n                    mSwipingSlop = (deltaX > 0 ? mSlop : -mSlop);\n                }\n\n                if (mSwiping) {\n                    mDownView.setTranslationX(deltaX - mSwipingSlop);\n                    mDownView.setAlpha(Math.max(0f, Math.min(mAlpha,\n                            mAlpha * (1f - Math.abs(deltaX) / mViewWidth))));\n                    return true;\n                }\n                break;\n            }\n        }\n\n        return false;\n    }\n\n    @TargetApi(Build.VERSION_CODES.HONEYCOMB)\n    private void performDismiss(final View dismissView, final int dismissPosition) {\n        // Animate the dismissed list item to zero-height and fire the dismiss callback when\n        // all dismissed list item animations have completed. This triggers layout on each animation\n        // frame; in the future we may want to do something smarter and more performant.\n\n        final ViewGroup.LayoutParams lp = dismissView.getLayoutParams();\n        final int originalLayoutParamsHeight = lp.height;\n        final int originalHeight = dismissView.getHeight();\n\n        ValueAnimator animator = ValueAnimator.ofInt(originalHeight, 1).setDuration(mAnimationTime);\n\n        animator.addListener(new AnimatorListenerAdapter() {\n            @Override\n            public void onAnimationEnd(Animator animation) {\n                --mDismissAnimationRefCount;\n                if (mDismissAnimationRefCount == 0) {\n                    // No active animations, process all pending dismisses.\n                    // Sort by descending position\n                    Collections.sort(mPendingDismisses);\n\n                    int[] dismissPositions = new int[mPendingDismisses.size()];\n                    for (int i = mPendingDismisses.size() - 1; i >= 0; i--) {\n                        dismissPositions[i] = mPendingDismisses.get(i).position;\n                    }\n\n                    if (mFinalDelta > 0) {\n                        mSwipeListener.onDismissedBySwipeRight(mRecyclerView, dismissPositions);\n                    } else {\n                        mSwipeListener.onDismissedBySwipeLeft(mRecyclerView, dismissPositions);\n                    }\n\n                    // Reset mDownPosition to avoid MotionEvent.ACTION_UP trying to start a dismiss\n                    // animation with a stale position\n                    mDownPosition = ListView.INVALID_POSITION;\n\n                    ViewGroup.LayoutParams lp;\n                    for (PendingDismissData pendingDismiss : mPendingDismisses) {\n                        // Reset view presentation\n                        pendingDismiss.view.setAlpha(mAlpha);\n                        pendingDismiss.view.setTranslationX(0);\n\n                        lp = pendingDismiss.view.getLayoutParams();\n                        lp.height = originalLayoutParamsHeight;\n\n                        pendingDismiss.view.setLayoutParams(lp);\n                    }\n\n                    // Send a cancel event\n                    long time = SystemClock.uptimeMillis();\n                    MotionEvent cancelEvent = MotionEvent.obtain(time, time,\n                            MotionEvent.ACTION_CANCEL, 0, 0, 0);\n                    mRecyclerView.dispatchTouchEvent(cancelEvent);\n\n                    mPendingDismisses.clear();\n                    mAnimatingPosition = ListView.INVALID_POSITION;\n                }\n            }\n        });\n\n        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator valueAnimator) {\n                lp.height = (Integer) valueAnimator.getAnimatedValue();\n                dismissView.setLayoutParams(lp);\n            }\n        });\n\n        mPendingDismisses.add(new PendingDismissData(dismissPosition, dismissView));\n        animator.start();\n    }\n\n    /**\n     * The callback interface used by {@link SwipeableRecyclerViewTouchListener} to inform its client\n     * about a swipe of one or more list item positions.\n     */\n    public interface SwipeListener {\n        /**\n         * Called to determine whether the given position can be swiped.\n         *\n         * @param position position of the swip\n         * @return bool\n         */\n        boolean canSwipe(int position);\n\n        /**\n         * Called when the item has been dismissed by swiping to the left.\n         *\n         * @param recyclerView           The originating {@link RecyclerView}.\n         * @param reverseSortedPositions An array of positions to dismiss, sorted in descending\n         *                               order for convenience.\n         */\n        void onDismissedBySwipeLeft(RecyclerView recyclerView, int[] reverseSortedPositions);\n\n        /**\n         * Called when the item has been dismissed by swiping to the right.\n         *\n         * @param recyclerView           The originating {@link RecyclerView}.\n         * @param reverseSortedPositions An array of positions to dismiss, sorted in descending\n         *                               order for convenience.\n         */\n        void onDismissedBySwipeRight(RecyclerView recyclerView, int[] reverseSortedPositions);\n    }\n\n    class PendingDismissData implements Comparable<PendingDismissData> {\n        public int position;\n        public View view;\n\n        public PendingDismissData(int position, View view) {\n            this.position = position;\n            this.view = view;\n        }\n\n        @Override\n        public int compareTo(@NonNull PendingDismissData other) {\n            // Sort by descending position\n            return other.position - position;\n        }\n    }\n}"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/ui/swipe/defaultRegularSwipe.java",
    "content": "package com.marshalchen.ultimaterecyclerview.ui.swipe;\n\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport com.marshalchen.ultimaterecyclerview.quickAdapter.easyRegularAdapter;\n\n/**\n * Created by hesk on 19/2/16.\n */\npublic class defaultRegularSwipe<T extends easyRegularAdapter> implements SwipeableRecyclerViewTouchListener.SwipeListener {\n\n    private T mAdapter;\n\n    public defaultRegularSwipe(T adapter) {\n        mAdapter = adapter;\n    }\n\n    @Override\n    public boolean canSwipe(int position) {\n        if (mAdapter.enableLoadMore() && position == mAdapter.getItemCount() - 1) return false;\n        if (mAdapter.hasHeaderView() && position == 0) return false;\n        return true;\n    }\n\n    @Override\n    public void onDismissedBySwipeLeft(RecyclerView recyclerView, int[] reverseSortedPositions) {\n        for (int position : reverseSortedPositions) {\n            mAdapter.removeAt(position);\n        }\n        mAdapter.notifyDataSetChanged();\n    }\n\n    @Override\n    public void onDismissedBySwipeRight(RecyclerView recyclerView, int[] reverseSortedPositions) {\n        for (int position : reverseSortedPositions) {\n            mAdapter.removeAt(position);\n        }\n        mAdapter.notifyDataSetChanged();\n    }\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/ui/timelineview/LineType.java",
    "content": "package com.marshalchen.ultimaterecyclerview.ui.timelineview;\n\n/**\n * Created by zJJ on 4/27/2016.\n */\npublic class LineType {\n    public static final int NORMAL = 0;\n    public static final int BEGIN = 1;\n    public static final int END = 2;\n    public static final int ONLYONE = 3;\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/ui/timelineview/TimelineView.java",
    "content": "package com.marshalchen.ultimaterecyclerview.ui.timelineview;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.Canvas;\nimport android.graphics.Rect;\nimport android.graphics.drawable.Drawable;\nimport androidx.core.content.ContextCompat;\nimport android.util.AttributeSet;\nimport android.view.View;\n\nimport com.marshalchen.ultimaterecyclerview.R;\n\n/**\n * Created by zJJ on 4/27/2016.\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npublic class TimelineView extends View {\n\n    private Drawable mMarker;\n    private Drawable mStartLine, mActionStartLine;\n    private Drawable mEndLine, mActionEndLine;\n    private int mMarkerSize;\n    private int mLineSize;\n\n    private Rect mBounds;\n    private Context mContext;\n\n\n    public TimelineView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        mContext = context;\n        init(attrs);\n    }\n\n    private void init(AttributeSet attrs) {\n        TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.timeline_style);\n        mMarker = typedArray.getDrawable(R.styleable.timeline_style_tls_marker);\n        mStartLine = typedArray.getDrawable(R.styleable.timeline_style_tls_line);\n        mEndLine = typedArray.getDrawable(R.styleable.timeline_style_tls_line);\n        mMarkerSize = typedArray.getDimensionPixelSize(R.styleable.timeline_style_tls_marker_size, 25);\n        mLineSize = typedArray.getDimensionPixelSize(R.styleable.timeline_style_tls_line_size, 2);\n        typedArray.recycle();\n\n        if (mMarker == null) {\n            mMarker = ContextCompat.getDrawable(mContext, R.drawable.timelinedefaultmarker);\n        }\n    }\n\n    @Override\n    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        super.onMeasure(widthMeasureSpec, heightMeasureSpec);\n        //Width measurements of the width and height and the inside view of child controls\n        int w = mMarkerSize + getPaddingLeft() + getPaddingRight();\n        int h = mMarkerSize + getPaddingTop() + getPaddingBottom();\n\n        // Width and height to determine the final view through a systematic approach to decision-making\n        int widthSize = 0;\n        int heightSize = 0;\n        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {\n            widthSize = resolveSizeAndState(w, widthMeasureSpec, 0);\n            heightSize = resolveSizeAndState(h, heightMeasureSpec, 0);\n        }\n        setMeasuredDimension(widthSize, heightSize);\n        initDrawable();\n    }\n\n    @Override\n    protected void onSizeChanged(int w, int h, int oldw, int oldh) {\n        super.onSizeChanged(w, h, oldw, oldh);\n        // When the view is displayed when the callback\n        // Positioning Drawable coordinates, then draw\n        initDrawable();\n    }\n\n    private void initDrawable() {\n        int pLeft = getPaddingLeft();\n        int pRight = getPaddingRight();\n        int pTop = getPaddingTop();\n        int pBottom = getPaddingBottom();\n\n        int width = getWidth();// Width of current custom view\n        int height = getHeight();\n\n        int cWidth = width - pLeft - pRight;// Circle width\n        int cHeight = height - pTop - pBottom;\n\n        int markSize = Math.min(mMarkerSize, Math.min(cWidth, cHeight));\n\n        if (mMarker != null) {\n            mMarker.setBounds(pLeft, pTop, pLeft + markSize, pTop + markSize);\n            mBounds = mMarker.getBounds();\n        }\n\n        int centerX = mBounds.centerX();\n        int lineLeft = centerX - (mLineSize >> 1);\n        if (mActionStartLine != null) {\n            mActionStartLine.setBounds(lineLeft, 0, mLineSize + lineLeft, mBounds.top);\n        }\n\n        if (mActionEndLine != null) {\n            mActionEndLine.setBounds(lineLeft, mBounds.bottom, mLineSize + lineLeft, height);\n        }\n\n    }\n\n    @Override\n    protected void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n        if (mMarker != null) {\n            mMarker.draw(canvas);\n        }\n        if (mActionStartLine != null) {\n            mActionStartLine.draw(canvas);\n        }\n        if (mActionEndLine != null) {\n            mActionEndLine.draw(canvas);\n        }\n    }\n\n    public void setMarker(Drawable marker) {\n        mMarker = marker;\n        initDrawable();\n    }\n\n    public void setStartLine(Drawable startline) {\n        mStartLine = startline;\n        initDrawable();\n    }\n\n    public void setEndLine(Drawable endLine) {\n        mEndLine = endLine;\n        initDrawable();\n    }\n\n    public void setMarkerSize(int markerSize) {\n        mMarkerSize = markerSize;\n        initDrawable();\n    }\n\n    public void setLineSize(int lineSize) {\n        mLineSize = lineSize;\n        initDrawable();\n    }\n\n    public void initLine(int viewType) {\n        mActionStartLine = mStartLine;\n        mActionEndLine = mEndLine;\n        if (viewType == LineType.BEGIN) {\n            //  setStartLine(null);\n            mActionStartLine = null;\n        } else if (viewType == LineType.END) {\n            // setEndLine(null);\n            mActionEndLine = null;\n        } else if (viewType == LineType.ONLYONE) {\n            // setStartLine(null);\n            // setEndLine(null);\n            mActionStartLine = null;\n            mActionEndLine = null;\n        }\n\n        initDrawable();\n        requestLayout();\n    }\n\n    public static int getTimeLineViewType(int position, int total_size) {\n        if (total_size == 1) {\n            return LineType.ONLYONE;\n        } else if (position == 0) {\n            return LineType.BEGIN;\n        } else if (position == total_size - 1) {\n            return LineType.END;\n        } else {\n            return LineType.NORMAL;\n        }\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/uiUtils/CacheFragmentStatePagerAdapter.java",
    "content": "/*\n * Copyright 2014 Soichiro Kashima\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.marshalchen.ultimaterecyclerview.uiUtils;\n\nimport android.os.Bundle;\nimport android.os.Parcelable;\nimport androidx.fragment.app.Fragment;\nimport androidx.fragment.app.FragmentManager;\nimport androidx.fragment.app.FragmentStatePagerAdapter;\nimport android.util.SparseArray;\nimport android.view.ViewGroup;\n\n/**\n * FragmentStatePagerAdapter that caches each pages.\n * FragmentStatePagerAdapter is also originally caches pages,\n * but its keys are not public nor documented, so depending\n * on how it create cache key is dangerous.\n * This adapter caches pages by itself and provide getter method to the cache.\n */\npublic abstract class CacheFragmentStatePagerAdapter extends FragmentStatePagerAdapter {\n\n    private static final String STATE_SUPER_STATE = \"superState\";\n    private static final String STATE_PAGES = \"pages\";\n    private static final String STATE_PAGE_INDEX_PREFIX = \"pageIndex:\";\n    private static final String STATE_PAGE_KEY_PREFIX = \"page:\";\n\n    private FragmentManager mFm;\n    private SparseArray<Fragment> mPages;\n\n    public CacheFragmentStatePagerAdapter(FragmentManager fm) {\n        super(fm);\n        mPages = new SparseArray<Fragment>();\n        mFm = fm;\n    }\n\n    @Override\n    public Parcelable saveState() {\n        Parcelable p = super.saveState();\n        Bundle bundle = new Bundle();\n        bundle.putParcelable(STATE_SUPER_STATE, p);\n\n        bundle.putInt(STATE_PAGES, mPages.size());\n        if (0 < mPages.size()) {\n            for (int i = 0; i < mPages.size(); i++) {\n                int position = mPages.keyAt(i);\n                bundle.putInt(createCacheIndex(i), position);\n                Fragment f = mPages.get(position);\n                mFm.putFragment(bundle, createCacheKey(position), f);\n            }\n        }\n        return bundle;\n    }\n\n    @Override\n    public void restoreState(Parcelable state, ClassLoader loader) {\n        Bundle bundle = (Bundle) state;\n        int pages = bundle.getInt(STATE_PAGES);\n        if (0 < pages) {\n            for (int i = 0; i < pages; i++) {\n                int position = bundle.getInt(createCacheIndex(i));\n                Fragment f = mFm.getFragment(bundle, createCacheKey(position));\n                mPages.put(position, f);\n            }\n        }\n\n        Parcelable p = bundle.getParcelable(STATE_SUPER_STATE);\n        super.restoreState(p, loader);\n    }\n\n    /**\n     * Get a new Fragment instance.\n     * Each fragments are automatically cached in this method,\n     * so you don't have to do it by yourself.\n     * If you want to implement instantiation of Fragments,\n     * you should override {@link #createItem(int)} instead.\n     *\n     * {@inheritDoc}\n     *\n     * @param position position of the item in the adapter\n     * @return fragment instance\n     */\n    @Override\n    public Fragment getItem(int position) {\n        Fragment f = createItem(position);\n        // We should cache fragments manually to access to them later\n        mPages.put(position, f);\n        return f;\n    }\n\n    @Override\n    public void destroyItem(ViewGroup container, int position, Object object) {\n        if (0 <= mPages.indexOfKey(position)) {\n            mPages.remove(position);\n        }\n        super.destroyItem(container, position, object);\n    }\n\n    /**\n     * Get the item at the specified position in the adapter.\n     *\n     * @param position position of the item in the adapter\n     * @return fragment instance\n     */\n    public Fragment getItemAt(int position) {\n        return mPages.get(position);\n    }\n\n    /**\n     * Create a new Fragment instance.\n     * This is called inside {@link #getItem(int)}.\n     *\n     * @param position position of the item in the adapter\n     * @return fragment instance\n     */\n    protected abstract Fragment createItem(int position);\n\n    /**\n     * Create an index string for caching Fragment pages.\n     *\n     * @param index index of the item in the adapter\n     * @return key string for caching Fragment pages\n     */\n    protected String createCacheIndex(int index) {\n        return STATE_PAGE_INDEX_PREFIX + index;\n    }\n\n    /**\n     * Create a key string for caching Fragment pages.\n     *\n     * @param position position of the item in the adapter\n     * @return key string for caching Fragment pages\n     */\n    protected String createCacheKey(int position) {\n        return STATE_PAGE_KEY_PREFIX + position;\n    }\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/uiUtils/RecyclerViewPositionHelper.java",
    "content": "package com.marshalchen.ultimaterecyclerview.uiUtils;\n/**\n * RecyclerView position helper class for any LayoutManager.\n * <p/>\n * compile 'com.android.support:recyclerview-v7:22.0.0'\n */\n\nimport androidx.recyclerview.widget.OrientationHelper;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.View;\n\n/**\n * Created by hesk on 3/2/16.\n */\npublic class RecyclerViewPositionHelper {\n\n    final RecyclerView recyclerView;\n    final RecyclerView.LayoutManager layoutManager;\n\n    RecyclerViewPositionHelper(RecyclerView recyclerView) {\n        this.recyclerView = recyclerView;\n        this.layoutManager = recyclerView.getLayoutManager();\n\n    }\n\n    public static RecyclerViewPositionHelper createHelper(RecyclerView recyclerView) {\n        if (recyclerView == null) {\n            throw new NullPointerException(\"Recycler View is null\");\n        }\n        return new RecyclerViewPositionHelper(recyclerView);\n    }\n\n    /**\n     * Returns the adapter item count.\n     *\n     * @return The total number on items in a layout manager\n     */\n    public int getItemCount() {\n        return layoutManager == null ? 0 : layoutManager.getItemCount();\n    }\n\n    /**\n     * Returns the adapter position of the first visible view. This position does not include\n     * adapter changes that were dispatched after the last layout pass.\n     *\n     * @return The adapter position of the first visible item or {@link RecyclerView#NO_POSITION} if\n     * there aren't any visible items.\n     */\n    public int findFirstVisibleItemPosition() {\n        final View child = findOneVisibleChild(0, layoutManager.getChildCount(), false, true);\n        return child == null ? RecyclerView.NO_POSITION : recyclerView.getChildAdapterPosition(child);\n    }\n\n    /**\n     * Returns the adapter position of the first fully visible view. This position does not include\n     * adapter changes that were dispatched after the last layout pass.\n     *\n     * @return The adapter position of the first fully visible item or\n     * {@link RecyclerView#NO_POSITION} if there aren't any visible items.\n     */\n    public int findFirstCompletelyVisibleItemPosition() {\n        final View child = findOneVisibleChild(0, layoutManager.getChildCount(), true, false);\n        return child == null ? RecyclerView.NO_POSITION : recyclerView.getChildAdapterPosition(child);\n    }\n\n    /**\n     * Returns the adapter position of the last visible view. This position does not include\n     * adapter changes that were dispatched after the last layout pass.\n     *\n     * @return The adapter position of the last visible view or {@link RecyclerView#NO_POSITION} if\n     * there aren't any visible items\n     */\n    public int findLastVisibleItemPosition() {\n        final View child = findOneVisibleChild(layoutManager.getChildCount() - 1, -1, false, true);\n        return child == null ? RecyclerView.NO_POSITION : recyclerView.getChildAdapterPosition(child);\n    }\n\n    /**\n     * Returns the adapter position of the last fully visible view. This position does not include\n     * adapter changes that were dispatched after the last layout pass.\n     *\n     * @return The adapter position of the last fully visible view or\n     * {@link RecyclerView#NO_POSITION} if there aren't any visible items.\n     */\n    public int findLastCompletelyVisibleItemPosition() {\n        final View child = findOneVisibleChild(layoutManager.getChildCount() - 1, -1, true, false);\n        return child == null ? RecyclerView.NO_POSITION : recyclerView.getChildAdapterPosition(child);\n    }\n\n    private View findOneVisibleChild(int fromIndex, int toIndex, boolean completelyVisible,\n                                     boolean acceptPartiallyVisible) {\n        OrientationHelper helper;\n        if (layoutManager.canScrollVertically()) {\n            helper = OrientationHelper.createVerticalHelper(layoutManager);\n        } else {\n            helper = OrientationHelper.createHorizontalHelper(layoutManager);\n        }\n\n        final int start = helper.getStartAfterPadding();\n        final int end = helper.getEndAfterPadding();\n        final int next = toIndex > fromIndex ? 1 : -1;\n        View partiallyVisible = null;\n        for (int i = fromIndex; i != toIndex; i += next) {\n            final View child = layoutManager.getChildAt(i);\n            final int childStart = helper.getDecoratedStart(child);\n            final int childEnd = helper.getDecoratedEnd(child);\n            if (childStart < end && childEnd > start) {\n                if (completelyVisible) {\n                    if (childStart >= start && childEnd <= end) {\n                        return child;\n                    } else if (acceptPartiallyVisible && partiallyVisible == null) {\n                        partiallyVisible = child;\n                    }\n                } else {\n                    return child;\n                }\n            }\n        }\n        return partiallyVisible;\n    }\n\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/uiUtils/SavedStateScrolling.java",
    "content": "package com.marshalchen.ultimaterecyclerview.uiUtils;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.util.SparseIntArray;\n\n/**\n * This saved state class is a Parcelable and should not extend\n * {@link android.view.View.BaseSavedState} nor {@link android.view.AbsSavedState}\n * because its super class AbsSavedState's constructor\n * {@link android.view.AbsSavedState#AbsSavedState(Parcel)} currently passes null\n * as a class loader to read its superstate from Parcelable.\n * This causes {@link android.os.BadParcelableException} when restoring saved states.\n * The super class \"RecyclerView\" is a part of the support library,\n * and restoring its saved state requires the class loader that loaded the RecyclerView.\n * It seems that the class loader is not required when restoring from RecyclerView itself,\n * but it is required when restoring from RecyclerView's subclasses.\n */\npublic class SavedStateScrolling implements Parcelable {\n    public static final SavedStateScrolling EMPTY_STATE = new SavedStateScrolling() {\n    };\n\n    public int prevFirstVisiblePosition;\n    public int prevFirstVisibleChildHeight = -1;\n    public int prevScrolledChildrenHeight;\n    public int prevScrollY;\n    public int scrollY;\n    public SparseIntArray childrenHeights;\n\n    // This keeps the parent(RecyclerView)'s state\n    public Parcelable superState;\n\n    /**\n     * Called by EMPTY_STATE instantiation.\n     */\n    public SavedStateScrolling() {\n        superState = null;\n    }\n\n    /**\n     * Called by onSaveInstanceState.\n     *\n     * @param superState Parcelable\n     */\n    public SavedStateScrolling(Parcelable superState) {\n        this.superState = superState != EMPTY_STATE ? superState : null;\n    }\n\n    /**\n     * Called by CREATOR.\n     *\n     * @param in na\n     */\n    public SavedStateScrolling(Parcel in) {\n        // Parcel 'in' has its parent(RecyclerView)'s saved state.\n        // To restore it, class loader that loaded RecyclerView is required.\n        Parcelable superState = in.readParcelable(RecyclerView.class.getClassLoader());\n        this.superState = superState != null ? superState : EMPTY_STATE;\n\n        prevFirstVisiblePosition = in.readInt();\n        prevFirstVisibleChildHeight = in.readInt();\n        prevScrolledChildrenHeight = in.readInt();\n        prevScrollY = in.readInt();\n        scrollY = in.readInt();\n        childrenHeights = new SparseIntArray();\n        final int numOfChildren = in.readInt();\n        if (0 < numOfChildren) {\n            for (int i = 0; i < numOfChildren; i++) {\n                final int key = in.readInt();\n                final int value = in.readInt();\n                childrenHeights.put(key, value);\n            }\n        }\n    }\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    @Override\n    public void writeToParcel(Parcel out, int flags) {\n        out.writeParcelable(superState, flags);\n\n        out.writeInt(prevFirstVisiblePosition);\n        out.writeInt(prevFirstVisibleChildHeight);\n        out.writeInt(prevScrolledChildrenHeight);\n        out.writeInt(prevScrollY);\n        out.writeInt(scrollY);\n        final int numOfChildren = childrenHeights == null ? 0 : childrenHeights.size();\n        out.writeInt(numOfChildren);\n        if (0 < numOfChildren) {\n            for (int i = 0; i < numOfChildren; i++) {\n                out.writeInt(childrenHeights.keyAt(i));\n                out.writeInt(childrenHeights.valueAt(i));\n            }\n        }\n    }\n\n    public Parcelable getSuperState() {\n        return superState;\n    }\n\n    public static final Parcelable.Creator<SavedStateScrolling> CREATOR\n            = new Parcelable.Creator<SavedStateScrolling>() {\n        @Override\n        public SavedStateScrolling createFromParcel(Parcel in) {\n            return new SavedStateScrolling(in);\n        }\n\n        @Override\n        public SavedStateScrolling[] newArray(int size) {\n            return new SavedStateScrolling[size];\n        }\n    };\n}\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/uiUtils/ScrollUtils.java",
    "content": "package com.marshalchen.ultimaterecyclerview.uiUtils;\n\nimport android.os.Build;\nimport android.view.View;\nimport android.view.ViewTreeObserver;\n\n/**\n * Utilities for creating scrolling effects.\n * edited by Hesk, jjhesk\n */\npublic final class ScrollUtils {\n\n    private ScrollUtils() {\n    }\n\n    /**\n     * Return a float value within the range.\n     * This is just a wrapper for Math.min() and Math.max().\n     * This may be useful if you feel it confusing (\"Which is min and which is max?\").\n     *\n     * @param value    the target value\n     * @param minValue minimum value. If value is less than this, minValue will be returned\n     * @param maxValue maximum value. If value is greater than this, maxValue will be returned\n     * @return float value limited to the range\n     */\n    public static float getFloat(final float value, final float minValue, final float maxValue) {\n        return Math.min(maxValue, Math.max(minValue, value));\n    }\n\n    /**\n     * Create a color integer value with specified alpha.\n     * This may be useful to change alpha value of background color.\n     *\n     * @param alpha     alpha value from 0.0f to 1.0f.\n     * @param baseColor base color. alpha value will be ignored.\n     * @return a color with alpha made from base color\n     */\n    public static int getColorWithAlpha(float alpha, int baseColor) {\n        int a = Math.min(255, Math.max(0, (int) (alpha * 255))) << 24;\n        int rgb = 0x00ffffff & baseColor;\n        return a + rgb;\n    }\n\n    /**\n     * Add an OnGlobalLayoutListener for the view.\n     * This is just a convenience method for using {@code ViewTreeObserver.OnGlobalLayoutListener()}.\n     * This also handles removing listener when onGlobalLayout is called.\n     *\n     * @param view     the target view to add global layout listener\n     * @param runnable runnable to be executed after the view is laid out\n     */\n    public static void addOnGlobalLayoutListener(final View view, final Runnable runnable) {\n        ViewTreeObserver vto = view.getViewTreeObserver();\n        vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {\n            @Override\n            public void onGlobalLayout() {\n                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {\n                    view.getViewTreeObserver().removeGlobalOnLayoutListener(this);\n                } else {\n                    view.getViewTreeObserver().removeOnGlobalLayoutListener(this);\n                }\n                runnable.run();\n            }\n        });\n    }\n\n    /**\n     * Mix two colors.\n     * {@code toColor} will be {@code toAlpha/1} percent,\n     * and {@code fromColor} will be {@code (1-toAlpha)/1} percent.\n     *\n     * @param fromColor first color to be mixed\n     * @param toColor   second color to be mixed\n     * @param toAlpha   alpha value of toColor, 0.0f to 1.0f.\n     * @return mixed color value in ARGB. Alpha is fixed value (255).\n     */\n    public static int mixColors(int fromColor, int toColor, float toAlpha) {\n        float[] fromCmyk = ScrollUtils.cmykFromRgb(fromColor);\n        float[] toCmyk = ScrollUtils.cmykFromRgb(toColor);\n        float[] result = new float[4];\n        for (int i = 0; i < 4; i++) {\n            result[i] = Math.min(1, fromCmyk[i] * (1 - toAlpha) + toCmyk[i] * toAlpha);\n        }\n        return 0xff000000 + (0x00ffffff & ScrollUtils.rgbFromCmyk(result));\n    }\n\n    /**\n     * Convert RGB color to CMYK color.\n     *\n     * @param rgbColor target color\n     * @return CMYK array\n     */\n    public static float[] cmykFromRgb(int rgbColor) {\n        int red = (0xff0000 & rgbColor) >> 16;\n        int green = (0xff00 & rgbColor) >> 8;\n        int blue = (0xff & rgbColor);\n        float black = Math.min(1.0f - red / 255.0f, Math.min(1.0f - green / 255.0f, 1.0f - blue / 255.0f));\n        float cyan = 1.0f;\n        float magenta = 1.0f;\n        float yellow = 1.0f;\n        if (black != 1.0f) {\n            // black 1.0 causes zero divide\n            cyan = (1.0f - (red / 255.0f) - black) / (1.0f - black);\n            magenta = (1.0f - (green / 255.0f) - black) / (1.0f - black);\n            yellow = (1.0f - (blue / 255.0f) - black) / (1.0f - black);\n        }\n        return new float[]{cyan, magenta, yellow, black};\n    }\n\n    /**\n     * Convert CYMK color to RGB color.\n     * This method doesn't check f cmyk is not null or have 4 elements in array.\n     *\n     * @param cmyk target CYMK color. Each value should be between 0.0f to 1.0f,\n     *             and should be set in this order: cyan, magenta, yellow, black.\n     * @return ARGB color. Alpha is fixed value (255).\n     */\n    public static int rgbFromCmyk(float[] cmyk) {\n        float cyan = cmyk[0];\n        float magenta = cmyk[1];\n        float yellow = cmyk[2];\n        float black = cmyk[3];\n        int red = (int) ((1.0f - Math.min(1.0f, cyan * (1.0f - black) + black)) * 255);\n        int green = (int) ((1.0f - Math.min(1.0f, magenta * (1.0f - black) + black)) * 255);\n        int blue = (int) ((1.0f - Math.min(1.0f, yellow * (1.0f - black) + black)) * 255);\n        return ((0xff & red) << 16) + ((0xff & green) << 8) + (0xff & blue);\n    }\n}"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/java/com/marshalchen/ultimaterecyclerview/uiUtils/TouchInterceptionLayout.java",
    "content": "package com.marshalchen.ultimaterecyclerview.uiUtils;\n\nimport android.annotation.TargetApi;\nimport android.content.Context;\nimport android.graphics.PointF;\nimport android.graphics.Rect;\nimport android.os.Build;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.widget.FrameLayout;\n\n/**\n * A layout that delegates interception of touch motion events.\n * This layout is provided to move the container of Scrollable views using scroll position.\n * Please note that this class overrides or uses touch events API such as onTouchEvent,\n * onInterceptTouchEvent and dispatchTouchEvent,\n * so be careful when you handle touches with this layout.\n * Edited by jjHesk\n */\npublic class TouchInterceptionLayout extends FrameLayout {\n\n    /**\n     * Callbacks for TouchInterceptionFrameLayout.\n     */\n    public interface TouchInterceptionListener {\n        /**\n         * Determines whether the layout should intercept this event.\n         *\n         * @param ev     motion event\n         * @param moving true if this event is ACTION_MOVE type\n         * @param diffX  difference between previous X and current X, if moving is true\n         * @param diffY  difference between previous Y and current Y, if moving is true\n         * @return true if the layout should intercept\n         */\n        boolean shouldInterceptTouchEvent(MotionEvent ev, boolean moving, float diffX, float diffY);\n\n        /**\n         * Called if the down motion event is intercepted by this layout.\n         *\n         * @param ev motion event\n         */\n        void onDownMotionEvent(MotionEvent ev);\n\n        /**\n         * Called if the move motion event is intercepted by this layout.\n         *\n         * @param ev    motion event\n         * @param diffX difference between previous X and current X\n         * @param diffY difference between previous Y and current Y\n         */\n        void onMoveMotionEvent(MotionEvent ev, float diffX, float diffY);\n\n        /**\n         * Called if the up (or cancel) motion event is intercepted by this layout.\n         *\n         * @param ev motion event\n         */\n        void onUpOrCancelMotionEvent(MotionEvent ev);\n    }\n\n    private boolean mIntercepting;\n    private boolean mDownMotionEventPended;\n    private boolean mBeganFromDownMotionEvent;\n    private boolean mChildrenEventsCanceled;\n    private PointF mInitialPoint;\n    private MotionEvent mPendingDownMotionEvent;\n    private TouchInterceptionListener mTouchInterceptionListener;\n\n    public TouchInterceptionLayout(Context context) {\n        super(context);\n    }\n\n    public TouchInterceptionLayout(Context context, AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    public TouchInterceptionLayout(Context context, AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n    }\n\n    @TargetApi(Build.VERSION_CODES.LOLLIPOP)\n    public TouchInterceptionLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {\n        super(context, attrs, defStyleAttr, defStyleRes);\n    }\n\n    public void setScrollInterceptionListener(TouchInterceptionListener listener) {\n        mTouchInterceptionListener = listener;\n    }\n\n    @Override\n    public boolean onInterceptTouchEvent(MotionEvent ev) {\n        if (mTouchInterceptionListener == null) {\n            return false;\n        }\n\n        // In here, we must initialize touch state variables\n        // and ask if we should intercept this event.\n        // Whether we should intercept or not is kept for the later event handling.\n        switch (ev.getActionMasked()) {\n            case MotionEvent.ACTION_DOWN:\n                mInitialPoint = new PointF(ev.getX(), ev.getY());\n                mPendingDownMotionEvent = MotionEvent.obtainNoHistory(ev);\n                mDownMotionEventPended = true;\n                mIntercepting = mTouchInterceptionListener.shouldInterceptTouchEvent(ev, false, 0, 0);\n                mBeganFromDownMotionEvent = mIntercepting;\n                mChildrenEventsCanceled = false;\n                return mIntercepting;\n            case MotionEvent.ACTION_MOVE:\n                // ACTION_MOVE will be passed suddenly, so initialize to avoid exception.\n                if (mInitialPoint == null) {\n                    mInitialPoint = new PointF(ev.getX(), ev.getY());\n                }\n\n                // diffX and diffY are the origin of the motion, and should be difference\n                // from the position of the ACTION_DOWN event occurred.\n                float diffX = ev.getX() - mInitialPoint.x;\n                float diffY = ev.getY() - mInitialPoint.y;\n                mIntercepting = mTouchInterceptionListener.shouldInterceptTouchEvent(ev, true, diffX, diffY);\n                return mIntercepting;\n        }\n        return false;\n    }\n\n    @Override\n    public boolean onTouchEvent(MotionEvent ev) {\n        if (mTouchInterceptionListener != null) {\n            switch (ev.getActionMasked()) {\n                case MotionEvent.ACTION_DOWN:\n                    if (mIntercepting) {\n                        mTouchInterceptionListener.onDownMotionEvent(ev);\n                        duplicateTouchEventForChildren(ev);\n                        return true;\n                    }\n                    break;\n                case MotionEvent.ACTION_MOVE:\n                    // ACTION_MOVE will be passed suddenly, so initialize to avoid exception.\n                    if (mInitialPoint == null) {\n                        mInitialPoint = new PointF(ev.getX(), ev.getY());\n                    }\n\n                    // diffX and diffY are the origin of the motion, and should be difference\n                    // from the position of the ACTION_DOWN event occurred.\n                    float diffX = ev.getX() - mInitialPoint.x;\n                    float diffY = ev.getY() - mInitialPoint.y;\n                    mIntercepting = mTouchInterceptionListener.shouldInterceptTouchEvent(ev, true, diffX, diffY);\n                    if (mIntercepting) {\n                        // If this layout didn't receive ACTION_DOWN motion event,\n                        // we should generate ACTION_DOWN event with current position.\n                        if (!mBeganFromDownMotionEvent) {\n                            mBeganFromDownMotionEvent = true;\n\n                            MotionEvent event = MotionEvent.obtainNoHistory(mPendingDownMotionEvent);\n                            event.setLocation(ev.getX(), ev.getY());\n                            mTouchInterceptionListener.onDownMotionEvent(event);\n\n                            mInitialPoint = new PointF(ev.getX(), ev.getY());\n                            diffX = diffY = 0;\n                        }\n\n                        // Children's touches should be canceled\n                        if (!mChildrenEventsCanceled) {\n                            mChildrenEventsCanceled = true;\n                            duplicateTouchEventForChildren(obtainMotionEvent(ev, MotionEvent.ACTION_CANCEL));\n                        }\n\n                        mTouchInterceptionListener.onMoveMotionEvent(ev, diffX, diffY);\n\n                        // If next mIntercepting become false,\n                        // then we should generate fake ACTION_DOWN event.\n                        // Therefore we set pending flag to true as if this is a down motion event.\n                        mDownMotionEventPended = true;\n\n                        // Whether or not this event is consumed by the listener,\n                        // assume it consumed because we declared to intercept the event.\n                        return true;\n                    } else {\n                        if (mDownMotionEventPended) {\n                            mDownMotionEventPended = false;\n                            MotionEvent event = MotionEvent.obtainNoHistory(mPendingDownMotionEvent);\n                            event.setLocation(ev.getX(), ev.getY());\n                            duplicateTouchEventForChildren(ev, event);\n                        } else {\n                            duplicateTouchEventForChildren(ev);\n                        }\n\n                        // If next mIntercepting become true,\n                        // then we should generate fake ACTION_DOWN event.\n                        // Therefore we set beganFromDownMotionEvent flag to false\n                        // as if we haven't received a down motion event.\n                        mBeganFromDownMotionEvent = false;\n\n                        // Reserve children's click cancellation here if they've already canceled\n                        mChildrenEventsCanceled = false;\n                    }\n                    break;\n                case MotionEvent.ACTION_UP:\n                case MotionEvent.ACTION_CANCEL:\n                    mBeganFromDownMotionEvent = false;\n                    if (mIntercepting) {\n                        mTouchInterceptionListener.onUpOrCancelMotionEvent(ev);\n                    }\n\n                    // Children's touches should be canceled regardless of\n                    // whether or not this layout intercepted the consecutive motion events.\n                    if (!mChildrenEventsCanceled) {\n                        mChildrenEventsCanceled = true;\n                        if (mDownMotionEventPended) {\n                            mDownMotionEventPended = false;\n                            MotionEvent event = MotionEvent.obtainNoHistory(mPendingDownMotionEvent);\n                            event.setLocation(ev.getX(), ev.getY());\n                            duplicateTouchEventForChildren(ev, event);\n                        } else {\n                            duplicateTouchEventForChildren(ev);\n                        }\n                    }\n                    return true;\n            }\n        }\n        return super.onTouchEvent(ev);\n    }\n\n    private MotionEvent obtainMotionEvent(MotionEvent base, int action) {\n        MotionEvent ev = MotionEvent.obtainNoHistory(base);\n        ev.setAction(action);\n        return ev;\n    }\n\n    /**\n     * Duplicate touch events to child views.\n     * We want to dispatch a down motion event and the move events to\n     * child views, but calling dispatchTouchEvent() causes StackOverflowError.\n     * Therefore we do it manually.\n     *\n     * @param ev            motion event to be passed to children\n     * @param pendingEvents pending events like ACTION_DOWN. This will be passed to the children before ev\n     */\n    private void duplicateTouchEventForChildren(MotionEvent ev, MotionEvent... pendingEvents) {\n        if (ev == null) {\n            return;\n        }\n        for (int i = getChildCount() - 1; 0 <= i; i--) {\n            View childView = getChildAt(i);\n            if (childView != null) {\n                Rect childRect = new Rect();\n                childView.getHitRect(childRect);\n                MotionEvent event = MotionEvent.obtainNoHistory(ev);\n                if (!childRect.contains((int) event.getX(), (int) event.getY())) {\n                    continue;\n                }\n                float offsetX = -childView.getLeft();\n                float offsetY = -childView.getTop();\n                boolean consumed = false;\n                if (pendingEvents != null) {\n                    for (MotionEvent pe : pendingEvents) {\n                        if (pe != null) {\n                            MotionEvent peAdjusted = MotionEvent.obtainNoHistory(pe);\n                            peAdjusted.offsetLocation(offsetX, offsetY);\n                            consumed |= childView.dispatchTouchEvent(peAdjusted);\n                        }\n                    }\n                }\n                event.offsetLocation(offsetX, offsetY);\n                consumed |= childView.dispatchTouchEvent(event);\n                if (consumed) {\n                    break;\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/res/drawable/drag_frame.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" android:shape=\"rectangle\">\n    <solid android:color=\"@android:color/transparent\"/>\n    <stroke android:width=\"1dp\" android:color=\"#000000\" />\n</shape>"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/res/drawable/timelinedefaultmarker.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"oval\">\n    <solid android:color=\"@android:color/white\" />\n</shape>"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/res/drawable-v14/timelinedefaultmarker.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"oval\">\n    <solid android:color=\"@android:color/holo_red_dark\" />\n</shape>"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/res/layout/bottom_progressbar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <ProgressBar\n        android:id=\"@+id/bottom_progress_bar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerHorizontal=\"true\" />\n</RelativeLayout>"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/res/layout/custom_recycler_view_layout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    xmlns:fab=\"http://schemas.android.com/apk/res-auto\">\n\n    <in.srain.cube.views.ptr.PtrFrameLayout\n        android:id=\"@+id/store_house_ptr_frame\"\n        xmlns:cube_ptr=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"#333333\"\n        cube_ptr:ptr_duration_to_close=\"200\"\n        cube_ptr:ptr_duration_to_close_header=\"1000\"\n        cube_ptr:ptr_keep_header_when_refresh=\"true\"\n        cube_ptr:ptr_pull_to_fresh=\"false\"\n        cube_ptr:ptr_ratio_of_header_height_to_refresh=\"1.2\"\n        cube_ptr:ptr_resistance=\"1.7\">\n\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/ultimate_list\"\n            android:background=\"#ffffff\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:scrollbars=\"vertical\"/>\n\n    </in.srain.cube.views.ptr.PtrFrameLayout>\n\n    <com.marshalchen.ultimaterecyclerview.ui.floatingactionbutton.AddFloatingActionButton\n        android:id=\"@+id/defaultFloatingActionButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentRight=\"true\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_marginRight=\"15dp\"\n        android:layout_marginBottom=\"15dp\"\n        android:visibility=\"gone\"\n        fab:plusIconColor=\"#808080\"\n        fab:urv_fab_colorNormal=\"#ffffff\" />\n\n    <ViewStub\n        android:id=\"@+id/floatingActionViewStub\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentRight=\"true\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_marginRight=\"15dp\"\n        android:layout_marginBottom=\"15dp\"\n        android:visibility=\"gone\" />\n\n\n    <ViewStub\n        android:id=\"@+id/emptyview\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_centerInParent=\"true\"\n        android:visibility=\"gone\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/res/layout/empty_progressbar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"0dp\"\n    android:layout_height=\"0dp\">\n</RelativeLayout>"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/res/layout/horizontal_recycler_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015. Sevan Joe\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~    http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<androidx.recyclerview.widget.RecyclerView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/ultimate_list\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:scrollbars=\"horizontal\">\n\n</androidx.recyclerview.widget.RecyclerView>\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/res/layout/slm_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"10dp\"\n    android:orientation=\"horizontal\">\n\n    <TextView\n        android:id=\"@+id/title_text\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_vertical\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"1\"\n        android:paddingLeft=\"@dimen/header_padding\"\n        android:paddingRight=\"@dimen/header_padding\"\n        android:textColor=\"@color/grey\"\n        android:textStyle=\"bold\" />\n\n</LinearLayout>"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/res/layout/swipeable_ultimate_recycler_view_layout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    xmlns:fab=\"http://schemas.android.com/apk/res-auto\">\n\n    <com.marshalchen.ultimaterecyclerview.ui.VerticalSwipeRefreshLayout\n        android:layout_width=\"match_parent\"\n        android:id=\"@+id/swipe_refresh_layout\"\n        android:layout_height=\"match_parent\">\n\n        <com.marshalchen.ultimaterecyclerview.swipelistview.SwipeListView\n            android:id=\"@+id/ultimate_list\"\n            android:focusableInTouchMode=\"true\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"/>\n\n    </com.marshalchen.ultimaterecyclerview.ui.VerticalSwipeRefreshLayout>\n\n    <com.marshalchen.ultimaterecyclerview.ui.floatingactionbutton.AddFloatingActionButton\n        android:id=\"@+id/defaultFloatingActionButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentRight=\"true\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_marginRight=\"15dp\"\n        android:layout_marginBottom=\"15dp\"\n        android:visibility=\"gone\"\n        fab:plusIconColor=\"#808080\"\n        fab:urv_fab_colorNormal=\"#ffffff\" />\n\n    <ViewStub\n        android:id=\"@+id/floatingActionViewStub\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentRight=\"true\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_marginRight=\"15dp\"\n        android:layout_marginBottom=\"15dp\"\n        android:visibility=\"gone\" />\n\n\n    <ViewStub\n        android:id=\"@+id/emptyview\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_centerInParent=\"true\"\n        android:visibility=\"gone\" />\n</RelativeLayout>"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/res/layout/ultimate_recycler_view_layout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    xmlns:fab=\"http://schemas.android.com/apk/res-auto\">\n\n    <com.marshalchen.ultimaterecyclerview.ui.VerticalSwipeRefreshLayout\n        android:layout_width=\"match_parent\"\n        android:id=\"@+id/swipe_refresh_layout\"\n        android:layout_height=\"match_parent\">\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/ultimate_list\"\n            android:focusableInTouchMode=\"true\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"/>\n\n    </com.marshalchen.ultimaterecyclerview.ui.VerticalSwipeRefreshLayout>\n\n    <com.marshalchen.ultimaterecyclerview.ui.floatingactionbutton.AddFloatingActionButton\n        android:id=\"@+id/defaultFloatingActionButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentRight=\"true\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_marginRight=\"15dp\"\n        android:layout_marginBottom=\"15dp\"\n        android:visibility=\"gone\"\n        fab:plusIconColor=\"#808080\"\n        fab:urv_fab_colorNormal=\"#ffffff\" />\n\n    <ViewStub\n        android:id=\"@+id/floatingActionViewStub\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentRight=\"true\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_marginRight=\"15dp\"\n        android:layout_marginBottom=\"15dp\"\n        android:visibility=\"gone\" />\n\n\n    <ViewStub\n        android:id=\"@+id/emptyview\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_centerInParent=\"true\"\n        android:visibility=\"gone\" />\n</RelativeLayout>"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/res/layout/vertical_recycler_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015. Sevan Joe\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~    http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<androidx.recyclerview.widget.RecyclerView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/ultimate_list\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:scrollbars=\"vertical\">\n\n</androidx.recyclerview.widget.RecyclerView>\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <declare-styleable name=\"UltimateRecyclerview\">\n        <attr name=\"recyclerviewClipToPadding\" format=\"boolean\" />\n        <attr name=\"recyclerviewPadding\" format=\"dimension\" />\n        <attr name=\"recyclerviewPaddingTop\" format=\"dimension\" />\n        <attr name=\"recyclerviewPaddingBottom\" format=\"dimension\" />\n        <attr name=\"recyclerviewPaddingLeft\" format=\"dimension\" />\n        <attr name=\"recyclerviewPaddingRight\" format=\"dimension\" />\n        <attr name=\"recyclerviewEmptyView\" format=\"reference\" />\n        <attr name=\"recyclerviewFloatingActionView\" format=\"reference\" />\n        <attr name=\"recyclerviewScrollbars\" format=\"enum\">\n            <enum name=\"none\" value=\"0\" />\n            <enum name=\"vertical\" value=\"1\" />\n            <enum name=\"horizontal\" value=\"2\" />\n        </attr>\n        <attr name=\"recyclerviewDefaultSwipeColor\" format=\"reference\"></attr>\n    </declare-styleable>\n\n    <declare-styleable name=\"AddFloatingActionButton\">\n        <attr name=\"plusIconColor\" format=\"color\" />\n    </declare-styleable>\n    <declare-styleable name=\"FloatingActionsMenu\">\n        <attr name=\"addButtonColorPressed\" format=\"color\" />\n        <attr name=\"addButtonColorNormal\" format=\"color\" />\n        <attr name=\"addButtonPlusIconColor\" format=\"color\" />\n        <attr name=\"addButtonIsHorizontal\" format=\"boolean\" />\n    </declare-styleable>\n\n    <declare-styleable name=\"FloatActionButton\">\n        <attr name=\"urv_fab_colorPressed\" format=\"color\" />\n        <attr name=\"urv_fab_colorNormal\" format=\"color\" />\n        <attr name=\"urv_fab_alphaPressed\" format=\"float\" />\n        <attr name=\"urv_fab_alphaNormal\" format=\"float\" />\n        <attr name=\"icon\" />\n        <attr name=\"urv_fab_size\" format=\"enum\">\n            <enum name=\"normal\" value=\"0\" />\n            <enum name=\"mini\" value=\"1\" />\n            <enum name=\"noshadow\" value=\"2\" />\n        </attr>\n    </declare-styleable>\n\n    <declare-styleable name=\"SwipeListView\">\n        <attr name=\"swipeOpenOnLongPress\" format=\"boolean\" />\n        <attr name=\"onlyOneOpenedWhenSwipe\" format=\"boolean\" />\n        <attr name=\"swipeAnimationTime\" format=\"integer\" />\n        <attr name=\"swipeOffsetLeft\" format=\"dimension\" />\n        <attr name=\"swipeOffsetRight\" format=\"dimension\" />\n        <attr name=\"swipeCloseAllItemsWhenMoveList\" format=\"boolean\" />\n        <attr name=\"swipeFrontView\" format=\"reference\" />\n        <attr name=\"swipeBackView\" format=\"reference\" />\n        <attr name=\"swipeMode\" format=\"enum\">\n            <enum name=\"none\" value=\"0\" />\n            <enum name=\"both\" value=\"1\" />\n            <enum name=\"right\" value=\"2\" />\n            <enum name=\"left\" value=\"3\" />\n        </attr>\n        <attr name=\"swipeActionLeft\" format=\"enum\">\n            <enum name=\"reveal\" value=\"0\" />\n            <enum name=\"dismiss\" value=\"1\" />\n            <enum name=\"choice\" value=\"2\" />\n        </attr>\n        <attr name=\"swipeActionRight\" format=\"enum\">\n            <enum name=\"reveal\" value=\"0\" />\n            <enum name=\"dismiss\" value=\"1\" />\n            <enum name=\"choice\" value=\"2\" />\n        </attr>\n        <attr name=\"swipeDrawableChecked\" format=\"reference\" />\n        <attr name=\"swipeDrawableUnchecked\" format=\"reference\" />\n    </declare-styleable>\n\n    <declare-styleable name=\"SwipeLayout\">\n        <attr name=\"drag_edge\">\n            <flag name=\"left\" value=\"1\" />\n            <flag name=\"right\" value=\"2\" />\n            <flag name=\"top\" value=\"4\" />\n            <flag name=\"bottom\" value=\"8\" />\n        </attr>\n        <attr name=\"leftEdgeSwipeOffset\" format=\"dimension\" />\n        <attr name=\"rightEdgeSwipeOffset\" format=\"dimension\" />\n        <attr name=\"topEdgeSwipeOffset\" format=\"dimension\" />\n        <attr name=\"bottomEdgeSwipeOffset\" format=\"dimension\" />\n        <attr name=\"show_mode\" format=\"enum\">\n            <enum name=\"lay_down\" value=\"0\" />\n            <enum name=\"pull_out\" value=\"1\" />\n        </attr>\n        <attr name=\"clickToClose\" format=\"boolean\" />\n    </declare-styleable>\n\n\n    <declare-styleable name=\"timeline_style\" >\n        <attr name=\"tls_marker\" format=\"color|reference\"/>\n        <attr name=\"tls_line\" format=\"color|reference\"/>\n        <attr name=\"tls_marker_size\" format=\"dimension\"/>\n        <attr name=\"tls_line_size\" format=\"dimension\"/>\n    </declare-styleable>\n\n</resources>"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/res/values/color.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"grey\">#994d4d4d</color>\n</resources>"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/res/values/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <dimen name=\"fab_size_normal\">56dp</dimen>\n    <dimen name=\"fab_size_mini\">40dp</dimen>\n    <dimen name=\"fab_icon_size\">24dp</dimen>\n    <dimen name=\"fab_plus_icon_size\">14dp</dimen>\n    <dimen name=\"fab_plus_icon_stroke\">2dp</dimen>\n    <dimen name=\"fab_shadow_offset\">3dp</dimen>\n    <dimen name=\"fab_shadow_radius\">9dp</dimen>\n    <dimen name=\"fab_stroke_width\">0.5dp</dimen>\n    <dimen name=\"fab_actions_spacing\">16dp</dimen>\n    <dimen name=\"fab_shadow_size\">8dp</dimen>\n    <dimen name=\"fab_mini_shadow_size\">6dp</dimen>\n    <dimen name=\"fab_min_significant_scroll\">4dp</dimen>\n\n    <!-- the expandable things -->\n    <dimen name=\"item_margin\">16dp</dimen>\n    <dimen name=\"expand_size\">8dp</dimen>\n    <!--header padding-->\n    <dimen name=\"header_padding\">8dp</dimen>\n</resources>"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/res/values/ids.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <item name=\"fab_expand_menu_button\" type=\"id\" />\n    <item name=\"recyclerview_swipe\" type=\"id\" />\n\n    <item name=\"exp_section_title\" type=\"id\" />\n    <item name=\"exp_indication_arrow\" type=\"id\" />\n    <item name=\"exp_section_notification_number\" type=\"id\" />\n    <item name=\"exp_section_ripple_wrapper_click\" type=\"id\" />\n    <item name=\"exp_section_adjustment_layout\" type=\"id\" />\n\n    <item name=\"urv_main_list\" type=\"id\" />\n    <item name=\"urv_main_progress_bar\" type=\"id\" />\n\n</resources>\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">UltimateRecyclerView</string>\n</resources>\n"
  },
  {
    "path": "UltimateRecyclerView/ultimaterecyclerview/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>\n"
  },
  {
    "path": "UpcomingChanges.md",
    "content": "### Upcoming changes in 0.4.2:\n\n- [ ] change an other sticky header for optimization\n- [ ] setSwipeToDismissCallback() throws a null pointer exception if there is no adapter set;\n- [ ] trigger to bring the item back when swipe to dismiss\n- [x] auto judge loadmore or header in adatper\n- [ ] swipe position judge\n- [ ] make ``swapAdapter`` more intelligent \n- [ ] Customize height and width\n- [ ] Traditional header\n- [ ] Swipe to dismiss color\n- [x] Make adapter more easy to use\n- [x] Expandble feature\n- [ ] Change toolbar into CollapsingToolbarLayout\n- [ ] Swipe with undo action\n- [ ] fix related bugs\n\n### Other changes:\n\n* More animations\n* add swipe to refresh at the bottom\n* etc...\n\n\n\nIf you have some good idea, please tell us.My email is cymcsg # gmail.com.And it is a good idea to put your idea on the issue.\n"
  },
  {
    "path": "_config.yml",
    "content": "theme: jekyll-theme-cayman"
  }
]