├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── andview │ │ └── example │ │ └── ApplicationTest.java │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── andview │ │ └── example │ │ ├── DensityUtil.java │ │ ├── FlowView.java │ │ ├── IndexPageAdapter.java │ │ ├── ScrollAdapter.java │ │ ├── StickyListBean.java │ │ ├── StickylistAdapter.java │ │ ├── Utils.java │ │ ├── activity │ │ ├── CarCrmActivity.java │ │ ├── CustomViewActivity.java │ │ ├── EmptyViewActivity.java │ │ ├── GridViewActivity.java │ │ ├── HeadAdActivity.java │ │ ├── JDActivity.java │ │ ├── ListViewActivity.java │ │ ├── MainActivity.java │ │ ├── NotFullScreenActivity.java │ │ ├── NotFullScreenWithoutFooterActivity.java │ │ ├── PluseActivity.java │ │ ├── RainDropActivity.java │ │ ├── RecyclerViewsActivity.java │ │ ├── ScrollViewActivity.java │ │ ├── SmileViewActivity.java │ │ ├── TaoBaoActivity.java │ │ ├── WebViewActivity.java │ │ ├── WineActivity.java │ │ └── recyclerview │ │ │ ├── BannerRecyclerViewActivity.java │ │ │ ├── GridRecyclerViewActivity.java │ │ │ ├── LinearRecyclerViewActivity.java │ │ │ ├── MultiItemRecyclerViewActivity.java │ │ │ ├── ShowFooterWhenNoMoreDataRecyclerViewActivity.java │ │ │ ├── SilenceRecyclerViewActivity.java │ │ │ ├── StaggeredRecyclerViewActivity.java │ │ │ └── WithoutBaseAdapterRecyclerViewActivity.java │ │ ├── recylerview │ │ ├── MultiItemAdapter.java │ │ ├── NormalRecyclerAdapter.java │ │ ├── Person.java │ │ └── SimpleAdapter.java │ │ ├── stickyListHeaders │ │ ├── AdapterWrapper.java │ │ ├── ApiLevelTooLowException.java │ │ ├── CheckableWrapperView.java │ │ ├── SectionIndexerAdapterWrapper.java │ │ ├── StickyListHeadersAdapter.java │ │ ├── StickyListHeadersListView.java │ │ ├── WrapperView.java │ │ └── WrapperViewList.java │ │ ├── ui │ │ ├── AdHeader.java │ │ ├── BannerViewPager.java │ │ ├── CustomFooterView.java │ │ ├── CustomGifHeader.java │ │ ├── CustomHeader.java │ │ ├── GifView.java │ │ ├── MaterialProgressDrawable.java │ │ ├── NoMoreDataFooterView.java │ │ ├── SlideCutListView.java │ │ ├── raindrop │ │ │ ├── Circle.java │ │ │ ├── CustomerFooter.java │ │ │ ├── RainDropHeader.java │ │ │ └── RainDropView.java │ │ └── smileyloadingview │ │ │ ├── SmileyHeaderView.java │ │ │ └── SmileyLoadingView.java │ │ └── view │ │ ├── EatPluseView.java │ │ ├── XRefreshViewCarHeader.java │ │ ├── XRefreshViewJDHeader.java │ │ └── XRefreshViewWineHeader.java │ └── res │ ├── drawable-hdpi │ └── refresh_arrow.png │ ├── drawable-xhdpi │ ├── colors_refresh_00.png │ ├── colors_refresh_01.png │ ├── colors_refresh_02.png │ ├── colors_refresh_03.png │ ├── colors_refresh_04.png │ ├── colors_refresh_05.png │ ├── colors_refresh_06.png │ ├── colors_refresh_07.png │ ├── colors_refresh_08.png │ ├── colors_refresh_09.png │ ├── colors_refresh_10.png │ ├── colors_refresh_11.png │ ├── colors_refresh_12.png │ ├── colors_refresh_13.png │ ├── colors_refresh_14.png │ ├── colors_refresh_15.png │ ├── colors_refresh_16.png │ ├── colors_refresh_17.png │ ├── colors_refresh_18.png │ ├── colors_refresh_19.png │ ├── colors_refresh_20.png │ ├── colors_refresh_21.png │ ├── colors_refresh_22.png │ ├── colors_refresh_23.png │ ├── colors_refresh_24.png │ ├── colors_refresh_25.png │ ├── colors_refresh_icon.png │ ├── jd_package.png │ ├── jd_person.png │ ├── jd_person_package_1.png │ ├── jd_person_package_2.png │ ├── jd_person_package_3.png │ ├── loading_1.png │ ├── loading_2.png │ ├── water_point_left.png │ └── water_point_right.png │ ├── drawable │ ├── colors_refresh_loading.xml │ ├── jd_loading.xml │ └── wine_loading.xml │ ├── layout │ ├── activity_banner_recylerview.xml │ ├── activity_car_crm.xml │ ├── activity_customview.xml │ ├── activity_emptyview.xml │ ├── activity_gridview.xml │ ├── activity_jd.xml │ ├── activity_listview.xml │ ├── activity_main.xml │ ├── activity_pluse.xml │ ├── activity_recyclerviews.xml │ ├── activity_recylerview.xml │ ├── activity_recylerview2.xml │ ├── activity_scrollview.xml │ ├── activity_tao_bao.xml │ ├── activity_webview.xml │ ├── activity_wine.xml │ ├── adapter_scrollview.xml │ ├── bannerview.xml │ ├── custom_footer.xml │ ├── gif_header.xml │ ├── header_top_layout.xml │ ├── headerview.xml │ ├── home_ads_view.xml │ ├── item_left_recylerview.xml │ ├── item_recylerview.xml │ ├── item_right_recylerview.xml │ ├── item_sticky.xml │ ├── item_sticky_header.xml │ ├── layout_emptyview.xml │ ├── smiley_headerview.xml │ ├── waterdroplistview_header.xml │ ├── xrefreshview_car_header.xml │ ├── xrefreshview_jd_header.xml │ └── xrefreshview_wine_header.xml │ ├── menu │ ├── main.xml │ └── menu_empty.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ ├── test01.png │ ├── test02.png │ └── test03.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── raw │ ├── circles.gif │ ├── horizontal.gif │ └── vertical.gif │ ├── values-w820dp │ └── dimens.xml │ └── values │ ├── attrs.xml │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── gif ├── car_refresh.gif ├── jd_refresh.gif ├── wine_refresh.gif ├── xrefresh_banner.gif ├── xrefresh_customview.gif ├── xrefresh_gridlayout.gif ├── xrefresh_gridview.gif ├── xrefresh_linearlayout.gif ├── xrefresh_releasetoloadmore.gif ├── xrefresh_smile.gif └── xrefresh_staggeredlayout.gif ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── library ├── .gitignore ├── build.gradle ├── gradle-jcenter-push.gradle ├── gradle.properties ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── andview │ │ └── refreshview │ │ └── ApplicationTest.java │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── andview │ │ └── refreshview │ │ ├── ScrollRunner.java │ │ ├── XRefreshContentView.java │ │ ├── XRefreshHolder.java │ │ ├── XRefreshView.java │ │ ├── XRefreshViewFooter.java │ │ ├── XRefreshViewHeader.java │ │ ├── XRefreshViewState.java │ │ ├── XScrollView.java │ │ ├── callback │ │ ├── IFooterCallBack.kt │ │ └── IHeaderCallBack.kt │ │ ├── listener │ │ ├── OnBottomLoadMoreTime.kt │ │ └── OnTopRefreshTime.kt │ │ ├── recyclerview │ │ ├── BaseRecyclerAdapter.java │ │ ├── RecyclerViewDataObserver.java │ │ └── XSpanSizeLookup.java │ │ ├── utils │ │ ├── LogUtils.java │ │ └── Utils.java │ │ └── view │ │ └── XWebView.kt │ └── res │ ├── drawable-hdpi │ ├── xrefresh_ok.png │ └── xrefreshview_arrow.png │ ├── layout │ ├── xrefreshview_footer.xml │ └── xrefreshview_header.xml │ └── values │ ├── attrs.xml │ ├── dimens.xml │ └── strings.xml └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | # Android generated 2 | bin/ 3 | gen/ 4 | 5 | # Maven 6 | target/ 7 | pom.xml.* 8 | release.properties 9 | 10 | # Eclipse 11 | .classpath 12 | .project 13 | .externalToolBuilders/ 14 | .apt_generated/ 15 | 16 | # IntelliJ 17 | *.iml 18 | *.ipr 19 | *.iws 20 | .idea/ 21 | out/ 22 | output/ 23 | .gitignore.orig 24 | .project.bak 25 | .settings/org.eclipse.core.resources.prefs 26 | .settings/org.eclipse.core.runtime.prefs 27 | .settings/org.eclipse.jdt.apt.core.prefs 28 | .settings/org.eclipse.jdt.core.prefs 29 | .settings/org.eclipse.jdt.launching.prefs 30 | .settings/ 31 | .properties 32 | 33 | # Ant 34 | build.xml 35 | local.properties 36 | .idea/workspace.xml 37 | /.idea/libraries 38 | .DS_Store 39 | .gradle 40 | build/ 41 | 42 | # key info: 43 | ultimateandroid.jks 44 | keystore.properties 45 | gradleinfo.properties 46 | 47 | 48 | # Ignore Gradle GUI config 49 | gradle-app.setting 50 | manifest-merger-release-report.txt 51 | *.apk -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # XRefreshView 2 | 3 | ### Usage 4 | ---- 5 | 6 | #### Gradle 7 | 8 | ```groovy 9 | dependencies { 10 | compile 'com.huxq17.xrefreshview:xrefreshview:3.6.9' 11 | //依赖下面的库 12 | implementation 'androidx.recyclerview:recyclerview:1.1.0' 13 | } 14 | ``` 15 | 16 | ## 最新的使用说明请移步[我的博客](http://blog.csdn.net/footballclub/article/details/46982115 "description") 17 | 18 | ## 效果图 19 | 20 | |松开加载更多的Recyclerview|带Banner的Recyclerview| LinearLayout样式的Recyclerview| 21 | |:-----|:-----|:-----| 22 | | | | | 23 | 24 | |GridLayout样式的Recyclerview|Staggered样式的Recyclerview| 25 | |:-----|:-----| 26 | | | | 27 | 28 | |GridView|自定义View|笑脸刷新| 29 | |:-----|:-----|:-----| 30 | | | || 31 | 32 | |自定义刷新|仿京东刷新|自定义刷新| 33 | |:-----|:-----|:-----| 34 | | | | | 35 | 36 | 37 | 还有listview,scrollview,webview等其他的view就不一一截图了。**建议把此项目下载下来,然后跑到手机上看效果,例子都在app module里。** 38 | 39 | ### 更新日志:
40 | 41 | 2020-6-13: 42 | 1.更新android平台到androidx 43 | 44 | 45 | 2017-5-4: 46 | 1.解决已无更多数据显示不出来的问题,fix issue[#78](https://github.com/huxq17/XRefreshView/issues/78) 47 | 2.升级到3.6.9版本 48 | 49 | 2017-5-3: 50 | 1.解决xrefreshview不满屏的时候footerview正常状态下出现在屏幕上的问题,fix issue[#75](https://github.com/huxq17/XRefreshView/issues/75) 51 | 2.升级到3.6.8版本 52 | 53 | 2017-4-25: 54 | 1.通过使用XWebView,解决在三星c5、小米5等机型在webview上加XRefreshView,会出现加载更多没有效果的现象,详见issue[#72](https://github.com/huxq17/XRefreshView/issues/72) 55 | 2.升级到3.6.7版本 56 | 57 | 2017-4-14: 58 | 1.解决Recyclerview频繁上拉加载时会出现footerview位置异常的问题 59 | 2.给setSilenceLoadMore方法添加boolean参数,可以启用和禁用静默加载模式 60 | 3.升级到3.6.6版本 61 | 62 | 2017-3-28: 63 | 1.不再强制Recyclerview使用BaseRecyclerAdapter,当不使用BaseRecyclerAdapter时,RecyclerView会被当成普通view 64 | 上拉加载等操作和普通view相同,空布局等功能的使用方式也和普通view相同 65 | 2.解决ListView的子项目不足一屏时,上拉时再下拉会出现布局突然缩回的问题 66 | 3.升级到3.6.5版本 67 | 68 | 2017-3-27: 69 | 1.解决事先setPullRefreshEnable(false),再setPullRefreshEnable(true)和startRefresh()时,headerview无法显示的问题 70 | 2.升级到3.6.3版本 71 | 72 | 2017-2-17: 73 | 1.添加下拉刷新时的回调onRefresh(boolean isPullDown),其中isPullDown用来判断此次下拉刷新是不是由下拉手势触发的,true则代表是, 74 | 反之则是自动刷新或者是调用XRefreshView#startRefresh()}触发的刷新 75 | 2.升级到3.6.2版本 76 | 77 | 2017-2-16: 78 | 1.解决issue[#58](https://github.com/huxq17/XRefreshView/issues/58) 79 | 80 | 2017-1-13: 81 | 1.解决Recyclerview使用StaggeredGridLayoutManager时,添加的headerview不能使用全部宽度的问题(headview layout won't use all span area) 82 | 83 | 2017-1-6: 84 | 1.解决issue[#49](https://github.com/huxq17/XRefreshView/issues/49) 85 | 86 | 2017-1-4: 87 | 1.解决AbsListview数据不满一屏的时候,会重复加载更多的问题 88 | 89 | 2016-12-15: 90 | 1.优化非RecyclerView上拉加载回弹的效果,同时支持AbsListView(ListView、GridView)加载更多数据完成之后露出新加载的数据 91 | 92 | 2016-9-28: 93 | 1.添加xscrollview的滑动监听 94 | 95 | 2016-9-6: 96 | 1.解决issue[#36](https://github.com/huxq17/XRefreshView/issues/36) 97 | 98 | 2016-8-19: 99 | 1.添加没有数据时显示空布局的支持 100 | 2.解决6.0以下的手机,在调用startRefresh()方法后,刷新时headerview有时会不显示的问题 101 | 3.其他一些优化 102 | 103 | 2016-8-8: 104 | 1.添加下拉刷新,数据接收失败的ui处理 105 | 2.解决下拉刷新,在刷新状态下把headerview完全隐藏掉,在刷新结束以后下拉和上拉都不可用的问题 106 | 107 | 108 | ### 关于我 109 | 邮箱:huxq17@163.com fanyafeng@live.cn 110 |    ps:有问题联系我的话请不要问我在不在,直接说问题,谢谢。 111 | 112 | ### License 113 | 114 | Copyright (C) 2015 huxq17 115 | 116 | Licensed under the Apache License, Version 2.0 (the "License"); 117 | you may not use this file except in compliance with the License. 118 | You may obtain a copy of the License at 119 | 120 | http://www.apache.org/licenses/LICENSE-2.0 121 | 122 | Unless required by applicable law or agreed to in writing, software 123 | distributed under the License is distributed on an "AS IS" BASIS, 124 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 125 | See the License for the specific language governing permissions and 126 | limitations under the License. 127 | 128 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | 4 | android { 5 | compileSdkVersion 29 6 | buildToolsVersion "29.0.3" 7 | 8 | defaultConfig { 9 | applicationId "com.andview.example" 10 | minSdkVersion 19 11 | targetSdkVersion 29 12 | versionCode 1 13 | versionName "1.0" 14 | } 15 | buildTypes { 16 | release { 17 | minifyEnabled false 18 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 19 | } 20 | } 21 | lintOptions { 22 | abortOnError false 23 | } 24 | } 25 | dependencies { 26 | implementation fileTree(include: ['*.jar'], dir: 'libs') 27 | implementation project(':library') 28 | // compile 'com.huxq17.xrefreshview:xrefreshview:3.6.9' 29 | //依赖下面的库 30 | implementation 'androidx.recyclerview:recyclerview:1.1.0' 31 | implementation 'androidx.cardview:cardview:1.0.0' 32 | implementation 'androidx.appcompat:appcompat:1.1.0' 33 | implementation "androidx.core:core-ktx:+" 34 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 35 | } 36 | repositories { 37 | mavenCentral() 38 | } 39 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in E:\tools\adt-bundle-windows-x86-20140702\Sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/andview/example/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.andview.example; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 12 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 44 | 47 | 50 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/DensityUtil.java: -------------------------------------------------------------------------------- 1 | package com.andview.example; 2 | 3 | import android.content.Context; 4 | 5 | public class DensityUtil { 6 | 7 | /** 8 | * 根据手机的分辨率从 dp 的单位 转成为 px(像素) 9 | */ 10 | public static int dip2px(Context context, float dpValue) { 11 | final float scale = context.getResources().getDisplayMetrics().density; 12 | return (int) (dpValue * scale + 0.5f); 13 | } 14 | 15 | /** 16 | * 根据手机的分辨率从 px(像素) 的单位 转成为 dp 17 | */ 18 | public static int px2dip(Context context, float pxValue) { 19 | final float scale = context.getResources().getDisplayMetrics().density; 20 | return (int) (pxValue / scale + 0.5f); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/IndexPageAdapter.java: -------------------------------------------------------------------------------- 1 | package com.andview.example; 2 | 3 | import android.content.Context; 4 | import android.os.Parcelable; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.ImageView; 9 | import android.widget.ImageView.ScaleType; 10 | 11 | import androidx.viewpager.widget.PagerAdapter; 12 | 13 | public class IndexPageAdapter extends PagerAdapter { 14 | 15 | private int[] images; 16 | private Context mContext; 17 | private LayoutInflater mInflater; 18 | 19 | public IndexPageAdapter(Context context, int[] images) { 20 | this.mContext = context; 21 | this.images = images; 22 | mInflater = LayoutInflater.from(mContext); 23 | } 24 | 25 | @Override 26 | public void destroyItem(ViewGroup container, int position, Object object) { 27 | container.removeView((View) object); 28 | } 29 | 30 | @Override 31 | public void finishUpdate(View container) { 32 | } 33 | 34 | @Override 35 | public int getCount() { 36 | return Integer.MAX_VALUE; 37 | } 38 | 39 | @Override 40 | public Object instantiateItem(ViewGroup view, int position) { 41 | View imageLayout = mInflater.inflate(R.layout.home_ads_view, view, false); 42 | ImageView imageView = (ImageView) imageLayout 43 | .findViewById(R.id.ads_view); 44 | imageView.setScaleType(ScaleType.FIT_XY); 45 | final int index = position % images.length; 46 | imageView.setBackgroundResource(images[index]); 47 | 48 | view.addView(imageLayout, 0); 49 | 50 | return imageLayout; 51 | } 52 | 53 | @Override 54 | public boolean isViewFromObject(View view, Object object) { 55 | return view.equals(object); 56 | } 57 | 58 | @Override 59 | public void restoreState(Parcelable state, ClassLoader loader) { 60 | } 61 | 62 | @Override 63 | public Parcelable saveState() { 64 | return null; 65 | } 66 | 67 | @Override 68 | public void startUpdate(View container) { 69 | } 70 | 71 | } 72 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/ScrollAdapter.java: -------------------------------------------------------------------------------- 1 | package com.andview.example; 2 | 3 | import android.content.Context; 4 | import android.os.Parcelable; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.LinearLayout; 9 | import android.widget.ScrollView; 10 | import android.widget.TextView; 11 | 12 | import androidx.viewpager.widget.PagerAdapter; 13 | 14 | import com.andview.example.ui.raindrop.CustomerFooter; 15 | import com.andview.refreshview.XRefreshView; 16 | import com.andview.refreshview.XScrollView; 17 | 18 | public class ScrollAdapter extends PagerAdapter { 19 | 20 | private int[] images; 21 | private Context mContext; 22 | private LayoutInflater mInflater; 23 | 24 | public ScrollAdapter(Context context) { 25 | this.mContext = context; 26 | mInflater = LayoutInflater.from(mContext); 27 | } 28 | 29 | @Override 30 | public void destroyItem(ViewGroup container, int position, Object object) { 31 | container.removeView((View) object); 32 | } 33 | 34 | @Override 35 | public void finishUpdate(View container) { 36 | } 37 | 38 | @Override 39 | public int getCount() { 40 | return Integer.MAX_VALUE; 41 | } 42 | 43 | @Override 44 | public Object instantiateItem(ViewGroup view, int position) { 45 | final View imageLayout = mInflater.inflate(R.layout.adapter_scrollview, view, false); 46 | final XRefreshView outView = (XRefreshView) imageLayout.findViewById(R.id.custom_view); 47 | final XScrollView scrollView = (XScrollView) imageLayout.findViewById(R.id.xscrollview); 48 | scrollView.setOnScrollListener(new XScrollView.OnScrollListener() { 49 | @Override 50 | public void onScrollStateChanged(ScrollView view, int scrollState, boolean arriveBottom) { 51 | } 52 | 53 | @Override 54 | public void onScroll(int l, int t, int oldl, int oldt) { 55 | } 56 | }); 57 | outView.setAutoRefresh(false); 58 | outView.setPullLoadEnable(true); 59 | outView.setPinnedTime(1000); 60 | outView.setAutoLoadMore(false); 61 | // outView.setSilenceLoadMore(); 62 | outView.setXRefreshViewListener(new XRefreshView.SimpleXRefreshListener() { 63 | @Override 64 | public void onLoadMore(boolean isSilence) { 65 | imageLayout.postDelayed(new Runnable() { 66 | @Override 67 | public void run() { 68 | outView.stopLoadMore(); 69 | } 70 | }, 2000); 71 | } 72 | 73 | @Override 74 | public void onRefresh(boolean isPullDown) { 75 | imageLayout.postDelayed(new Runnable() { 76 | @Override 77 | public void run() { 78 | outView.stopRefresh(); 79 | } 80 | }, 2000); 81 | } 82 | }); 83 | outView.setCustomFooterView(new CustomerFooter(mContext)); 84 | LinearLayout ll = (LinearLayout) imageLayout.findViewById(R.id.ll); 85 | for (int i = 0; i < 50; i++) { 86 | TextView tv = new TextView(mContext); 87 | tv.setTextIsSelectable(true); 88 | tv.setText("数据" + i); 89 | ll.addView(tv); 90 | } 91 | view.addView(imageLayout, 0); 92 | 93 | return imageLayout; 94 | } 95 | 96 | @Override 97 | public boolean isViewFromObject(View view, Object object) { 98 | return view.equals(object); 99 | } 100 | 101 | @Override 102 | public void restoreState(Parcelable state, ClassLoader loader) { 103 | } 104 | 105 | @Override 106 | public Parcelable saveState() { 107 | return null; 108 | } 109 | 110 | @Override 111 | public void startUpdate(View container) { 112 | } 113 | 114 | } 115 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/StickyListBean.java: -------------------------------------------------------------------------------- 1 | package com.andview.example; 2 | 3 | public class StickyListBean { 4 | public int section; 5 | public String YM; 6 | public String content; 7 | public StickyListBean(int section,String YM,String content){ 8 | this.section = section; 9 | this.YM = YM; 10 | this.content = content; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/StickylistAdapter.java: -------------------------------------------------------------------------------- 1 | package com.andview.example; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.BaseAdapter; 8 | import android.widget.SectionIndexer; 9 | import android.widget.TextView; 10 | 11 | import com.andview.example.stickyListHeaders.StickyListHeadersAdapter; 12 | import java.util.ArrayList; 13 | import java.util.List; 14 | 15 | public class StickylistAdapter extends BaseAdapter implements 16 | StickyListHeadersAdapter, SectionIndexer { 17 | private List list = new ArrayList(); 18 | private ViewHolder mHolder; 19 | private LayoutInflater mInflater; 20 | 21 | public StickylistAdapter(Context context, List list) { 22 | this.list = list; 23 | mInflater = LayoutInflater.from(context); 24 | } 25 | 26 | @Override 27 | public int getCount() { 28 | return list.size(); 29 | } 30 | 31 | public void setData(List alarmList) { 32 | this.list = alarmList; 33 | } 34 | 35 | @Override 36 | public StickyListBean getItem(int position) { 37 | return list.get(position); 38 | } 39 | 40 | @Override 41 | public long getItemId(int position) { 42 | return position; 43 | } 44 | 45 | @Override 46 | public View getView(final int position, View convertView, ViewGroup parent) { 47 | mHolder = null; 48 | if (convertView == null) { 49 | convertView = mInflater 50 | .inflate(R.layout.item_sticky, parent, false); 51 | mHolder = new ViewHolder(); 52 | mHolder.tvTime = (TextView) convertView.findViewById(R.id.item); 53 | convertView.setTag(mHolder); 54 | } else { 55 | mHolder = (ViewHolder) convertView.getTag(); 56 | } 57 | StickyListBean info = getItem(position); 58 | mHolder.tvTime.setText(info.content); 59 | return convertView; 60 | } 61 | 62 | public static class ViewHolder { 63 | private TextView tvTime; 64 | } 65 | 66 | @Override 67 | public Object[] getSections() { 68 | return null; 69 | } 70 | 71 | @Override 72 | public int getPositionForSection(int sectionIndex) { 73 | return 0; 74 | } 75 | 76 | @Override 77 | public int getSectionForPosition(int position) { 78 | if (position < getCount()) { 79 | return getItem(position).section; 80 | } 81 | return 0; 82 | } 83 | 84 | @Override 85 | public View getHeaderView(int position, View convertView, ViewGroup parent) { 86 | HeaderViewHolder holder; 87 | 88 | if (convertView == null) { 89 | holder = new HeaderViewHolder(); 90 | convertView = mInflater.inflate(R.layout.item_sticky_header, 91 | parent, false); 92 | holder.text = (TextView) convertView.findViewById(R.id.header); 93 | convertView.setTag(holder); 94 | } else { 95 | holder = (HeaderViewHolder) convertView.getTag(); 96 | } 97 | 98 | String headerText = getItem(position).YM; 99 | holder.text.setText(headerText); 100 | 101 | return convertView; 102 | } 103 | 104 | @Override 105 | public long getHeaderId(int position) { 106 | if (position < getCount()) { 107 | return getItem(position).section; 108 | } 109 | return 0; 110 | } 111 | 112 | static class HeaderViewHolder { 113 | TextView text; 114 | } 115 | 116 | } 117 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/Utils.java: -------------------------------------------------------------------------------- 1 | package com.andview.example; 2 | 3 | import android.graphics.Bitmap; 4 | import android.graphics.Canvas; 5 | import android.graphics.PixelFormat; 6 | import android.graphics.drawable.Drawable; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | 10 | /** 11 | * Created by Administrator on 2015/8/24. 12 | */ 13 | public class Utils { 14 | /** 15 | * Map a value within a given range to another range. 16 | * 17 | * @param value the value to map 18 | * @param fromLow the low end of the range the value is within 19 | * @param fromHigh the high end of the range the value is within 20 | * @param toLow the low end of the range to map to 21 | * @param toHigh the high end of the range to map to 22 | * @return the mapped value 23 | */ 24 | public static double mapValueFromRangeToRange( 25 | double value, 26 | double fromLow, 27 | double fromHigh, 28 | double toLow, 29 | double toHigh) { 30 | double fromRangeSize = fromHigh - fromLow; 31 | double toRangeSize = toHigh - toLow; 32 | double valueScale = (value - fromLow) / fromRangeSize; 33 | return toLow + (valueScale * toRangeSize); 34 | } 35 | 36 | /** 37 | * set margins of the specific view 38 | * 39 | * @param target 40 | * @param l 41 | * @param t 42 | * @param r 43 | * @param b 44 | */ 45 | public static void setMargin(View target, int l, int t, int r, int b) { 46 | if (target.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) { 47 | ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) target.getLayoutParams(); 48 | p.setMargins(l, t, r, b); 49 | target.requestLayout(); 50 | } 51 | } 52 | 53 | /** 54 | * convert drawable to bitmap 55 | * 56 | * @param drawable 57 | * @return 58 | */ 59 | public static Bitmap drawableToBitmap(Drawable drawable) { 60 | int width = drawable.getIntrinsicWidth(); 61 | int height = drawable.getIntrinsicHeight(); 62 | Bitmap bitmap = Bitmap.createBitmap(width, height, drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565); 63 | Canvas canvas = new Canvas(bitmap); 64 | drawable.setBounds(0, 0, width, height); 65 | drawable.draw(canvas); 66 | return bitmap; 67 | 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/activity/CarCrmActivity.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.activity; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.os.Handler; 6 | 7 | import com.andview.example.R; 8 | import com.andview.example.view.XRefreshViewCarHeader; 9 | import com.andview.refreshview.XRefreshView; 10 | 11 | public class CarCrmActivity extends Activity { 12 | 13 | private XRefreshView carCrmXRefreshView; 14 | 15 | @Override 16 | protected void onCreate(Bundle savedInstanceState) { 17 | super.onCreate(savedInstanceState); 18 | setContentView(R.layout.activity_car_crm); 19 | initView(); 20 | initData(); 21 | } 22 | 23 | private void initView() { 24 | carCrmXRefreshView = (XRefreshView) findViewById(R.id.carCrmXRefreshView); 25 | carCrmXRefreshView.setCustomHeaderView(new XRefreshViewCarHeader(this)); 26 | carCrmXRefreshView.setMoveForHorizontal(true); 27 | } 28 | 29 | private void initData() { 30 | carCrmXRefreshView.setAutoRefresh(false); 31 | carCrmXRefreshView.setPullRefreshEnable(true); 32 | carCrmXRefreshView.setMoveForHorizontal(true); 33 | carCrmXRefreshView.setXRefreshViewListener(new XRefreshView.SimpleXRefreshListener() { 34 | @Override 35 | public void onRefresh(boolean isPullDown) { 36 | super.onRefresh(isPullDown); 37 | new Handler().postDelayed(new Runnable() { 38 | @Override 39 | public void run() { 40 | carCrmXRefreshView.stopRefresh(); 41 | } 42 | }, 2000); 43 | } 44 | }); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/activity/CustomViewActivity.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.activity; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.os.Handler; 6 | import android.view.View; 7 | import android.widget.AbsListView; 8 | import android.widget.AbsListView.OnScrollListener; 9 | 10 | import com.andview.example.R; 11 | import com.andview.example.StickyListBean; 12 | import com.andview.example.StickylistAdapter; 13 | import com.andview.example.stickyListHeaders.StickyListHeadersListView; 14 | import com.andview.example.ui.CustomHeader; 15 | import com.andview.example.ui.smileyloadingview.SmileyHeaderView; 16 | import com.andview.refreshview.XRefreshView; 17 | import com.andview.refreshview.listener.OnBottomLoadMoreTime; 18 | import com.andview.refreshview.listener.OnTopRefreshTime; 19 | 20 | import java.util.ArrayList; 21 | import java.util.List; 22 | 23 | public class CustomViewActivity extends Activity { 24 | private StickyListHeadersListView stickyLv; 25 | private List list = new ArrayList(); 26 | private XRefreshView refreshView; 27 | private int mTotalItemCount; 28 | private StickylistAdapter adapter; 29 | private final int mPinnedTime = 1000; 30 | 31 | 32 | @Override 33 | public void onCreate(Bundle savedInstanceState) { 34 | super.onCreate(savedInstanceState); 35 | setContentView(R.layout.activity_customview); 36 | initData(); 37 | stickyLv = (StickyListHeadersListView) findViewById(R.id.sticky_list); 38 | adapter = new StickylistAdapter(getApplicationContext(), list); 39 | stickyLv.setAdapter(adapter); 40 | refreshView = (XRefreshView) findViewById(R.id.custom_view); 41 | refreshView.setPullLoadEnable(true); 42 | refreshView.setAutoRefresh(true); 43 | refreshView.setPinnedTime(mPinnedTime); 44 | refreshView.setCustomHeaderView(new SmileyHeaderView(this)); 45 | refreshView.setCustomHeaderView(new CustomHeader(CustomViewActivity.this,mPinnedTime)); 46 | refreshView.setOnTopRefreshTime(new OnTopRefreshTime() { 47 | 48 | @Override 49 | public boolean isTop() { 50 | if (stickyLv.getFirstVisiblePosition() == 0) { 51 | View firstVisibleChild = stickyLv.getListChildAt(0); 52 | return firstVisibleChild.getTop() >= 0; 53 | } 54 | return false; 55 | } 56 | }); 57 | refreshView.setOnBottomLoadMoreTime(new OnBottomLoadMoreTime() { 58 | 59 | @Override 60 | public boolean isBottom() { 61 | if (stickyLv.getLastVisiblePosition() == mTotalItemCount - 1) { 62 | View lastChild = stickyLv.getListChildAt(stickyLv.getListChildCount() - 1); 63 | return (lastChild.getBottom() + stickyLv.getPaddingBottom()) <= stickyLv.getMeasuredHeight(); 64 | } 65 | //没有到达底部则返回false 66 | return false; 67 | } 68 | }); 69 | stickyLv.setOnScrollListener(new OnScrollListener() { 70 | 71 | @Override 72 | public void onScrollStateChanged(AbsListView view, int scrollState) { 73 | 74 | } 75 | 76 | @Override 77 | public void onScroll(AbsListView view, int firstVisibleItem, 78 | int visibleItemCount, int totalItemCount) { 79 | mTotalItemCount = totalItemCount; 80 | } 81 | }); 82 | refreshView.setXRefreshViewListener(new XRefreshView.SimpleXRefreshListener() { 83 | 84 | @Override 85 | public void onRefresh(boolean isPullDown) { 86 | 87 | new Handler().postDelayed(new Runnable() { 88 | @Override 89 | public void run() { 90 | refreshView.stopRefresh(); 91 | } 92 | }, 2000); 93 | } 94 | 95 | @Override 96 | public void onLoadMore(boolean isSilence) { 97 | 98 | new Handler().postDelayed(new Runnable() { 99 | 100 | @Override 101 | public void run() { 102 | refreshView.stopLoadMore(); 103 | } 104 | }, 2000); 105 | } 106 | }); 107 | } 108 | 109 | int section = 0; 110 | String YM = null; 111 | String content = null; 112 | 113 | private void initData() { 114 | 115 | for (int i = 0; i < 20; i++) { 116 | if (i % 5 == 0) { 117 | section++; 118 | YM = "第" + section + "个头"; 119 | } 120 | content = "第" + i + "项数据"; 121 | StickyListBean bean = new StickyListBean(section, YM, content); 122 | list.add(bean); 123 | } 124 | 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/activity/GridViewActivity.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.activity; 2 | 3 | import android.annotation.SuppressLint; 4 | import android.app.Activity; 5 | import android.os.Build; 6 | import android.os.Bundle; 7 | import android.os.Handler; 8 | import android.view.Menu; 9 | import android.view.MenuItem; 10 | import android.widget.ArrayAdapter; 11 | import android.widget.GridView; 12 | 13 | import com.andview.example.R; 14 | import com.andview.example.ui.raindrop.CustomerFooter; 15 | import com.andview.refreshview.XRefreshView; 16 | import com.andview.refreshview.XRefreshView.SimpleXRefreshListener; 17 | 18 | import java.util.ArrayList; 19 | import java.util.List; 20 | import java.util.Random; 21 | 22 | public class GridViewActivity extends Activity { 23 | private GridView gv; 24 | private List str_name = new ArrayList(); 25 | private XRefreshView xRefreshView; 26 | private ArrayAdapter adapter; 27 | 28 | @Override 29 | public void onCreate(Bundle savedInstanceState) { 30 | super.onCreate(savedInstanceState); 31 | setContentView(R.layout.activity_gridview); 32 | for (int i = 0; i < 50; i++) { 33 | str_name.add("数据" + i); 34 | } 35 | gv = (GridView) findViewById(R.id.gv); 36 | xRefreshView = (XRefreshView) findViewById(R.id.custom_view); 37 | xRefreshView.setPullLoadEnable(true); 38 | //设置在上拉加载被禁用的情况下,是否允许界面被上拉 39 | // xRefreshView.setMoveFootWhenDisablePullLoadMore(false); 40 | adapter = new ArrayAdapter(this, 41 | android.R.layout.simple_list_item_1, str_name); 42 | gv.setAdapter(adapter); 43 | xRefreshView.setPinnedTime(1000); 44 | xRefreshView.setAutoLoadMore(false); 45 | // xRefreshView.setCustomHeaderView(new CustomHeader(this)); 46 | // xRefreshView.setCustomHeaderView(new XRefreshViewHeader(this)); 47 | xRefreshView.setMoveForHorizontal(true); 48 | xRefreshView.setCustomFooterView(new CustomerFooter(this)); 49 | // xRefreshView.setPinnedContent(true); 50 | //设置当非RecyclerView上拉加载完成以后的回弹时间 51 | xRefreshView.setScrollBackDuration(300); 52 | xRefreshView.setXRefreshViewListener(new SimpleXRefreshListener() { 53 | @Override 54 | public void onRefresh(boolean isPullDown) { 55 | 56 | new Handler().postDelayed(new Runnable() { 57 | @Override 58 | public void run() { 59 | //模拟数据加载失败的情况 60 | Random random = new Random(); 61 | boolean success = random.nextBoolean(); 62 | if (success) { 63 | xRefreshView.stopRefresh(); 64 | } else { 65 | xRefreshView.stopRefresh(false); 66 | } 67 | //或者 68 | // xRefreshView.stopRefresh(success); 69 | } 70 | }, 2000); 71 | } 72 | 73 | @Override 74 | public void onLoadMore(boolean isSilence) { 75 | final List addlist = new ArrayList(); 76 | for (int i = 0; i < 20; i++) { 77 | addlist.add("数据" + (i + str_name.size())); 78 | } 79 | 80 | new Handler().postDelayed(new Runnable() { 81 | 82 | @SuppressLint("NewApi") 83 | @Override 84 | public void run() { 85 | if (str_name.size() <= 90) { 86 | if (Build.VERSION.SDK_INT >= 11) { 87 | adapter.addAll(addlist); 88 | } 89 | xRefreshView.stopLoadMore(); 90 | } else { 91 | xRefreshView.setLoadComplete(true); 92 | } 93 | } 94 | }, 2000); 95 | } 96 | }); 97 | } 98 | 99 | @Override 100 | protected void onResume() { 101 | super.onResume(); 102 | xRefreshView.startRefresh(); 103 | } 104 | 105 | @Override 106 | public boolean onCreateOptionsMenu(Menu menu) { 107 | // 加载菜单 108 | getMenuInflater().inflate(R.menu.main, menu); 109 | return true; 110 | } 111 | 112 | @Override 113 | public boolean onOptionsItemSelected(MenuItem item) { 114 | int menuId = item.getItemId(); 115 | switch (menuId) { 116 | case R.id.menu_clear: 117 | str_name.clear(); 118 | for (int i = 0; i < 50; i++) { 119 | str_name.add("数据" + i); 120 | } 121 | adapter.notifyDataSetChanged(); 122 | xRefreshView.setLoadComplete(false); 123 | break; 124 | case R.id.menu_refresh: 125 | xRefreshView.startRefresh(); 126 | break; 127 | 128 | default: 129 | break; 130 | } 131 | return super.onOptionsItemSelected(item); 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/activity/HeadAdActivity.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.activity; 2 | 3 | import android.annotation.SuppressLint; 4 | import android.app.Activity; 5 | import android.os.Build; 6 | import android.os.Bundle; 7 | import android.os.Handler; 8 | import android.view.Menu; 9 | import android.view.MenuItem; 10 | import android.widget.ArrayAdapter; 11 | import android.widget.GridView; 12 | 13 | import com.andview.example.IndexPageAdapter; 14 | import com.andview.example.R; 15 | import com.andview.example.ui.AdHeader; 16 | import com.andview.example.ui.BannerViewPager; 17 | import com.andview.example.ui.raindrop.CustomerFooter; 18 | import com.andview.refreshview.XRefreshView; 19 | import com.andview.refreshview.XRefreshView.SimpleXRefreshListener; 20 | 21 | import java.util.ArrayList; 22 | import java.util.List; 23 | 24 | public class HeadAdActivity extends Activity { 25 | private GridView gv; 26 | private List str_name = new ArrayList(); 27 | private XRefreshView outView; 28 | private ArrayAdapter adapter; 29 | private BannerViewPager mLoopViewPager; 30 | private AdHeader headerView; 31 | private int[] mImageIds = new int[]{R.mipmap.test01, R.mipmap.test02, 32 | R.mipmap.test03};// 测试图片id 33 | 34 | @Override 35 | public void onCreate(Bundle savedInstanceState) { 36 | super.onCreate(savedInstanceState); 37 | setContentView(R.layout.activity_gridview); 38 | for (int i = 0; i < 50; i++) { 39 | str_name.add("数据" + i); 40 | } 41 | gv = (GridView) findViewById(R.id.gv); 42 | outView = (XRefreshView) findViewById(R.id.custom_view); 43 | 44 | headerView = new AdHeader(this); 45 | mLoopViewPager = (BannerViewPager) headerView.findViewById(R.id.index_viewpager); 46 | initViewPager(); 47 | 48 | outView.setPullLoadEnable(true); 49 | adapter = new ArrayAdapter(this, 50 | android.R.layout.simple_list_item_1, str_name); 51 | gv.setAdapter(adapter); 52 | outView.setPinnedTime(1000); 53 | // outView.setAutoLoadMore(false); 54 | outView.setCustomHeaderView(headerView); 55 | outView.setCustomFooterView(new CustomerFooter(this)); 56 | // outView.setCustomHeaderView(new XRefreshViewHeader(this)); 57 | outView.setMoveForHorizontal(true); 58 | // outView.setPinnedContent(true); 59 | outView.setXRefreshViewListener(new SimpleXRefreshListener() { 60 | @Override 61 | public void onRefresh(boolean isPullDown) { 62 | 63 | new Handler().postDelayed(new Runnable() { 64 | @Override 65 | public void run() { 66 | outView.stopRefresh(); 67 | } 68 | }, 2000); 69 | } 70 | 71 | @Override 72 | public void onLoadMore(boolean isSilence) { 73 | final List addlist = new ArrayList(); 74 | for (int i = 0; i < 20; i++) { 75 | addlist.add("数据" + (i + str_name.size())); 76 | } 77 | 78 | new Handler().postDelayed(new Runnable() { 79 | 80 | @SuppressLint("NewApi") 81 | @Override 82 | public void run() { 83 | if (str_name.size() <= 70) { 84 | if (Build.VERSION.SDK_INT >= 11) { 85 | str_name.addAll(addlist); 86 | adapter.addAll(addlist); 87 | } 88 | outView.stopLoadMore(); 89 | } else { 90 | outView.setLoadComplete(true); 91 | } 92 | } 93 | }, 2000); 94 | } 95 | }); 96 | } 97 | 98 | @Override 99 | protected void onResume() { 100 | super.onResume(); 101 | outView.startRefresh(); 102 | } 103 | 104 | @Override 105 | public boolean onCreateOptionsMenu(Menu menu) { 106 | // 加载菜单 107 | getMenuInflater().inflate(R.menu.main, menu); 108 | return true; 109 | } 110 | 111 | @Override 112 | public boolean onOptionsItemSelected(MenuItem item) { 113 | int menuId = item.getItemId(); 114 | switch (menuId) { 115 | case R.id.menu_clear: 116 | str_name.clear(); 117 | for (int i = 0; i < 50; i++) { 118 | str_name.add("数据" + i); 119 | } 120 | adapter.notifyDataSetChanged(); 121 | outView.setLoadComplete(false); 122 | break; 123 | case R.id.menu_refresh: 124 | outView.startRefresh(); 125 | break; 126 | 127 | default: 128 | break; 129 | } 130 | return super.onOptionsItemSelected(item); 131 | } 132 | 133 | private void initViewPager() { 134 | IndexPageAdapter pageAdapter = new IndexPageAdapter(this, mImageIds); 135 | mLoopViewPager.setAdapter(pageAdapter); 136 | } 137 | } 138 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/activity/ListViewActivity.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.activity; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.os.Handler; 6 | import android.widget.AbsListView; 7 | import android.widget.AbsListView.OnScrollListener; 8 | import android.widget.ArrayAdapter; 9 | import android.widget.ListView; 10 | import android.widget.Toast; 11 | 12 | import com.andview.example.R; 13 | import com.andview.refreshview.XRefreshView; 14 | import com.andview.refreshview.XRefreshView.SimpleXRefreshListener; 15 | import com.andview.refreshview.utils.LogUtils; 16 | 17 | import java.util.ArrayList; 18 | import java.util.List; 19 | 20 | public class ListViewActivity extends Activity { 21 | private ListView lv; 22 | private List str_name = new ArrayList(); 23 | private XRefreshView refreshView; 24 | private ArrayAdapter adapter; 25 | public static long lastRefreshTime; 26 | 27 | @Override 28 | public void onCreate(Bundle savedInstanceState) { 29 | super.onCreate(savedInstanceState); 30 | setContentView(R.layout.activity_listview); 31 | for (int i = 0; i < 3; i++) { 32 | str_name.add("数据" + i); 33 | } 34 | lv = (ListView) findViewById(R.id.lv); 35 | refreshView = (XRefreshView) findViewById(R.id.custom_view); 36 | 37 | adapter = new ArrayAdapter(this, 38 | android.R.layout.simple_list_item_1, str_name); 39 | lv.setAdapter(adapter); 40 | 41 | // 设置是否可以下拉刷新 42 | refreshView.setPullRefreshEnable(false); 43 | // 设置是否可以上拉加载 44 | refreshView.setPullLoadEnable(false); 45 | // 设置上次刷新的时间 46 | refreshView.restoreLastRefreshTime(lastRefreshTime); 47 | //当下拉刷新被禁用时,调用这个方法并传入false可以不让头部被下拉 48 | refreshView.setMoveHeadWhenDisablePullRefresh(true); 49 | // 设置时候可以自动刷新 50 | refreshView.setAutoRefresh(false); 51 | // refreshView.setOnBottomLoadMoreTime(new OnBottomLoadMoreTime() { 52 | // @Override 53 | // public boolean isBottom() { 54 | // return false; 55 | // } 56 | // }); 57 | 58 | refreshView.setXRefreshViewListener(new SimpleXRefreshListener() { 59 | @Override 60 | public void onRefresh(boolean isPullDown) { 61 | new Handler().postDelayed(new Runnable() { 62 | @Override 63 | public void run() { 64 | refreshView.stopRefresh(); 65 | lastRefreshTime = refreshView.getLastRefreshTime(); 66 | } 67 | }, 2000); 68 | } 69 | 70 | @Override 71 | public void onLoadMore(boolean isSilence) { 72 | new Handler().postDelayed(new Runnable() { 73 | 74 | @Override 75 | public void run() { 76 | refreshView.stopLoadMore(); 77 | } 78 | }, 2000); 79 | } 80 | 81 | @Override 82 | public void onRelease(float direction) { 83 | super.onRelease(direction); 84 | if (direction > 0) { 85 | toast("下拉"); 86 | } else { 87 | toast("上拉"); 88 | } 89 | } 90 | }); 91 | refreshView.setOnAbsListViewScrollListener(new OnScrollListener() { 92 | 93 | @Override 94 | public void onScrollStateChanged(AbsListView view, int scrollState) { 95 | LogUtils.i("onScrollStateChanged"); 96 | } 97 | 98 | @Override 99 | public void onScroll(AbsListView view, int firstVisibleItem, 100 | int visibleItemCount, int totalItemCount) { 101 | LogUtils.i("onScroll"); 102 | } 103 | }); 104 | 105 | } 106 | 107 | public void toast(String msg) { 108 | Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show(); 109 | } 110 | 111 | } -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/activity/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.activity; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | import android.view.View; 7 | 8 | import com.andview.example.R; 9 | import com.andview.example.view.EatPluseView; 10 | import com.andview.refreshview.utils.LogUtils; 11 | 12 | public class MainActivity extends Activity { 13 | 14 | @Override 15 | public void onCreate(Bundle savedInstanceState) { 16 | super.onCreate(savedInstanceState); 17 | setContentView(R.layout.activity_main); 18 | //如果不想XRefreshView后台输出log,此处传入false即可 19 | LogUtils.enableLog(true); 20 | } 21 | 22 | public void onClick(View v) { 23 | Intent intent = null; 24 | switch (v.getId()) { 25 | case R.id.bt_list: 26 | intent = new Intent(this, ListViewActivity.class); 27 | break; 28 | case R.id.bt_gridview: 29 | intent = new Intent(this, GridViewActivity.class); 30 | break; 31 | case R.id.bt_webView: 32 | intent = new Intent(this, WebViewActivity.class); 33 | break; 34 | case R.id.bt_customview: 35 | intent = new Intent(this, CustomViewActivity.class); 36 | break; 37 | case R.id.bt_recylerView: 38 | intent = new Intent(this, RecyclerViewsActivity.class); 39 | break; 40 | case R.id.bt_scrollview: 41 | intent = new Intent(this, ScrollViewActivity.class); 42 | break; 43 | case R.id.bt_headAd: 44 | intent = new Intent(this, HeadAdActivity.class); 45 | break; 46 | case R.id.bt_not_full_screen: 47 | intent = new Intent(this, NotFullScreenActivity.class); 48 | break; 49 | case R.id.bt_not_fullscreen_nofooter: 50 | intent = new Intent(this, NotFullScreenWithoutFooterActivity.class); 51 | break; 52 | case R.id.bt_emptyview: 53 | intent = new Intent(this, EmptyViewActivity.class); 54 | break; 55 | case R.id.bt_smileview: 56 | intent = new Intent(this, SmileViewActivity.class); 57 | break; 58 | case R.id.bt_rain: 59 | // intent = new Intent(this, RainDropActivity.class); 60 | break; 61 | 62 | case R.id.bt_wine: 63 | intent = new Intent(this, WineActivity.class); 64 | break; 65 | case R.id.bt_jd: 66 | intent = new Intent(this, JDActivity.class); 67 | break; 68 | case R.id.bt_carcrm: 69 | intent = new Intent(this, CarCrmActivity.class); 70 | break; 71 | case R.id.bt_pluse: 72 | intent = new Intent(this, PluseActivity.class); 73 | break; 74 | default: 75 | break; 76 | } 77 | if (intent != null) { 78 | startActivity(intent); 79 | } 80 | 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/activity/PluseActivity.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.activity; 2 | 3 | import android.os.Bundle; 4 | import android.app.Activity; 5 | 6 | import com.andview.example.R; 7 | 8 | public class PluseActivity extends Activity { 9 | 10 | @Override 11 | protected void onCreate(Bundle savedInstanceState) { 12 | super.onCreate(savedInstanceState); 13 | setContentView(R.layout.activity_pluse); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/activity/RainDropActivity.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.activity; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.os.Handler; 6 | import android.widget.LinearLayout; 7 | import android.widget.TextView; 8 | 9 | import com.andview.example.R; 10 | import com.andview.example.ui.raindrop.RainDropHeader; 11 | import com.andview.refreshview.XRefreshView; 12 | import com.andview.refreshview.XRefreshView.SimpleXRefreshListener; 13 | 14 | public class RainDropActivity extends Activity { 15 | private XRefreshView outView; 16 | private LinearLayout ll; 17 | private int count = 1; 18 | 19 | @Override 20 | public void onCreate(Bundle savedInstanceState) { 21 | super.onCreate(savedInstanceState); 22 | setContentView(R.layout.adapter_scrollview); 23 | 24 | outView = (XRefreshView) findViewById(R.id.custom_view); 25 | ll = (LinearLayout) findViewById(R.id.ll); 26 | outView.setPullLoadEnable(true); 27 | outView.setAutoRefresh(false); 28 | outView.setAutoLoadMore(false); 29 | outView.setCustomHeaderView(new RainDropHeader(this)); 30 | outView.setXRefreshViewListener(new SimpleXRefreshListener() { 31 | 32 | @Override 33 | public void onRefresh(boolean isPullDown) { 34 | 35 | new Handler().postDelayed(new Runnable() { 36 | @Override 37 | public void run() { 38 | outView.stopRefresh(); 39 | } 40 | }, 2000); 41 | } 42 | 43 | @Override 44 | public void onLoadMore(boolean isSilence) { 45 | new Handler().postDelayed(new Runnable() { 46 | @Override 47 | public void run() { 48 | //setLoadComplete不要和stopLoadMore同时调用 49 | if (count > 1) { 50 | outView.setLoadComplete(true); 51 | } else { 52 | outView.stopLoadMore(); 53 | } 54 | count++; 55 | } 56 | }, 2000); 57 | } 58 | }); 59 | for (int i = 0; i < 50; i++) { 60 | TextView tv = new TextView(this); 61 | tv.setTextIsSelectable(true); 62 | tv.setText("数据" + i); 63 | ll.addView(tv); 64 | } 65 | } 66 | 67 | } 68 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/activity/RecyclerViewsActivity.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.activity; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | import android.view.View; 7 | 8 | import com.andview.example.R; 9 | import com.andview.example.activity.recyclerview.BannerRecyclerViewActivity; 10 | import com.andview.example.activity.recyclerview.GridRecyclerViewActivity; 11 | import com.andview.example.activity.recyclerview.LinearRecyclerViewActivity; 12 | import com.andview.example.activity.recyclerview.MultiItemRecyclerViewActivity; 13 | import com.andview.example.activity.recyclerview.ShowFooterWhenNoMoreDataRecyclerViewActivity; 14 | import com.andview.example.activity.recyclerview.SilenceRecyclerViewActivity; 15 | import com.andview.example.activity.recyclerview.StaggeredRecyclerViewActivity; 16 | import com.andview.example.activity.recyclerview.WithoutBaseAdapterRecyclerViewActivity; 17 | 18 | public class RecyclerViewsActivity extends Activity { 19 | 20 | @Override 21 | public void onCreate(Bundle savedInstanceState) { 22 | super.onCreate(savedInstanceState); 23 | setContentView(R.layout.activity_recyclerviews); 24 | } 25 | 26 | public void onClick(View v) { 27 | Intent intent = null; 28 | switch (v.getId()) { 29 | case R.id.bt_linear: 30 | intent = new Intent(this, LinearRecyclerViewActivity.class); 31 | break; 32 | case R.id.bt_grid: 33 | intent = new Intent(this, GridRecyclerViewActivity.class); 34 | break; 35 | case R.id.bt_staggered: 36 | intent = new Intent(this, StaggeredRecyclerViewActivity.class); 37 | break; 38 | case R.id.bt_banner: 39 | intent = new Intent(this, BannerRecyclerViewActivity.class); 40 | break; 41 | case R.id.bt_slience: 42 | intent = new Intent(this, SilenceRecyclerViewActivity.class); 43 | break; 44 | case R.id.bt_multi_item: 45 | intent = new Intent(this, MultiItemRecyclerViewActivity.class); 46 | break; 47 | case R.id.bt_without_baseRecyclerAdapter: 48 | intent = new Intent(this, WithoutBaseAdapterRecyclerViewActivity.class); 49 | break; 50 | case R.id.bt_showFooter_noMoreData: 51 | intent = new Intent(this, ShowFooterWhenNoMoreDataRecyclerViewActivity.class); 52 | break; 53 | default: 54 | break; 55 | } 56 | if (intent != null) { 57 | startActivity(intent); 58 | } 59 | 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/activity/ScrollViewActivity.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.activity; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.view.Menu; 6 | import android.view.MenuItem; 7 | 8 | import androidx.viewpager.widget.ViewPager; 9 | 10 | import com.andview.example.R; 11 | import com.andview.example.ScrollAdapter; 12 | 13 | public class ScrollViewActivity extends Activity { 14 | private ViewPager mViewPager; 15 | 16 | @Override 17 | public void onCreate(Bundle savedInstanceState) { 18 | super.onCreate(savedInstanceState); 19 | setContentView(R.layout.activity_scrollview); 20 | mViewPager = (ViewPager) findViewById(R.id.index_viewpager); 21 | ScrollAdapter adapter = new ScrollAdapter(this); 22 | mViewPager.setAdapter(adapter); 23 | 24 | } 25 | 26 | @Override 27 | public boolean onCreateOptionsMenu(Menu menu) { 28 | // 加载菜单 29 | getMenuInflater().inflate(R.menu.main, menu); 30 | return true; 31 | } 32 | 33 | @Override 34 | public boolean onOptionsItemSelected(MenuItem item) { 35 | return super.onOptionsItemSelected(item); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/activity/SmileViewActivity.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.activity; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.os.Handler; 6 | import android.view.View; 7 | import android.widget.AbsListView; 8 | import android.widget.AbsListView.OnScrollListener; 9 | 10 | import com.andview.example.R; 11 | import com.andview.example.StickyListBean; 12 | import com.andview.example.StickylistAdapter; 13 | import com.andview.example.stickyListHeaders.StickyListHeadersListView; 14 | import com.andview.example.ui.raindrop.CustomerFooter; 15 | import com.andview.example.ui.smileyloadingview.SmileyHeaderView; 16 | import com.andview.refreshview.XRefreshView; 17 | import com.andview.refreshview.listener.OnBottomLoadMoreTime; 18 | import com.andview.refreshview.listener.OnTopRefreshTime; 19 | 20 | import java.util.ArrayList; 21 | import java.util.List; 22 | 23 | public class SmileViewActivity extends Activity { 24 | private StickyListHeadersListView stickyLv; 25 | private List list = new ArrayList(); 26 | private XRefreshView refreshView; 27 | private int mTotalItemCount; 28 | private StickylistAdapter adapter; 29 | private final int mPinnedTime = 1000; 30 | 31 | 32 | @Override 33 | public void onCreate(Bundle savedInstanceState) { 34 | super.onCreate(savedInstanceState); 35 | setContentView(R.layout.activity_customview); 36 | initData(); 37 | stickyLv = (StickyListHeadersListView) findViewById(R.id.sticky_list); 38 | adapter = new StickylistAdapter(getApplicationContext(), list); 39 | stickyLv.setAdapter(adapter); 40 | refreshView = (XRefreshView) findViewById(R.id.custom_view); 41 | refreshView.setPullLoadEnable(true); 42 | refreshView.setPinnedTime(mPinnedTime); 43 | refreshView.setCustomHeaderView(new SmileyHeaderView(this)); 44 | refreshView.setCustomFooterView(new CustomerFooter(SmileViewActivity.this)); 45 | refreshView.setOnTopRefreshTime(new OnTopRefreshTime() { 46 | 47 | @Override 48 | public boolean isTop() { 49 | if (stickyLv.getFirstVisiblePosition() == 0) { 50 | View firstVisibleChild = stickyLv.getListChildAt(0); 51 | return firstVisibleChild.getTop() >= 0; 52 | } 53 | return false; 54 | } 55 | }); 56 | refreshView.setOnBottomLoadMoreTime(new OnBottomLoadMoreTime() { 57 | 58 | @Override 59 | public boolean isBottom() { 60 | if (stickyLv.getLastVisiblePosition() == mTotalItemCount - 1) { 61 | View lastChild = stickyLv.getListChildAt(stickyLv.getListChildCount() - 1); 62 | return (lastChild.getBottom() + stickyLv.getPaddingBottom()) <= stickyLv.getMeasuredHeight(); 63 | } 64 | return false; 65 | } 66 | }); 67 | stickyLv.setOnScrollListener(new OnScrollListener() { 68 | 69 | @Override 70 | public void onScrollStateChanged(AbsListView view, int scrollState) { 71 | 72 | } 73 | 74 | @Override 75 | public void onScroll(AbsListView view, int firstVisibleItem, 76 | int visibleItemCount, int totalItemCount) { 77 | mTotalItemCount = totalItemCount; 78 | } 79 | }); 80 | refreshView.setXRefreshViewListener(new XRefreshView.SimpleXRefreshListener() { 81 | 82 | @Override 83 | public void onRefresh(boolean isPullDown) { 84 | 85 | new Handler().postDelayed(new Runnable() { 86 | @Override 87 | public void run() { 88 | refreshView.stopRefresh(); 89 | } 90 | }, 4000); 91 | } 92 | 93 | @Override 94 | public void onLoadMore(boolean isSilence) { 95 | 96 | new Handler().postDelayed(new Runnable() { 97 | 98 | @Override 99 | public void run() { 100 | refreshView.stopLoadMore(); 101 | } 102 | }, 2000); 103 | } 104 | }); 105 | } 106 | 107 | int section = 0; 108 | String YM = null; 109 | String content = null; 110 | 111 | private void initData() { 112 | 113 | for (int i = 0; i < 20; i++) { 114 | if (i % 5 == 0) { 115 | section++; 116 | YM = "第" + section + "个头"; 117 | } 118 | content = "第" + i + "项数据"; 119 | StickyListBean bean = new StickyListBean(section, YM, content); 120 | list.add(bean); 121 | } 122 | 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/activity/TaoBaoActivity.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.activity; 2 | 3 | import android.os.Bundle; 4 | import android.app.Activity; 5 | 6 | import com.andview.example.R; 7 | 8 | public class TaoBaoActivity extends Activity { 9 | 10 | @Override 11 | protected void onCreate(Bundle savedInstanceState) { 12 | super.onCreate(savedInstanceState); 13 | setContentView(R.layout.activity_tao_bao); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/activity/WebViewActivity.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.activity; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.os.Handler; 6 | import android.webkit.WebView; 7 | import android.webkit.WebViewClient; 8 | 9 | import com.andview.example.R; 10 | import com.andview.example.ui.raindrop.CustomerFooter; 11 | import com.andview.refreshview.XRefreshView; 12 | import com.andview.refreshview.XRefreshView.SimpleXRefreshListener; 13 | import com.andview.refreshview.utils.LogUtils; 14 | 15 | public class WebViewActivity extends Activity { 16 | private XRefreshView outView; 17 | //项目里不要这么写,最好保存到本地 18 | public static long lastRefreshTime; 19 | private WebView mWebView; 20 | 21 | @Override 22 | public void onCreate(Bundle savedInstanceState) { 23 | super.onCreate(savedInstanceState); 24 | setContentView(R.layout.activity_webview); 25 | mWebView = (WebView) findViewById(R.id.wv); 26 | mWebView.loadUrl("http://www.baidu.com"); 27 | mWebView.setWebViewClient(new WebViewClient() { 28 | @Override 29 | public boolean shouldOverrideUrlLoading(WebView view, String url) { 30 | view.loadUrl(url); 31 | return true; 32 | } 33 | 34 | @Override 35 | public void onScaleChanged(WebView view, float oldScale, float newScale) { 36 | super.onScaleChanged(view, oldScale, newScale); 37 | LogUtils.e("oldScale="+oldScale+";newScale="+newScale); 38 | } 39 | 40 | @Override 41 | public void onPageFinished(WebView view, String url) { 42 | outView.stopRefresh(); 43 | lastRefreshTime = outView.getLastRefreshTime(); 44 | super.onPageFinished(view, url); 45 | } 46 | }); 47 | outView = (XRefreshView) findViewById(R.id.custom_view); 48 | outView.setPullLoadEnable(true); 49 | outView.setPinnedTime(1000); 50 | outView.setCustomFooterView(new CustomerFooter(this)); 51 | outView.setXRefreshViewListener(new SimpleXRefreshListener() { 52 | 53 | @Override 54 | public void onRefresh(boolean isPullDown) { 55 | mWebView.loadUrl("http://www.baidu.com"); 56 | } 57 | 58 | @Override 59 | public void onLoadMore(boolean isSilence) { 60 | new Handler().postDelayed(new Runnable() { 61 | 62 | @Override 63 | public void run() { 64 | outView.stopLoadMore(); 65 | } 66 | }, 2000); 67 | } 68 | }); 69 | outView.restoreLastRefreshTime(lastRefreshTime); 70 | } 71 | 72 | } 73 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/activity/WineActivity.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.activity; 2 | 3 | import android.os.Bundle; 4 | import android.app.Activity; 5 | import android.os.Handler; 6 | 7 | import com.andview.example.DensityUtil; 8 | import com.andview.example.R; 9 | import com.andview.example.view.XRefreshViewWineHeader; 10 | import com.andview.refreshview.XRefreshView; 11 | 12 | public class WineActivity extends Activity { 13 | private XRefreshView wineXRefreshView; 14 | 15 | @Override 16 | protected void onCreate(Bundle savedInstanceState) { 17 | super.onCreate(savedInstanceState); 18 | setContentView(R.layout.activity_wine); 19 | 20 | initView(); 21 | initData(); 22 | } 23 | 24 | private void initView() { 25 | wineXRefreshView = (XRefreshView) findViewById(R.id.wineXRefreshView); 26 | wineXRefreshView.setCustomHeaderView(new XRefreshViewWineHeader(this)); 27 | wineXRefreshView.setAddHeaderTop(true); 28 | wineXRefreshView.setHeaderTopHeight(DensityUtil.dip2px(this, 212)); 29 | } 30 | 31 | private void initData() { 32 | wineXRefreshView.setAutoRefresh(false); 33 | wineXRefreshView.setPullRefreshEnable(true); 34 | wineXRefreshView.setMoveForHorizontal(true); 35 | wineXRefreshView.setXRefreshViewListener(new XRefreshView.SimpleXRefreshListener() { 36 | @Override 37 | public void onRefresh(boolean isPullDown) { 38 | super.onRefresh(isPullDown); 39 | new Handler().postDelayed(new Runnable() { 40 | @Override 41 | public void run() { 42 | wineXRefreshView.stopRefresh(); 43 | } 44 | }, 1000); 45 | } 46 | }); 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/recylerview/MultiItemAdapter.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.recylerview; 2 | 3 | import androidx.recyclerview.widget.RecyclerView; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.TextView; 8 | 9 | import com.andview.example.R; 10 | import com.andview.refreshview.recyclerview.BaseRecyclerAdapter; 11 | 12 | import java.util.List; 13 | 14 | public class MultiItemAdapter extends BaseRecyclerAdapter { 15 | private List list; 16 | 17 | public MultiItemAdapter(List list) { 18 | this.list = list; 19 | } 20 | 21 | @Override 22 | public void onBindViewHolder(SimpleAdapterViewHolder holder, int position, boolean isItem) { 23 | Person person = list.get(position); 24 | int type = getAdapterItemViewType(position); 25 | if (type == 0) { 26 | holder.tvLeft.setText(person.getName()); 27 | } else { 28 | holder.tvRight.setText(person.getName()); 29 | } 30 | } 31 | 32 | @Override 33 | public int getAdapterItemViewType(int position) { 34 | if (list != null && list.size() > 0) { 35 | return list.get(position).getType(); 36 | } 37 | return 0; 38 | } 39 | 40 | @Override 41 | public int getAdapterItemCount() { 42 | return list.size(); 43 | } 44 | 45 | @Override 46 | public SimpleAdapterViewHolder getViewHolder(View view) { 47 | return new SimpleAdapterViewHolder(view, false); 48 | } 49 | 50 | public void setData(List list) { 51 | this.list = list; 52 | notifyDataSetChanged(); 53 | } 54 | 55 | @Override 56 | public SimpleAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType, boolean isItem) { 57 | View v = null; 58 | if (viewType == 0) { 59 | v = LayoutInflater.from(parent.getContext()).inflate( 60 | R.layout.item_left_recylerview, parent, false); 61 | } else { 62 | v = LayoutInflater.from(parent.getContext()).inflate( 63 | R.layout.item_right_recylerview, parent, false); 64 | } 65 | return new SimpleAdapterViewHolder(v, viewType, true); 66 | } 67 | 68 | public class SimpleAdapterViewHolder extends RecyclerView.ViewHolder { 69 | 70 | public TextView tvRight, tvLeft; 71 | 72 | public SimpleAdapterViewHolder(View itemView, boolean isItem) { 73 | super(itemView); 74 | init(itemView, -1, isItem); 75 | } 76 | 77 | public SimpleAdapterViewHolder(View itemView, int viewType, boolean isItem) { 78 | super(itemView); 79 | init(itemView, viewType, isItem); 80 | } 81 | 82 | private void init(View itemView, int viewType, boolean isItem) { 83 | if (isItem) { 84 | switch (viewType) { 85 | case 0: 86 | tvLeft = (TextView) itemView.findViewById(R.id.tv_multi_left); 87 | break; 88 | default: 89 | tvRight = (TextView) itemView.findViewById(R.id.tv_multi_right); 90 | break; 91 | } 92 | } 93 | } 94 | } 95 | 96 | public void insert(Person person, int position) { 97 | insert(list, person, position); 98 | } 99 | 100 | public void remove(int position) { 101 | remove(list, position); 102 | } 103 | 104 | public void clear() { 105 | clear(list); 106 | } 107 | 108 | public Person getItem(int position) { 109 | if (position < list.size()) 110 | return list.get(position); 111 | else 112 | return null; 113 | } 114 | 115 | } -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/recylerview/NormalRecyclerAdapter.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.recylerview; 2 | 3 | import android.content.Context; 4 | import androidx.recyclerview.widget.RecyclerView; 5 | import androidx.recyclerview.widget.StaggeredGridLayoutManager; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.widget.TextView; 10 | 11 | import com.andview.example.DensityUtil; 12 | import com.andview.example.R; 13 | 14 | import java.util.List; 15 | 16 | public class NormalRecyclerAdapter extends RecyclerView.Adapter { 17 | private List list; 18 | private int largeCardHeight, smallCardHeight; 19 | 20 | public NormalRecyclerAdapter(List list, Context context) { 21 | this.list = list; 22 | largeCardHeight = DensityUtil.dip2px(context, 150); 23 | smallCardHeight = DensityUtil.dip2px(context, 100); 24 | } 25 | 26 | @Override 27 | public void onBindViewHolder(SimpleAdapterViewHolder holder, int position) { 28 | Person person = list.get(position); 29 | holder.nameTv.setText(person.getName()); 30 | holder.ageTv.setText(person.getAge()); 31 | ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams(); 32 | if (layoutParams instanceof StaggeredGridLayoutManager.LayoutParams) { 33 | holder.rootView.getLayoutParams().height = position % 2 != 0 ? largeCardHeight : smallCardHeight; 34 | } 35 | } 36 | 37 | @Override 38 | public int getItemCount() { 39 | return list.size(); 40 | } 41 | 42 | public void setData(List list) { 43 | this.list = list; 44 | notifyDataSetChanged(); 45 | } 46 | 47 | @Override 48 | public SimpleAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 49 | View v = LayoutInflater.from(parent.getContext()).inflate( 50 | R.layout.item_recylerview, parent, false); 51 | SimpleAdapterViewHolder vh = new SimpleAdapterViewHolder(v, true); 52 | return vh; 53 | } 54 | 55 | public void insert(Person person, int position) { 56 | list.add(position, person); 57 | notifyItemInserted(position); 58 | } 59 | 60 | public class SimpleAdapterViewHolder extends RecyclerView.ViewHolder { 61 | 62 | public View rootView; 63 | public TextView nameTv; 64 | public TextView ageTv; 65 | public int position; 66 | 67 | public SimpleAdapterViewHolder(View itemView, boolean isItem) { 68 | super(itemView); 69 | if (isItem) { 70 | nameTv = (TextView) itemView 71 | .findViewById(R.id.recycler_view_test_item_person_name_tv); 72 | ageTv = (TextView) itemView 73 | .findViewById(R.id.recycler_view_test_item_person_age_tv); 74 | rootView = itemView 75 | .findViewById(R.id.card_view); 76 | } 77 | 78 | } 79 | } 80 | 81 | public Person getItem(int position) { 82 | if (position < list.size()) 83 | return list.get(position); 84 | else 85 | return null; 86 | } 87 | 88 | } -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/recylerview/Person.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.recylerview; 2 | 3 | public class Person { 4 | private String name, age; 5 | private int type; 6 | 7 | public int getType() { 8 | return type; 9 | } 10 | 11 | public void setType(int type) { 12 | this.type = type; 13 | } 14 | 15 | public Person(String name, String age) { 16 | this.name = name; 17 | this.age = age; 18 | } 19 | 20 | public Person(String name, String age, int type) { 21 | this.name = name; 22 | this.age = age; 23 | this.type = type; 24 | } 25 | 26 | public String getName() { 27 | return name; 28 | } 29 | 30 | public void setName(String name) { 31 | this.name = name; 32 | } 33 | 34 | public String getAge() { 35 | return age; 36 | } 37 | 38 | public void setAge(String age) { 39 | this.age = age; 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/recylerview/SimpleAdapter.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.recylerview; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.TextView; 8 | 9 | import androidx.recyclerview.widget.RecyclerView; 10 | import androidx.recyclerview.widget.StaggeredGridLayoutManager; 11 | 12 | import com.andview.example.DensityUtil; 13 | import com.andview.example.R; 14 | import com.andview.refreshview.recyclerview.BaseRecyclerAdapter; 15 | 16 | import java.util.List; 17 | 18 | public class SimpleAdapter extends BaseRecyclerAdapter { 19 | private List list; 20 | private int largeCardHeight, smallCardHeight; 21 | 22 | public SimpleAdapter(List list, Context context) { 23 | this.list = list; 24 | largeCardHeight = DensityUtil.dip2px(context, 150); 25 | smallCardHeight = DensityUtil.dip2px(context, 100); 26 | } 27 | 28 | @Override 29 | public void onBindViewHolder(SimpleAdapterViewHolder holder, int position, boolean isItem) { 30 | Person person = list.get(position); 31 | holder.nameTv.setText(person.getName()); 32 | holder.ageTv.setText(person.getAge()); 33 | ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams(); 34 | if (layoutParams instanceof StaggeredGridLayoutManager.LayoutParams) { 35 | holder.rootView.getLayoutParams().height = position % 2 != 0 ? largeCardHeight : smallCardHeight; 36 | } 37 | } 38 | 39 | @Override 40 | public int getAdapterItemViewType(int position) { 41 | return 0; 42 | } 43 | 44 | @Override 45 | public int getAdapterItemCount() { 46 | return list.size(); 47 | } 48 | 49 | @Override 50 | public SimpleAdapterViewHolder getViewHolder(View view) { 51 | return new SimpleAdapterViewHolder(view, false); 52 | } 53 | 54 | public void setData(List list) { 55 | this.list = list; 56 | notifyDataSetChanged(); 57 | } 58 | 59 | @Override 60 | public SimpleAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType, boolean isItem) { 61 | View v = LayoutInflater.from(parent.getContext()).inflate( 62 | R.layout.item_recylerview, parent, false); 63 | SimpleAdapterViewHolder vh = new SimpleAdapterViewHolder(v, true); 64 | return vh; 65 | } 66 | 67 | public void insert(Person person, int position) { 68 | insert(list, person, position); 69 | } 70 | 71 | public void remove(int position) { 72 | remove(list, position); 73 | } 74 | 75 | public void clear() { 76 | clear(list); 77 | } 78 | 79 | public class SimpleAdapterViewHolder extends RecyclerView.ViewHolder { 80 | 81 | public View rootView; 82 | public TextView nameTv; 83 | public TextView ageTv; 84 | public int position; 85 | 86 | public SimpleAdapterViewHolder(View itemView, boolean isItem) { 87 | super(itemView); 88 | if (isItem) { 89 | nameTv = (TextView) itemView 90 | .findViewById(R.id.recycler_view_test_item_person_name_tv); 91 | ageTv = (TextView) itemView 92 | .findViewById(R.id.recycler_view_test_item_person_age_tv); 93 | rootView = itemView 94 | .findViewById(R.id.card_view); 95 | } 96 | 97 | } 98 | } 99 | 100 | public Person getItem(int position) { 101 | if (position < list.size()) 102 | return list.get(position); 103 | else 104 | return null; 105 | } 106 | 107 | } -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/stickyListHeaders/ApiLevelTooLowException.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.stickyListHeaders; 2 | 3 | public class ApiLevelTooLowException extends RuntimeException { 4 | 5 | private static final long serialVersionUID = -5480068364264456757L; 6 | 7 | public ApiLevelTooLowException(int versionCode) { 8 | super("Requires API level " + versionCode); 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/stickyListHeaders/CheckableWrapperView.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.stickyListHeaders; 2 | 3 | import android.content.Context; 4 | import android.widget.Checkable; 5 | 6 | /** 7 | * A WrapperView that implements the checkable interface 8 | * 9 | * @author Emil Sjölander 10 | */ 11 | class CheckableWrapperView extends WrapperView implements Checkable { 12 | 13 | public CheckableWrapperView(final Context context) { 14 | super(context); 15 | } 16 | 17 | @Override 18 | public boolean isChecked() { 19 | return ((Checkable) mItem).isChecked(); 20 | } 21 | 22 | @Override 23 | public void setChecked(final boolean checked) { 24 | ((Checkable) mItem).setChecked(checked); 25 | } 26 | 27 | @Override 28 | public void toggle() { 29 | setChecked(!isChecked()); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/stickyListHeaders/SectionIndexerAdapterWrapper.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.stickyListHeaders; 2 | 3 | import android.content.Context; 4 | import android.widget.SectionIndexer; 5 | 6 | class SectionIndexerAdapterWrapper extends 7 | AdapterWrapper implements SectionIndexer { 8 | 9 | final SectionIndexer mSectionIndexerDelegate; 10 | 11 | SectionIndexerAdapterWrapper(Context context, 12 | StickyListHeadersAdapter delegate) { 13 | super(context, delegate); 14 | mSectionIndexerDelegate = (SectionIndexer) delegate; 15 | } 16 | 17 | @Override 18 | public int getPositionForSection(int section) { 19 | return mSectionIndexerDelegate.getPositionForSection(section); 20 | } 21 | 22 | @Override 23 | public int getSectionForPosition(int position) { 24 | return mSectionIndexerDelegate.getSectionForPosition(position); 25 | } 26 | 27 | @Override 28 | public Object[] getSections() { 29 | return mSectionIndexerDelegate.getSections(); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/stickyListHeaders/StickyListHeadersAdapter.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.stickyListHeaders; 2 | 3 | import android.view.View; 4 | import android.view.ViewGroup; 5 | import android.widget.ListAdapter; 6 | 7 | public interface StickyListHeadersAdapter extends ListAdapter { 8 | /** 9 | * Get a View that displays the header data at the specified position in the 10 | * set. You can either create a View manually or inflate it from an XML layout 11 | * file. 12 | * 13 | * @param position 14 | * The position of the item within the adapter's data set of the item whose 15 | * header view we want. 16 | * @param convertView 17 | * The old view to reuse, if possible. Note: You should check that this view is 18 | * non-null and of an appropriate type before using. If it is not possible to 19 | * convert this view to display the correct data, this method can create a new 20 | * view. 21 | * @param parent 22 | * The parent that this view will eventually be attached to. 23 | * @return 24 | * A View corresponding to the data at the specified position. 25 | */ 26 | View getHeaderView(int position, View convertView, ViewGroup parent); 27 | 28 | /** 29 | * Get the header id associated with the specified position in the list. 30 | * 31 | * @param position 32 | * The position of the item within the adapter's data set whose header id we 33 | * want. 34 | * @return 35 | * The id of the header at the specified position. 36 | */ 37 | long getHeaderId(int position); 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/stickyListHeaders/WrapperView.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.stickyListHeaders; 2 | 3 | import android.content.Context; 4 | import android.graphics.Canvas; 5 | import android.graphics.drawable.Drawable; 6 | import android.os.Build; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.view.ViewParent; 10 | 11 | /** 12 | * 13 | * the view that wrapps a divider header and a normal list item. The listview sees this as 1 item 14 | * 15 | * @author Emil Sjölander 16 | */ 17 | public class WrapperView extends ViewGroup { 18 | 19 | View mItem; 20 | Drawable mDivider; 21 | int mDividerHeight; 22 | View mHeader; 23 | int mItemTop; 24 | 25 | WrapperView(Context c) { 26 | super(c); 27 | } 28 | 29 | public boolean hasHeader() { 30 | return mHeader != null; 31 | } 32 | 33 | public View getItem() { 34 | return mItem; 35 | } 36 | 37 | public View getHeader() { 38 | return mHeader; 39 | } 40 | 41 | void update(View item, View header, Drawable divider, int dividerHeight) { 42 | 43 | //every wrapperview must have a list item 44 | if (item == null) { 45 | throw new NullPointerException("List view item must not be null."); 46 | } 47 | 48 | //only remove the current item if it is not the same as the new item. this can happen if wrapping a recycled view 49 | if (this.mItem != item) { 50 | removeView(this.mItem); 51 | this.mItem = item; 52 | final ViewParent parent = item.getParent(); 53 | if(parent != null && parent != this) { 54 | if(parent instanceof ViewGroup) { 55 | ((ViewGroup) parent).removeView(item); 56 | } 57 | } 58 | addView(item); 59 | } 60 | 61 | //same logik as above but for the header 62 | if (this.mHeader != header) { 63 | if (this.mHeader != null) { 64 | removeView(this.mHeader); 65 | } 66 | this.mHeader = header; 67 | if (header != null) { 68 | addView(header); 69 | } 70 | } 71 | 72 | if (this.mDivider != divider) { 73 | this.mDivider = divider; 74 | this.mDividerHeight = dividerHeight; 75 | invalidate(); 76 | } 77 | } 78 | 79 | @Override 80 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 81 | int measuredWidth = MeasureSpec.getSize(widthMeasureSpec); 82 | int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(measuredWidth, 83 | MeasureSpec.EXACTLY); 84 | int measuredHeight = 0; 85 | 86 | //measure header or divider. when there is a header visible it acts as the divider 87 | if (mHeader != null) { 88 | ViewGroup.LayoutParams params = mHeader.getLayoutParams(); 89 | if (params != null && params.height > 0) { 90 | mHeader.measure(childWidthMeasureSpec, 91 | MeasureSpec.makeMeasureSpec(params.height, MeasureSpec.EXACTLY)); 92 | } else { 93 | mHeader.measure(childWidthMeasureSpec, 94 | MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 95 | } 96 | measuredHeight += mHeader.getMeasuredHeight(); 97 | } else if (mDivider != null) { 98 | measuredHeight += mDividerHeight; 99 | } 100 | 101 | //measure item 102 | ViewGroup.LayoutParams params = mItem.getLayoutParams(); 103 | if (params != null && params.height > 0) { 104 | mItem.measure(childWidthMeasureSpec, 105 | MeasureSpec.makeMeasureSpec(params.height, MeasureSpec.EXACTLY)); 106 | } else { 107 | mItem.measure(childWidthMeasureSpec, 108 | MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 109 | } 110 | measuredHeight += mItem.getMeasuredHeight(); 111 | 112 | setMeasuredDimension(measuredWidth, measuredHeight); 113 | } 114 | 115 | @Override 116 | protected void onLayout(boolean changed, int l, int t, int r, int b) { 117 | 118 | l = 0; 119 | t = 0; 120 | r = getWidth(); 121 | b = getHeight(); 122 | 123 | if (mHeader != null) { 124 | int headerHeight = mHeader.getMeasuredHeight(); 125 | mHeader.layout(l, t, r, headerHeight); 126 | mItemTop = headerHeight; 127 | mItem.layout(l, headerHeight, r, b); 128 | } else if (mDivider != null) { 129 | mDivider.setBounds(l, t, r, mDividerHeight); 130 | mItemTop = mDividerHeight; 131 | mItem.layout(l, mDividerHeight, r, b); 132 | } else { 133 | mItemTop = t; 134 | mItem.layout(l, t, r, b); 135 | } 136 | } 137 | 138 | @Override 139 | protected void dispatchDraw(Canvas canvas) { 140 | super.dispatchDraw(canvas); 141 | if (mHeader == null && mDivider != null) { 142 | // Drawable.setBounds() does not seem to work pre-honeycomb. So have 143 | // to do this instead 144 | if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { 145 | canvas.clipRect(0, 0, getWidth(), mDividerHeight); 146 | } 147 | mDivider.draw(canvas); 148 | } 149 | } 150 | } 151 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/ui/BannerViewPager.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.ui; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.view.MotionEvent; 6 | import android.view.ViewGroup; 7 | 8 | import androidx.viewpager.widget.ViewPager; 9 | 10 | /** 11 | * Created by huxq17 on 2016/2/1. 12 | */ 13 | public class BannerViewPager extends ViewPager { 14 | public BannerViewPager(Context context, AttributeSet attrs) { 15 | super(context, attrs); 16 | } 17 | 18 | public BannerViewPager(Context context) { 19 | super(context); 20 | } 21 | 22 | @Override 23 | public boolean dispatchTouchEvent(MotionEvent ev) { 24 | if (parent != null) { 25 | parent.requestDisallowInterceptTouchEvent(true); 26 | } 27 | return super.dispatchTouchEvent(ev); 28 | } 29 | 30 | private ViewGroup parent; 31 | 32 | public void setParent(ViewGroup parent) { 33 | this.parent = parent; 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/ui/CustomGifHeader.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.ui; 2 | 3 | import android.content.Context; 4 | import android.graphics.Color; 5 | import android.util.AttributeSet; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.widget.LinearLayout; 9 | import android.widget.TextView; 10 | 11 | import com.andview.example.R; 12 | import com.andview.refreshview.callback.IHeaderCallBack; 13 | 14 | public class CustomGifHeader extends LinearLayout implements IHeaderCallBack { 15 | private GifView gifView1; 16 | private GifView gifView2; 17 | private TextView mHintTextView; 18 | 19 | public CustomGifHeader(Context context) { 20 | super(context); 21 | setBackgroundColor(Color.parseColor("#f3f3f3")); 22 | initView(context); 23 | } 24 | 25 | /** 26 | * @param context 27 | * @param attrs 28 | */ 29 | public CustomGifHeader(Context context, AttributeSet attrs) { 30 | super(context, attrs); 31 | initView(context); 32 | } 33 | 34 | private void initView(Context context) { 35 | LayoutInflater.from(context).inflate(R.layout.gif_header, this); 36 | gifView1 = (GifView) findViewById(R.id.gif1); 37 | mHintTextView = (TextView) findViewById(R.id.gif_header_hint); 38 | gifView2 = (GifView) findViewById(R.id.gif2); 39 | gifView1.setMovieResource(R.raw.vertical); 40 | gifView2.setMovieResource(R.raw.horizontal); 41 | gifView2.setVisibility(View.GONE); 42 | } 43 | 44 | public void setRefreshTime(long lastRefreshTime) { 45 | } 46 | 47 | public void hide() { 48 | setVisibility(View.GONE); 49 | } 50 | 51 | public void show() { 52 | setVisibility(View.VISIBLE); 53 | } 54 | 55 | @Override 56 | public void onStateNormal() { 57 | mHintTextView.setText(R.string.xrefreshview_header_hint_normal); 58 | gifView1.setVisibility(View.VISIBLE); 59 | gifView2.setVisibility(View.GONE); 60 | gifView1.setPaused(false); 61 | gifView2.setPaused(true); 62 | } 63 | 64 | @Override 65 | public void onStateReady() { 66 | mHintTextView.setText(R.string.xrefreshview_header_hint_ready); 67 | } 68 | 69 | @Override 70 | public void onStateRefreshing() { 71 | mHintTextView.setText(R.string.xrefreshview_header_hint_refreshing); 72 | gifView1.setVisibility(View.GONE); 73 | gifView2.setVisibility(View.VISIBLE); 74 | gifView1.setPaused(true); 75 | gifView2.setPaused(false); 76 | } 77 | 78 | @Override 79 | public void onStateFinish(boolean success) { 80 | mHintTextView.setText(success ? R.string.xrefreshview_header_hint_loaded : R.string.xrefreshview_header_hint_loaded_fail); 81 | // gifView1.setVisibility(View.VISIBLE); 82 | gifView2.setVisibility(View.GONE); 83 | gifView2.setPaused(true); 84 | } 85 | 86 | @Override 87 | public void onHeaderMove(double headerMovePercent, int offsetY, int deltaY) { 88 | // 89 | } 90 | 91 | @Override 92 | public int getHeaderHeight() { 93 | return getMeasuredHeight(); 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/ui/raindrop/Circle.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.ui.raindrop; 2 | 3 | 4 | public class Circle { 5 | private float x; 6 | private float y; 7 | private float radius; 8 | private int color; 9 | 10 | public float getX() { 11 | return x; 12 | } 13 | 14 | public void setX(float x) { 15 | this.x = x; 16 | } 17 | 18 | public float getY() { 19 | return y; 20 | } 21 | 22 | public void setY(float y) { 23 | this.y = y; 24 | } 25 | 26 | public float getRadius() { 27 | return radius; 28 | } 29 | 30 | public void setRadius(float radius) { 31 | this.radius = radius; 32 | } 33 | 34 | public int getColor() { 35 | return color; 36 | } 37 | 38 | public void setColor(int color) { 39 | this.color = color; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/ui/raindrop/CustomerFooter.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.ui.raindrop; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.LinearLayout; 9 | import android.widget.TextView; 10 | 11 | import androidx.recyclerview.widget.RecyclerView; 12 | 13 | import com.andview.refreshview.XRefreshView; 14 | import com.andview.refreshview.callback.IFooterCallBack; 15 | import com.andview.refreshview.utils.Utils; 16 | 17 | public class CustomerFooter extends LinearLayout implements IFooterCallBack { 18 | private Context mContext; 19 | 20 | private View mContentView; 21 | private View mProgressBar; 22 | private TextView mHintView; 23 | private TextView mClickView; 24 | private boolean showing = false; 25 | 26 | public CustomerFooter(Context context) { 27 | super(context); 28 | initView(context); 29 | } 30 | 31 | public CustomerFooter(Context context, AttributeSet attrs) { 32 | super(context, attrs); 33 | initView(context); 34 | } 35 | 36 | private RecyclerView recyclerView; 37 | 38 | public void setRecyclerView(RecyclerView recyclerView) { 39 | this.recyclerView = recyclerView; 40 | } 41 | 42 | @Override 43 | public void callWhenNotAutoLoadMore(final XRefreshView xRefreshView) { 44 | if (recyclerView != null) { 45 | //当数据不满一屏时不显示点击加载更多 46 | show(Utils.isRecyclerViewFullscreen(recyclerView)); 47 | } 48 | mClickView.setText(com.andview.refreshview.R.string.xrefreshview_footer_hint_click); 49 | mClickView.setOnClickListener(new OnClickListener() { 50 | 51 | @Override 52 | public void onClick(View v) { 53 | xRefreshView.notifyLoadMore(); 54 | } 55 | }); 56 | } 57 | 58 | @Override 59 | public void onStateReady() { 60 | mHintView.setVisibility(View.GONE); 61 | mProgressBar.setVisibility(View.GONE); 62 | mClickView.setVisibility(View.VISIBLE); 63 | mClickView.setText(com.andview.refreshview.R.string.xrefreshview_footer_hint_click); 64 | } 65 | 66 | @Override 67 | public void onStateRefreshing() { 68 | mHintView.setVisibility(View.GONE); 69 | mProgressBar.setVisibility(View.VISIBLE); 70 | mClickView.setVisibility(View.GONE); 71 | show(true); 72 | } 73 | 74 | @Override 75 | public void onReleaseToLoadMore() { 76 | mHintView.setVisibility(View.GONE); 77 | mProgressBar.setVisibility(View.GONE); 78 | mClickView.setVisibility(View.VISIBLE); 79 | mClickView.setText(com.andview.refreshview.R.string.xrefreshview_footer_hint_release); 80 | } 81 | 82 | @Override 83 | public void onStateFinish(boolean hideFooter) { 84 | if (hideFooter) { 85 | mHintView.setText(com.andview.refreshview.R.string.xrefreshview_footer_hint_normal); 86 | } else { 87 | //处理数据加载失败时ui显示的逻辑,也可以不处理,看自己的需求 88 | mHintView.setText(com.andview.refreshview.R.string.xrefreshview_footer_hint_fail); 89 | } 90 | mHintView.setVisibility(View.VISIBLE); 91 | mProgressBar.setVisibility(View.GONE); 92 | mClickView.setVisibility(View.GONE); 93 | } 94 | 95 | @Override 96 | public void onStateComplete() { 97 | mHintView.setText(com.andview.refreshview.R.string.xrefreshview_footer_hint_complete); 98 | mHintView.setVisibility(View.VISIBLE); 99 | mProgressBar.setVisibility(View.GONE); 100 | show(true); 101 | } 102 | 103 | @Override 104 | public void show(boolean show) { 105 | showing = show; 106 | LayoutParams lp = (LayoutParams) mContentView 107 | .getLayoutParams(); 108 | lp.height = show ? LayoutParams.WRAP_CONTENT : 0; 109 | mContentView.setLayoutParams(lp); 110 | } 111 | 112 | @Override 113 | public boolean isShowing() { 114 | return showing; 115 | } 116 | 117 | private void initView(Context context) { 118 | mContext = context; 119 | ViewGroup moreView = (ViewGroup) LayoutInflater.from(mContext).inflate(com.andview.refreshview.R.layout.xrefreshview_footer, this); 120 | moreView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 121 | 122 | mContentView = moreView.findViewById(com.andview.refreshview.R.id.xrefreshview_footer_content); 123 | mProgressBar = moreView 124 | .findViewById(com.andview.refreshview.R.id.xrefreshview_footer_progressbar); 125 | mHintView = (TextView) moreView 126 | .findViewById(com.andview.refreshview.R.id.xrefreshview_footer_hint_textview); 127 | mClickView = (TextView) moreView 128 | .findViewById(com.andview.refreshview.R.id.xrefreshview_footer_click_textview); 129 | } 130 | 131 | @Override 132 | public int getFooterHeight() { 133 | return getMeasuredHeight(); 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/ui/raindrop/RainDropHeader.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.ui.raindrop; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.view.LayoutInflater; 6 | import android.view.ViewTreeObserver; 7 | import android.widget.FrameLayout; 8 | import android.widget.LinearLayout; 9 | import android.widget.ProgressBar; 10 | 11 | import com.andview.example.DensityUtil; 12 | import com.andview.example.R; 13 | import com.andview.example.Utils; 14 | import com.andview.refreshview.callback.IHeaderCallBack; 15 | import com.andview.refreshview.utils.LogUtils; 16 | 17 | /** 18 | * Created by Administrator on 2015/8/24. 19 | */ 20 | public class RainDropHeader extends FrameLayout implements IHeaderCallBack{ 21 | private RainDropView mRainDropView; 22 | private LinearLayout mContainer; 23 | private ProgressBar mProgressBar; 24 | 25 | private int stretchHeight; 26 | private int readyHeight; 27 | private int DISTANCE_BETWEEN_STRETCH_READY = 250; 28 | public RainDropHeader(Context context) { 29 | super(context); 30 | initView(); 31 | } 32 | 33 | public RainDropHeader(Context context, AttributeSet attrs) { 34 | super(context, attrs); 35 | initView(); 36 | } 37 | 38 | public RainDropHeader(Context context, AttributeSet attrs, int defStyleAttr) { 39 | super(context, attrs, defStyleAttr); 40 | initView(); 41 | } 42 | 43 | private void initView() { 44 | DISTANCE_BETWEEN_STRETCH_READY= DensityUtil.dip2px(getContext(), DISTANCE_BETWEEN_STRETCH_READY); 45 | mContainer = (LinearLayout) LayoutInflater.from(getContext()).inflate( 46 | R.layout.waterdroplistview_header, null); 47 | mProgressBar = (ProgressBar) mContainer.findViewById(R.id.waterdroplist_header_progressbar); 48 | mRainDropView = (RainDropView) mContainer.findViewById(R.id.waterdroplist_waterdrop); 49 | // 初始情况,设置下拉刷新view高度为0 50 | FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams( 51 | FrameLayout.LayoutParams.MATCH_PARENT, 0); 52 | addView(mContainer, lp); 53 | // setBackgroundColor(Color.BLACK); 54 | mContainer.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 55 | @Override 56 | public void onGlobalLayout() { 57 | stretchHeight = mRainDropView.getHeight(); 58 | readyHeight = stretchHeight + DISTANCE_BETWEEN_STRETCH_READY; 59 | getViewTreeObserver().removeGlobalOnLayoutListener(this); 60 | } 61 | }); 62 | } 63 | 64 | @Override 65 | public void onStateNormal() { 66 | 67 | } 68 | 69 | @Override 70 | public void onStateReady() { 71 | 72 | } 73 | 74 | @Override 75 | public void onStateRefreshing() { 76 | 77 | } 78 | 79 | @Override 80 | public void onStateFinish(boolean success) { 81 | 82 | } 83 | public int getVisiableHeight() { 84 | return mContainer.getHeight(); 85 | } 86 | @Override 87 | public void onHeaderMove(double offset, int offsetY,int deltaY) { 88 | int height = deltaY+getVisiableHeight(); 89 | setVisiableHeight(height); 90 | if(height<=stretchHeight)return; 91 | float pullOffset = (float) Utils.mapValueFromRangeToRange(height, stretchHeight, readyHeight, 0, 1); 92 | if(pullOffset < 0 || pullOffset >1){ 93 | // throw new IllegalArgumentException("pullOffset should between 0 and 1!"+mState+" "+height); 94 | return; 95 | } 96 | LogUtils.i( "pullOffset:" + pullOffset+";height="+height+";offsetY="+offsetY+";deltaY="+deltaY+";stretchHeight="+stretchHeight+";readyHeight="+readyHeight); 97 | mRainDropView.updateComleteState(pullOffset); 98 | } 99 | public void setVisiableHeight(int height) { 100 | if (height < 0) 101 | height = 0; 102 | LayoutParams lp = (LayoutParams) mContainer 103 | .getLayoutParams(); 104 | lp.height = height; 105 | mContainer.setLayoutParams(lp); 106 | } 107 | @Override 108 | public void setRefreshTime(long lastRefreshTime) { 109 | 110 | } 111 | 112 | @Override 113 | public void hide() { 114 | 115 | } 116 | 117 | @Override 118 | public void show() { 119 | 120 | } 121 | 122 | @Override 123 | public int getHeaderHeight() { 124 | // stretchHeight = mRainDropView.getMeasuredHeight(); 125 | // DISTANCE_BETWEEN_STRETCH_READY = DensityUtil.dip2px(getContext(), DISTANCE_BETWEEN_STRETCH_READY); 126 | // readyHeight = stretchHeight + DISTANCE_BETWEEN_STRETCH_READY; 127 | // LogUtils.i("getHeaderHeight="+mRainDropView.getMeasuredHeight()); 128 | return mContainer.getHeight(); 129 | } 130 | } 131 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/ui/smileyloadingview/SmileyHeaderView.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.ui.smileyloadingview; 2 | 3 | import android.annotation.TargetApi; 4 | import android.content.Context; 5 | import android.os.Build; 6 | import android.util.AttributeSet; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.animation.LinearInterpolator; 10 | import android.widget.LinearLayout; 11 | import android.widget.Scroller; 12 | 13 | import com.andview.example.R; 14 | import com.andview.refreshview.callback.IHeaderCallBack; 15 | 16 | /** 17 | * Created by 2144 on 2016/8/26. 18 | */ 19 | public class SmileyHeaderView extends LinearLayout implements IHeaderCallBack { 20 | public SmileyHeaderView(Context context) { 21 | this(context, null); 22 | } 23 | 24 | public SmileyHeaderView(Context context, AttributeSet attrs) { 25 | this(context, attrs, 0); 26 | } 27 | 28 | public SmileyHeaderView(Context context, AttributeSet attrs, int defStyleAttr) { 29 | super(context, attrs, defStyleAttr); 30 | init(context); 31 | } 32 | 33 | @TargetApi(Build.VERSION_CODES.LOLLIPOP) 34 | public SmileyHeaderView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 35 | super(context, attrs, defStyleAttr, defStyleRes); 36 | init(context); 37 | } 38 | 39 | private SmileyLoadingView loadingView; 40 | private Scroller mScroller; 41 | 42 | private void init(Context context) { 43 | View contentView = LayoutInflater.from(context).inflate(R.layout.smiley_headerview, this); 44 | loadingView = (SmileyLoadingView) contentView.findViewById(R.id.loading_view); 45 | mScroller = new Scroller(getContext(), new LinearInterpolator()); 46 | } 47 | 48 | @Override 49 | public void onStateNormal() { 50 | finished = false; 51 | } 52 | 53 | @Override 54 | public void onStateReady() { 55 | } 56 | 57 | @Override 58 | public void onStateRefreshing() { 59 | refreshing = true; 60 | start(); 61 | } 62 | 63 | @Override 64 | public void onStateFinish(boolean success) { 65 | refreshing = false; 66 | finished = true; 67 | mScroller.forceFinished(true); 68 | removeCallbacks(mRunnable); 69 | loadingView.smile(360 + 180); 70 | hasHeaderMove = false; 71 | } 72 | 73 | private void start() { 74 | if (!refreshing) { 75 | return; 76 | } 77 | loadingView.mRunning = true; 78 | if (!hasHeaderMove) { 79 | mAngle = 90; 80 | } 81 | int duration = (int) ((720.0f + 2 * 90 - mAngle) * 2000 / (720.0f + 90)); 82 | mScroller.startScroll(mAngle, 0, (int) (720.0f + 2 * 90 - mAngle), 0, duration); 83 | post(mRunnable); 84 | } 85 | 86 | 87 | private boolean hasHeaderMove = false; 88 | 89 | private AnimalRunnable mRunnable = new AnimalRunnable(); 90 | 91 | public class AnimalRunnable implements Runnable { 92 | 93 | @Override 94 | public void run() { 95 | int curX = mScroller.getCurrX(); 96 | if (curX != 0) 97 | loadingView.smile(curX); 98 | if (mScroller.computeScrollOffset()) { 99 | post(this); 100 | } else { 101 | mAngle = 90; 102 | loadingView.mRunning = false; 103 | start(); 104 | } 105 | } 106 | } 107 | 108 | private boolean finished = false; 109 | private boolean refreshing = false; 110 | 111 | private int mAngle; 112 | 113 | @Override 114 | public void onHeaderMove(double headerMovePercent, int offsetY, int deltaY) { 115 | if (finished || refreshing) return; 116 | hasHeaderMove = true; 117 | if (headerMovePercent <= 1) { 118 | mAngle = (int) ((360 + 180 - 90) * headerMovePercent + 90); 119 | loadingView.smile(mAngle); 120 | } 121 | } 122 | 123 | @Override 124 | public void setRefreshTime(long lastRefreshTime) { 125 | 126 | } 127 | 128 | public void hide() { 129 | setVisibility(View.GONE); 130 | } 131 | 132 | public void show() { 133 | setVisibility(View.VISIBLE); 134 | } 135 | 136 | @Override 137 | public int getHeaderHeight() { 138 | return getMeasuredHeight(); 139 | } 140 | } 141 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/view/EatPluseView.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.view; 2 | 3 | import android.content.Context; 4 | import android.graphics.Canvas; 5 | import android.graphics.Color; 6 | import android.graphics.Paint; 7 | import android.graphics.RectF; 8 | import android.os.Handler; 9 | import android.util.AttributeSet; 10 | import android.util.Log; 11 | import android.view.View; 12 | 13 | /** 14 | * Author: fanyafeng 15 | * Date: 17/9/28 下午1:46 16 | * Email: fanyafeng@live.cn 17 | */ 18 | public class EatPluseView extends View { 19 | 20 | private static final String TAG = EatPluseView.class.getSimpleName(); 21 | 22 | private static int width = 0; 23 | private static int height = 0; 24 | 25 | private final static int sunR = 120; 26 | private Paint sunPaint; 27 | private int sunX; 28 | private int sunY; 29 | private static RectF sunRectF; 30 | 31 | private int startAngle = 0; 32 | private int swipeAngle = 360; 33 | 34 | private boolean isAdd = true; 35 | 36 | private int pluseR; 37 | 38 | public EatPluseView(Context context) { 39 | super(context); 40 | init(); 41 | } 42 | 43 | public EatPluseView(Context context, AttributeSet attrs) { 44 | super(context, attrs); 45 | init(); 46 | } 47 | 48 | public EatPluseView(Context context, AttributeSet attrs, int defStyleAttr) { 49 | super(context, attrs, defStyleAttr); 50 | init(); 51 | } 52 | 53 | private void init() { 54 | sunPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 55 | sunPaint.setAntiAlias(true); 56 | sunPaint.setColor(Color.BLUE); 57 | sunPaint.setStyle(Paint.Style.FILL); 58 | sunPaint.setStrokeWidth(1); 59 | } 60 | 61 | @Override 62 | protected void onDraw(Canvas canvas) { 63 | super.onDraw(canvas); 64 | if (width == 0) { 65 | width = getWidth(); 66 | } 67 | if (height == 0) { 68 | height = getHeight(); 69 | } 70 | 71 | if (sunX == 0) { 72 | sunX = width / 2; 73 | } 74 | if (sunY == 0) { 75 | sunY = height / 2; 76 | } 77 | Log.d(TAG, "宽度:" + width + "高度:" + height); 78 | 79 | Log.d(TAG, "sunX - sunR:" + (sunX - sunR) + " sunY - sunR:" + (sunY - sunR) + " sunX + sunR:" + (sunX + sunR) + " sunY - sunR:" + (sunY + sunR)); 80 | if (sunRectF == null) { 81 | sunRectF = new RectF(0, sunY - sunR, 2 * sunR, sunY + sunR); 82 | 83 | pluseR = sunR * 11 / 6 + sunR; 84 | } 85 | 86 | canvas.drawArc(sunRectF, startAngle, swipeAngle, true, sunPaint); 87 | 88 | canvas.drawCircle(pluseR, sunY, sunR / 6, sunPaint); 89 | if (pluseR <= sunR * 5 / 6) { 90 | pluseR = sunR * 11 / 6 + sunR; 91 | } else { 92 | pluseR -= 4; 93 | } 94 | if (!isAdd) { 95 | startAngle--; 96 | swipeAngle += 2; 97 | } else { 98 | startAngle++; 99 | swipeAngle -= 2; 100 | } 101 | 102 | if (startAngle == 30) { 103 | isAdd = false; 104 | } 105 | 106 | if (startAngle == 0) { 107 | isAdd = true; 108 | } 109 | 110 | new Handler().postDelayed(new Runnable() { 111 | @Override 112 | public void run() { 113 | invalidate(); 114 | } 115 | }, 10); 116 | 117 | } 118 | 119 | 120 | } 121 | -------------------------------------------------------------------------------- /app/src/main/java/com/andview/example/view/XRefreshViewCarHeader.java: -------------------------------------------------------------------------------- 1 | package com.andview.example.view; 2 | 3 | import android.content.Context; 4 | import android.graphics.drawable.AnimationDrawable; 5 | import android.os.Handler; 6 | import android.util.AttributeSet; 7 | import android.util.Log; 8 | import android.view.LayoutInflater; 9 | import android.view.View; 10 | import android.view.ViewGroup; 11 | import android.view.animation.Animation; 12 | import android.view.animation.ScaleAnimation; 13 | import android.widget.ImageView; 14 | import android.widget.LinearLayout; 15 | import android.widget.TextView; 16 | 17 | import com.andview.example.DensityUtil; 18 | import com.andview.example.R; 19 | import com.andview.refreshview.callback.IHeaderCallBack; 20 | 21 | /** 22 | * Author: fanyafeng 23 | * Date: 18/10/1 下午5:17 24 | * Email: fanyafeng@live.cn 25 | */ 26 | public class XRefreshViewCarHeader extends LinearLayout implements IHeaderCallBack { 27 | private ViewGroup mContent; 28 | 29 | private ImageView ivStatus; 30 | private TextView tvStatus; 31 | 32 | private float startPoint = 0; 33 | private float endPoint = 0; 34 | 35 | public XRefreshViewCarHeader(Context context) { 36 | super(context); 37 | initView(context); 38 | } 39 | 40 | /** 41 | * @param context 42 | * @param attrs 43 | */ 44 | public XRefreshViewCarHeader(Context context, AttributeSet attrs) { 45 | super(context, attrs); 46 | initView(context); 47 | } 48 | 49 | private void initView(Context context) { 50 | mContent = (ViewGroup) LayoutInflater.from(context).inflate(R.layout.xrefreshview_car_header, this); 51 | tvStatus = (TextView) mContent.findViewById(R.id.tvStatus); 52 | ivStatus = (ImageView) mContent.findViewById(R.id.ivStatus); 53 | } 54 | 55 | /** 56 | * hide footer when disable pull load more 57 | */ 58 | public void hide() { 59 | setVisibility(View.GONE); 60 | } 61 | 62 | public void show() { 63 | setVisibility(View.VISIBLE); 64 | } 65 | 66 | @Override 67 | public void onStateNormal() { 68 | tvStatus.setText("下拉刷新查看状态"); 69 | ivStatus.setImageResource(R.drawable.colors_refresh_icon); 70 | } 71 | 72 | @Override 73 | public void onStateReady() { 74 | tvStatus.setText("松手后刷新"); 75 | ivStatus.setImageResource(R.drawable.colors_refresh_icon); 76 | } 77 | 78 | @Override 79 | public void onStateRefreshing() { 80 | tvStatus.setText("正在刷新"); 81 | ivStatus.setImageResource(R.drawable.colors_refresh_loading); 82 | ((AnimationDrawable) ivStatus.getDrawable()).start(); 83 | } 84 | 85 | @Override 86 | public void onStateFinish(boolean success) { 87 | if (success) { 88 | new Handler().postDelayed(new Runnable() { 89 | @Override 90 | public void run() { 91 | tvStatus.setText("刷新完成"); 92 | ivStatus.setImageResource(R.drawable.colors_refresh_icon); 93 | } 94 | }, 1000); 95 | } 96 | } 97 | 98 | @Override 99 | public void onHeaderMove(double offset, int offsetY, int deltaY) { 100 | Log.d("offsetY", "y轴滑动距离 offsetY:" + offsetY + "对应的距离73dp:" + DensityUtil.dip2px(getContext(), 73)); 101 | } 102 | 103 | @Override 104 | public void setRefreshTime(long lastRefreshTime) { 105 | 106 | } 107 | 108 | @Override 109 | public int getHeaderHeight() { 110 | return getMeasuredHeight(); 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/refresh_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-hdpi/refresh_arrow.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_00.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_01.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_02.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_03.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_04.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_05.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_06.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_07.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_08.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_09.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_10.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_11.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_12.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_13.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_14.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_15.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_16.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_17.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_18.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_19.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_20.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_21.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_22.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_23.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_24.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_25.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/colors_refresh_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/colors_refresh_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/jd_package.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/jd_package.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/jd_person.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/jd_person.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/jd_person_package_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/jd_person_package_1.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/jd_person_package_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/jd_person_package_2.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/jd_person_package_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/jd_person_package_3.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/loading_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/loading_1.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/loading_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/loading_2.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/water_point_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/water_point_left.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/water_point_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huxq17/XRefreshView/c5caf3b541ba34616742e85c62da9c67a89b620e/app/src/main/res/drawable-xhdpi/water_point_right.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/colors_refresh_loading.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 10 | 13 | 14 | 17 | 20 | 23 | 26 | 29 | 30 | 33 | 36 | 39 | 42 | 43 | 46 | 49 | 52 | 55 | 56 | 59 | 60 | 63 | 64 | 67 | 68 | 71 | 72 | 75 | 76 | 79 | 80 | 83 | 84 | 87 | 88 | 91 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/jd_loading.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 11 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/wine_loading.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_banner_recylerview.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 11 | 12 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_car_crm.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 15 | 16 | 20 | 21 | 24 | 25 | 30 | 31 | 38 | 39 | 40 |