diff --git a/README.md b/README.md index b4dfe5d..02c98ad 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,113 @@ # XRefreshView -###Usage +### Usage ---- #### Gradle ```groovy dependencies { - compile 'com.huxq17.xrefreshview:xrefreshview:3.0.0' + compile 'com.huxq17.xrefreshview:xrefreshview:3.6.9' //依赖下面的库 - compile 'com.android.support:recyclerview-v7:23.0.1' - compile 'com.android.support:support-v4:23.0.1' + implementation 'androidx.recyclerview:recyclerview:1.1.0' } ``` -##最新的使用说明请移步[我的博客](http://blog.csdn.net/footballclub/article/details/46982115 "description") -##效果图 -###带Banner的Recyclerview -![带Banner的Recyclerview](http://img.my.csdn.net/uploads/201602/15/1455502311_5774.gif) -###LinearLayout样式的Recyclerview -![LinearLayout样式的Recyclerview](http://img.my.csdn.net/uploads/201602/03/1454495499_9614.gif) -###GridLayout样式的Recyclerview -![GridLayout样式的Recyclerview](http://img.my.csdn.net/uploads/201602/03/1454495517_6621.gif) -###Staggered样式的Recyclerview -![Staggered样式的Recyclerview](http://img.my.csdn.net/uploads/201602/03/1454495499_9854.gif) -###GridView -![自带的头部](http://img.my.csdn.net/uploads/201508/25/1440465457_8215.gif) -###自定义View -![自定义头部](http://img.my.csdn.net/uploads/201508/25/1440465306_9400.gif) - -还有listview,scrollview,webview等其他的view就不一一截图了。 +## 最新的使用说明请移步[我的博客](http://blog.csdn.net/footballclub/article/details/46982115 "description") + +## 效果图 + +|松开加载更多的Recyclerview|带Banner的Recyclerview| LinearLayout样式的Recyclerview| +|:-----|:-----|:-----| +| | | | + +|GridLayout样式的Recyclerview|Staggered样式的Recyclerview| +|:-----|:-----| +| | | + +|GridView|自定义View|笑脸刷新| +|:-----|:-----|:-----| +| | || + +|自定义刷新|仿京东刷新|自定义刷新| +|:-----|:-----|:-----| +| | | | + + +还有listview,scrollview,webview等其他的view就不一一截图了。**建议把此项目下载下来,然后跑到手机上看效果,例子都在app module里。** + +### 更新日志:
+ + 2020-6-13: + 1.更新android平台到androidx + + + 2017-5-4: + 1.解决已无更多数据显示不出来的问题,fix issue[#78](https://github.com/huxq17/XRefreshView/issues/78) + 2.升级到3.6.9版本 + + 2017-5-3: + 1.解决xrefreshview不满屏的时候footerview正常状态下出现在屏幕上的问题,fix issue[#75](https://github.com/huxq17/XRefreshView/issues/75) + 2.升级到3.6.8版本 + + 2017-4-25: + 1.通过使用XWebView,解决在三星c5、小米5等机型在webview上加XRefreshView,会出现加载更多没有效果的现象,详见issue[#72](https://github.com/huxq17/XRefreshView/issues/72) + 2.升级到3.6.7版本 + + 2017-4-14: + 1.解决Recyclerview频繁上拉加载时会出现footerview位置异常的问题 + 2.给setSilenceLoadMore方法添加boolean参数,可以启用和禁用静默加载模式 + 3.升级到3.6.6版本 + + 2017-3-28: + 1.不再强制Recyclerview使用BaseRecyclerAdapter,当不使用BaseRecyclerAdapter时,RecyclerView会被当成普通view + 上拉加载等操作和普通view相同,空布局等功能的使用方式也和普通view相同 + 2.解决ListView的子项目不足一屏时,上拉时再下拉会出现布局突然缩回的问题 + 3.升级到3.6.5版本 + + 2017-3-27: + 1.解决事先setPullRefreshEnable(false),再setPullRefreshEnable(true)和startRefresh()时,headerview无法显示的问题 + 2.升级到3.6.3版本 + + 2017-2-17: + 1.添加下拉刷新时的回调onRefresh(boolean isPullDown),其中isPullDown用来判断此次下拉刷新是不是由下拉手势触发的,true则代表是, + 反之则是自动刷新或者是调用XRefreshView#startRefresh()}触发的刷新 + 2.升级到3.6.2版本 + + 2017-2-16: + 1.解决issue[#58](https://github.com/huxq17/XRefreshView/issues/58) + + 2017-1-13: + 1.解决Recyclerview使用StaggeredGridLayoutManager时,添加的headerview不能使用全部宽度的问题(headview layout won't use all span area) + + 2017-1-6: + 1.解决issue[#49](https://github.com/huxq17/XRefreshView/issues/49) + + 2017-1-4: + 1.解决AbsListview数据不满一屏的时候,会重复加载更多的问题 + + 2016-12-15: + 1.优化非RecyclerView上拉加载回弹的效果,同时支持AbsListView(ListView、GridView)加载更多数据完成之后露出新加载的数据 + + 2016-9-28: + 1.添加xscrollview的滑动监听 + + 2016-9-6: + 1.解决issue[#36](https://github.com/huxq17/XRefreshView/issues/36) + + 2016-8-19: + 1.添加没有数据时显示空布局的支持 + 2.解决6.0以下的手机,在调用startRefresh()方法后,刷新时headerview有时会不显示的问题 + 3.其他一些优化 + + 2016-8-8: + 1.添加下拉刷新,数据接收失败的ui处理 + 2.解决下拉刷新,在刷新状态下把headerview完全隐藏掉,在刷新结束以后下拉和上拉都不可用的问题 + ### 关于我 -QQ:1491359569 邮箱:huxq17@163.com + 邮箱:huxq17@163.com fanyafeng@live.cn +    ps:有问题联系我的话请不要问我在不在,直接说问题,谢谢。 ### License diff --git a/app/build.gradle b/app/build.gradle index 4153c71..436ee6c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,13 +1,14 @@ apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' android { - compileSdkVersion 23 - buildToolsVersion "23.0.1" + compileSdkVersion 29 + buildToolsVersion "29.0.3" defaultConfig { applicationId "com.andview.example" - minSdkVersion 11 - targetSdkVersion 23 + minSdkVersion 19 + targetSdkVersion 29 versionCode 1 versionName "1.0" } @@ -21,13 +22,17 @@ android { abortOnError false } } - dependencies { - compile fileTree(include: ['*.jar'], dir: 'libs') - compile project(':library') -// compile 'com.huxq17.xrefreshview:xrefreshview:3.2.0' + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation project(':library') +// compile 'com.huxq17.xrefreshview:xrefreshview:3.6.9' //依赖下面的库 - compile 'com.android.support:recyclerview-v7:23.0.1' - compile 'com.android.support:support-v4:23.0.1' - compile 'com.android.support:cardview-v7:23.1.1' + implementation 'androidx.recyclerview:recyclerview:1.1.0' + implementation 'androidx.cardview:cardview:1.0.0' + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation "androidx.core:core-ktx:+" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} +repositories { + mavenCentral() } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 074b9ce..05da284 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ package="com.andview.example"> + - - + + - - - + + + - + + + + + + + + + + + - + \ No newline at end of file diff --git a/app/src/main/java/com/andview/example/IndexPageAdapter.java b/app/src/main/java/com/andview/example/IndexPageAdapter.java index ea5dbcd..7b91ac6 100644 --- a/app/src/main/java/com/andview/example/IndexPageAdapter.java +++ b/app/src/main/java/com/andview/example/IndexPageAdapter.java @@ -2,14 +2,14 @@ import android.content.Context; import android.os.Parcelable; -import android.support.v4.view.PagerAdapter; -import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ImageView.ScaleType; +import androidx.viewpager.widget.PagerAdapter; + public class IndexPageAdapter extends PagerAdapter { private int[] images; @@ -24,7 +24,7 @@ public IndexPageAdapter(Context context, int[] images) { @Override public void destroyItem(ViewGroup container, int position, Object object) { - ((ViewPager) container).removeView((View) object); + container.removeView((View) object); } @Override @@ -45,7 +45,7 @@ public Object instantiateItem(ViewGroup view, int position) { final int index = position % images.length; imageView.setBackgroundResource(images[index]); - ((ViewPager) view).addView(imageLayout, 0); + view.addView(imageLayout, 0); return imageLayout; } diff --git a/app/src/main/java/com/andview/example/ScrollAdapter.java b/app/src/main/java/com/andview/example/ScrollAdapter.java new file mode 100644 index 0000000..7649dce --- /dev/null +++ b/app/src/main/java/com/andview/example/ScrollAdapter.java @@ -0,0 +1,114 @@ +package com.andview.example; + +import android.content.Context; +import android.os.Parcelable; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.ScrollView; +import android.widget.TextView; + +import androidx.viewpager.widget.PagerAdapter; + +import com.andview.example.ui.raindrop.CustomerFooter; +import com.andview.refreshview.XRefreshView; +import com.andview.refreshview.XScrollView; + +public class ScrollAdapter extends PagerAdapter { + + private int[] images; + private Context mContext; + private LayoutInflater mInflater; + + public ScrollAdapter(Context context) { + this.mContext = context; + mInflater = LayoutInflater.from(mContext); + } + + @Override + public void destroyItem(ViewGroup container, int position, Object object) { + container.removeView((View) object); + } + + @Override + public void finishUpdate(View container) { + } + + @Override + public int getCount() { + return Integer.MAX_VALUE; + } + + @Override + public Object instantiateItem(ViewGroup view, int position) { + final View imageLayout = mInflater.inflate(R.layout.adapter_scrollview, view, false); + final XRefreshView outView = (XRefreshView) imageLayout.findViewById(R.id.custom_view); + final XScrollView scrollView = (XScrollView) imageLayout.findViewById(R.id.xscrollview); + scrollView.setOnScrollListener(new XScrollView.OnScrollListener() { + @Override + public void onScrollStateChanged(ScrollView view, int scrollState, boolean arriveBottom) { + } + + @Override + public void onScroll(int l, int t, int oldl, int oldt) { + } + }); + outView.setAutoRefresh(false); + outView.setPullLoadEnable(true); + outView.setPinnedTime(1000); + outView.setAutoLoadMore(false); +// outView.setSilenceLoadMore(); + outView.setXRefreshViewListener(new XRefreshView.SimpleXRefreshListener() { + @Override + public void onLoadMore(boolean isSilence) { + imageLayout.postDelayed(new Runnable() { + @Override + public void run() { + outView.stopLoadMore(); + } + }, 2000); + } + + @Override + public void onRefresh(boolean isPullDown) { + imageLayout.postDelayed(new Runnable() { + @Override + public void run() { + outView.stopRefresh(); + } + }, 2000); + } + }); + outView.setCustomFooterView(new CustomerFooter(mContext)); + LinearLayout ll = (LinearLayout) imageLayout.findViewById(R.id.ll); + for (int i = 0; i < 50; i++) { + TextView tv = new TextView(mContext); + tv.setTextIsSelectable(true); + tv.setText("数据" + i); + ll.addView(tv); + } + view.addView(imageLayout, 0); + + return imageLayout; + } + + @Override + public boolean isViewFromObject(View view, Object object) { + return view.equals(object); + } + + @Override + public void restoreState(Parcelable state, ClassLoader loader) { + } + + @Override + public Parcelable saveState() { + return null; + } + + @Override + public void startUpdate(View container) { + } + +} diff --git a/app/src/main/java/com/andview/example/activity/CarCrmActivity.java b/app/src/main/java/com/andview/example/activity/CarCrmActivity.java new file mode 100644 index 0000000..cefb61a --- /dev/null +++ b/app/src/main/java/com/andview/example/activity/CarCrmActivity.java @@ -0,0 +1,46 @@ +package com.andview.example.activity; + +import android.app.Activity; +import android.os.Bundle; +import android.os.Handler; + +import com.andview.example.R; +import com.andview.example.view.XRefreshViewCarHeader; +import com.andview.refreshview.XRefreshView; + +public class CarCrmActivity extends Activity { + + private XRefreshView carCrmXRefreshView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_car_crm); + initView(); + initData(); + } + + private void initView() { + carCrmXRefreshView = (XRefreshView) findViewById(R.id.carCrmXRefreshView); + carCrmXRefreshView.setCustomHeaderView(new XRefreshViewCarHeader(this)); + carCrmXRefreshView.setMoveForHorizontal(true); + } + + private void initData() { + carCrmXRefreshView.setAutoRefresh(false); + carCrmXRefreshView.setPullRefreshEnable(true); + carCrmXRefreshView.setMoveForHorizontal(true); + carCrmXRefreshView.setXRefreshViewListener(new XRefreshView.SimpleXRefreshListener() { + @Override + public void onRefresh(boolean isPullDown) { + super.onRefresh(isPullDown); + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + carCrmXRefreshView.stopRefresh(); + } + }, 2000); + } + }); + } +} diff --git a/app/src/main/java/com/andview/example/activity/CustomViewActivity.java b/app/src/main/java/com/andview/example/activity/CustomViewActivity.java index 47a0cc0..a3d94ec 100644 --- a/app/src/main/java/com/andview/example/activity/CustomViewActivity.java +++ b/app/src/main/java/com/andview/example/activity/CustomViewActivity.java @@ -3,6 +3,7 @@ import android.app.Activity; import android.os.Bundle; import android.os.Handler; +import android.view.View; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; @@ -11,7 +12,7 @@ import com.andview.example.StickylistAdapter; import com.andview.example.stickyListHeaders.StickyListHeadersListView; import com.andview.example.ui.CustomHeader; -import com.andview.example.ui.raindrop.CustomerFooter; +import com.andview.example.ui.smileyloadingview.SmileyHeaderView; import com.andview.refreshview.XRefreshView; import com.andview.refreshview.listener.OnBottomLoadMoreTime; import com.andview.refreshview.listener.OnTopRefreshTime; @@ -20,96 +21,106 @@ import java.util.List; public class CustomViewActivity extends Activity { - private StickyListHeadersListView stickyLv; - private List list = new ArrayList(); - private XRefreshView refreshView; - private int mTotalItemCount; - private StickylistAdapter adapter; - - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_customview); - initData(); - stickyLv = (StickyListHeadersListView) findViewById(R.id.sticky_list); - adapter = new StickylistAdapter(getApplicationContext(), list); - stickyLv.setAdapter(adapter); - refreshView = (XRefreshView) findViewById(R.id.custom_view); - refreshView.setPullLoadEnable(true); - refreshView.setAutoRefresh(true); -// refreshView.setPinnedTime(0); - refreshView.setCustomHeaderView(new CustomHeader(this)); - refreshView.setCustomFooterView(new CustomerFooter(this)); - refreshView.setOnTopRefreshTime(new OnTopRefreshTime() { - - @Override - public boolean isTop() { - return stickyLv.getFirstVisiblePosition() == 0; - } - }); - refreshView.setOnBottomLoadMoreTime(new OnBottomLoadMoreTime() { - - @Override - public boolean isBottom() { - return stickyLv.getLastVisiblePosition() == mTotalItemCount - 1; - } - }); - stickyLv.setOnScrollListener(new OnScrollListener() { - - @Override - public void onScrollStateChanged(AbsListView view, int scrollState) { - - } - - @Override - public void onScroll(AbsListView view, int firstVisibleItem, - int visibleItemCount, int totalItemCount) { - mTotalItemCount = totalItemCount; - } - }); - refreshView.setXRefreshViewListener(new XRefreshView.SimpleXRefreshListener() { - - @Override - public void onRefresh() { - - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - refreshView.stopRefresh(); - } - }, 10000); - } - - @Override - public void onLoadMore(boolean isSlience) { - - new Handler().postDelayed(new Runnable() { - - @Override - public void run() { - refreshView.stopLoadMore(); - } - }, 2000); - } - }); - } - - int section = 1; - String YM = null; - String content = null; - - private void initData() { - - for (int i = 0; i < 20; i++) { - if (i % 5 == 0) { - section++; - YM = "第" + section + "个头"; - } - content = "第" + i + "项数据"; - StickyListBean bean = new StickyListBean(section, YM, content); - list.add(bean); - } - - } + private StickyListHeadersListView stickyLv; + private List list = new ArrayList(); + private XRefreshView refreshView; + private int mTotalItemCount; + private StickylistAdapter adapter; + private final int mPinnedTime = 1000; + + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_customview); + initData(); + stickyLv = (StickyListHeadersListView) findViewById(R.id.sticky_list); + adapter = new StickylistAdapter(getApplicationContext(), list); + stickyLv.setAdapter(adapter); + refreshView = (XRefreshView) findViewById(R.id.custom_view); + refreshView.setPullLoadEnable(true); + refreshView.setAutoRefresh(true); + refreshView.setPinnedTime(mPinnedTime); + refreshView.setCustomHeaderView(new SmileyHeaderView(this)); + refreshView.setCustomHeaderView(new CustomHeader(CustomViewActivity.this,mPinnedTime)); + refreshView.setOnTopRefreshTime(new OnTopRefreshTime() { + + @Override + public boolean isTop() { + if (stickyLv.getFirstVisiblePosition() == 0) { + View firstVisibleChild = stickyLv.getListChildAt(0); + return firstVisibleChild.getTop() >= 0; + } + return false; + } + }); + refreshView.setOnBottomLoadMoreTime(new OnBottomLoadMoreTime() { + + @Override + public boolean isBottom() { + if (stickyLv.getLastVisiblePosition() == mTotalItemCount - 1) { + View lastChild = stickyLv.getListChildAt(stickyLv.getListChildCount() - 1); + return (lastChild.getBottom() + stickyLv.getPaddingBottom()) <= stickyLv.getMeasuredHeight(); + } + //没有到达底部则返回false + return false; + } + }); + stickyLv.setOnScrollListener(new OnScrollListener() { + + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) { + + } + + @Override + public void onScroll(AbsListView view, int firstVisibleItem, + int visibleItemCount, int totalItemCount) { + mTotalItemCount = totalItemCount; + } + }); + refreshView.setXRefreshViewListener(new XRefreshView.SimpleXRefreshListener() { + + @Override + public void onRefresh(boolean isPullDown) { + + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + refreshView.stopRefresh(); + } + }, 2000); + } + + @Override + public void onLoadMore(boolean isSilence) { + + new Handler().postDelayed(new Runnable() { + + @Override + public void run() { + refreshView.stopLoadMore(); + } + }, 2000); + } + }); + } + + int section = 0; + String YM = null; + String content = null; + + private void initData() { + + for (int i = 0; i < 20; i++) { + if (i % 5 == 0) { + section++; + YM = "第" + section + "个头"; + } + content = "第" + i + "项数据"; + StickyListBean bean = new StickyListBean(section, YM, content); + list.add(bean); + } + + } } diff --git a/app/src/main/java/com/andview/example/activity/EmptyViewActivity.java b/app/src/main/java/com/andview/example/activity/EmptyViewActivity.java new file mode 100644 index 0000000..a76191a --- /dev/null +++ b/app/src/main/java/com/andview/example/activity/EmptyViewActivity.java @@ -0,0 +1,207 @@ +package com.andview.example.activity; + +import android.app.Activity; +import android.os.Bundle; +import android.os.Handler; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.andview.example.DensityUtil; +import com.andview.example.R; +import com.andview.example.recylerview.Person; +import com.andview.example.recylerview.SimpleAdapter; +import com.andview.refreshview.XRefreshView; +import com.andview.refreshview.XRefreshViewFooter; + +import java.util.ArrayList; +import java.util.List; + +public class EmptyViewActivity extends Activity { + private RecyclerView recyclerView; + private SimpleAdapter recyclerviewAdapter; + private List personList = new ArrayList(); + private XRefreshView xRefreshView1; + private LinearLayoutManager layoutManager; + private boolean isBottom = false; + + private LinearLayout linearLayout; + private XRefreshView xRefreshView2; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_emptyview); + initRecyclerView(); + initScrollView(); + configXRfreshView(xRefreshView1, new XRefreshView.SimpleXRefreshListener() { + + @Override + public void onRefresh(boolean isPullDown) { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + xRefreshView1.stopRefresh(); + } + }, 500); + } + + @Override + public void onLoadMore(boolean isSilence) { + new Handler().postDelayed(new Runnable() { + public void run() { + for (int i = 0; i < 1; i++) { + recyclerviewAdapter.insert(new Person("More ", "21" + recyclerviewAdapter.getAdapterItemCount()), + recyclerviewAdapter.getAdapterItemCount()); + } + // 刷新完成必须调用此方法停止加载 + xRefreshView1.stopLoadMore(); + } + }, 1000); + } + }); + configXRfreshView(xRefreshView2, new XRefreshView.SimpleXRefreshListener() { + + @Override + public void onRefresh() { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + xRefreshView2.stopRefresh(); + } + }, 500); + } + + @Override + public void onLoadMore(boolean isSilence) { + new Handler().postDelayed(new Runnable() { + public void run() { + // 刷新完成必须调用此方法停止加载 + xRefreshView2.stopLoadMore(); + } + }, 1000); + } + }); + setEmptyViewClickListener(xRefreshView1, new View.OnClickListener() { + @Override + public void onClick(View v) { + requestRecyclerViewData(); + } + }); + setEmptyViewClickListener(xRefreshView2, new View.OnClickListener() { + @Override + public void onClick(View v) { + //非Recyclerview得在有数据和没有数据的时候,手动调用enableEmptyView方法来显示和关闭emptyView。 + xRefreshView2.enableEmptyView(false); + } + }); + requestRecyclerViewData(); + requestScrllViewData(); + } + + private void setEmptyViewClickListener(XRefreshView xRefreshView, View.OnClickListener listener) { + View emptyView = xRefreshView.getEmptyView(); + if (emptyView != null) { + emptyView.setOnClickListener(listener); + } + } + + private void initRecyclerView() { + xRefreshView1 = (XRefreshView) findViewById(R.id.xrefreshview); + recyclerView = (RecyclerView) findViewById(R.id.recycler_view_test_rv); + recyclerView.setHasFixedSize(true); + + recyclerviewAdapter = new SimpleAdapter(personList, this); + layoutManager = new LinearLayoutManager(this); + recyclerView.setLayoutManager(layoutManager); + recyclerView.setAdapter(recyclerviewAdapter); + recyclerviewAdapter.setCustomLoadMoreView(new XRefreshViewFooter(this)); + } + + private void initScrollView() { + xRefreshView2 = (XRefreshView) findViewById(R.id.xrefreshview2); + linearLayout = (LinearLayout) findViewById(R.id.linearLayout); + + } + + private void configXRfreshView(XRefreshView xRefreshView, XRefreshView.SimpleXRefreshListener listener) { + xRefreshView.setPullLoadEnable(true); + //设置刷新完成以后,headerview固定的时间 + xRefreshView.setPinnedTime(1000); + xRefreshView.setPullLoadEnable(true); + xRefreshView.setMoveForHorizontal(true); + xRefreshView.setAutoLoadMore(true); + //两种方式设置空布局,传入空布局的view或者传入布局id都可以 +// TextView textView = new TextView(this); +// textView.setText("没有数据,点击刷新"); +// textView.setGravity(Gravity.CENTER); +// xRefreshView.setEmptyView(textView); + xRefreshView.setEmptyView(R.layout.layout_emptyview); + xRefreshView.setXRefreshViewListener(listener); + } + + private void requestScrllViewData() { + for (int i = 0; i < 50; i++) { + TextView tv = new TextView(this); + tv.setTextSize(16); + int padding = DensityUtil.dip2px(this, 20); + tv.setPadding(padding, padding, 0, 0); + tv.setTextIsSelectable(true); + tv.setText("数据" + i); + linearLayout.addView(tv); + } + } + + private void requestRecyclerViewData() { + personList.clear(); + for (int i = 0; i < 6; i++) { + Person person = new Person("name" + i, "" + i); + personList.add(person); + } + recyclerviewAdapter.setData(personList); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // 加载菜单 + getMenuInflater().inflate(R.menu.menu_empty, menu); + return true; + } + + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int menuId = item.getItemId(); + boolean showingRecyclerView = xRefreshView1.getVisibility() == View.VISIBLE; + switch (menuId) { + case R.id.menu_change: + xRefreshView1.setVisibility(showingRecyclerView ? View.GONE : View.VISIBLE); + xRefreshView2.setVisibility(showingRecyclerView ? View.VISIBLE : View.GONE); + toast(showingRecyclerView ? "切换至ScrollView" : "切换至Recyclerview"); + break; + case R.id.menu_clear_or_fill: + if (showingRecyclerView) { + if (recyclerviewAdapter.getAdapterItemCount() != 0) { + recyclerviewAdapter.clear(); + } else { + requestRecyclerViewData(); + } + } else { + //非Recyclerview得在有数据和没有数据的时候,手动调用enableEmptyView方法来显示和关闭emptyView。 + xRefreshView2.enableEmptyView(!xRefreshView2.isEmptyViewShowing()); + } + break; + } + return super.onOptionsItemSelected(item); + } + + private void toast(String msg) { + Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/andview/example/activity/GridViewActivity.java b/app/src/main/java/com/andview/example/activity/GridViewActivity.java index 9d852bc..97ed3ff 100644 --- a/app/src/main/java/com/andview/example/activity/GridViewActivity.java +++ b/app/src/main/java/com/andview/example/activity/GridViewActivity.java @@ -17,105 +17,117 @@ import java.util.ArrayList; import java.util.List; +import java.util.Random; public class GridViewActivity extends Activity { - private GridView gv; - private List str_name = new ArrayList(); - private XRefreshView outView; - private ArrayAdapter adapter; + private GridView gv; + private List str_name = new ArrayList(); + private XRefreshView xRefreshView; + private ArrayAdapter adapter; - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_gridview); - for (int i = 0; i < 50; i++) { - str_name.add("数据" + i); - } - gv = (GridView) findViewById(R.id.gv); - outView = (XRefreshView) findViewById(R.id.custom_view); - outView.setPullLoadEnable(true); - //设置在上拉加载被禁用的情况下,是否允许界面被上拉 -// outView.setMoveFootWhenDisablePullLoadMore(false); - adapter = new ArrayAdapter(this, - android.R.layout.simple_list_item_1, str_name); - gv.setAdapter(adapter); - outView.setPinnedTime(1000); -// outView.setAutoLoadMore(true); -// outView.setCustomHeaderView(new CustomHeader(this)); -// outView.setCustomHeaderView(new XRefreshViewHeader(this)); - outView.setMoveForHorizontal(true); - outView.setCustomFooterView(new CustomerFooter(this)); -// outView.setPinnedContent(true); - outView.setXRefreshViewListener(new SimpleXRefreshListener() { - @Override - public void onRefresh() { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_gridview); + for (int i = 0; i < 50; i++) { + str_name.add("数据" + i); + } + gv = (GridView) findViewById(R.id.gv); + xRefreshView = (XRefreshView) findViewById(R.id.custom_view); + xRefreshView.setPullLoadEnable(true); + //设置在上拉加载被禁用的情况下,是否允许界面被上拉 +// xRefreshView.setMoveFootWhenDisablePullLoadMore(false); + adapter = new ArrayAdapter(this, + android.R.layout.simple_list_item_1, str_name); + gv.setAdapter(adapter); + xRefreshView.setPinnedTime(1000); + xRefreshView.setAutoLoadMore(false); +// xRefreshView.setCustomHeaderView(new CustomHeader(this)); +// xRefreshView.setCustomHeaderView(new XRefreshViewHeader(this)); + xRefreshView.setMoveForHorizontal(true); + xRefreshView.setCustomFooterView(new CustomerFooter(this)); +// xRefreshView.setPinnedContent(true); + //设置当非RecyclerView上拉加载完成以后的回弹时间 + xRefreshView.setScrollBackDuration(300); + xRefreshView.setXRefreshViewListener(new SimpleXRefreshListener() { + @Override + public void onRefresh(boolean isPullDown) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - outView.stopRefresh(); - } - }, 2000); - } + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + //模拟数据加载失败的情况 + Random random = new Random(); + boolean success = random.nextBoolean(); + if (success) { + xRefreshView.stopRefresh(); + } else { + xRefreshView.stopRefresh(false); + } + //或者 +// xRefreshView.stopRefresh(success); + } + }, 2000); + } - @Override - public void onLoadMore(boolean isSlience) { - final List addlist = new ArrayList(); - for (int i = 0; i < 20; i++) { - addlist.add("数据" + (i + str_name.size())); - } + @Override + public void onLoadMore(boolean isSilence) { + final List addlist = new ArrayList(); + for (int i = 0; i < 20; i++) { + addlist.add("数据" + (i + str_name.size())); + } - new Handler().postDelayed(new Runnable() { + new Handler().postDelayed(new Runnable() { - @SuppressLint("NewApi") - @Override - public void run() { - if (str_name.size() <= 90) { - if (Build.VERSION.SDK_INT >= 11) { - adapter.addAll(addlist); - } - outView.stopLoadMore(); - } else { - outView.setLoadComplete(true); - } - } - }, 2000); - } - }); - } + @SuppressLint("NewApi") + @Override + public void run() { + if (str_name.size() <= 90) { + if (Build.VERSION.SDK_INT >= 11) { + adapter.addAll(addlist); + } + xRefreshView.stopLoadMore(); + } else { + xRefreshView.setLoadComplete(true); + } + } + }, 2000); + } + }); + } - @Override - protected void onResume() { - super.onResume(); - outView.startRefresh(); - } + @Override + protected void onResume() { + super.onResume(); + xRefreshView.startRefresh(); + } - @Override - public boolean onCreateOptionsMenu(Menu menu) { - // 加载菜单 - getMenuInflater().inflate(R.menu.main, menu); - return true; - } + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // 加载菜单 + getMenuInflater().inflate(R.menu.main, menu); + return true; + } - @Override - public boolean onOptionsItemSelected(MenuItem item) { - int menuId = item.getItemId(); - switch (menuId) { - case R.id.menu_clear: - str_name.clear(); - for (int i = 0; i < 50; i++) { - str_name.add("数据" + i); - } - adapter.notifyDataSetChanged(); - outView.setLoadComplete(false); - break; - case R.id.menu_refresh: - outView.startRefresh(); - break; + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int menuId = item.getItemId(); + switch (menuId) { + case R.id.menu_clear: + str_name.clear(); + for (int i = 0; i < 50; i++) { + str_name.add("数据" + i); + } + adapter.notifyDataSetChanged(); + xRefreshView.setLoadComplete(false); + break; + case R.id.menu_refresh: + xRefreshView.startRefresh(); + break; - default: - break; - } - return super.onOptionsItemSelected(item); - } + default: + break; + } + return super.onOptionsItemSelected(item); + } } diff --git a/app/src/main/java/com/andview/example/activity/HeadAdActivity.java b/app/src/main/java/com/andview/example/activity/HeadAdActivity.java index 429b479..6c15409 100644 --- a/app/src/main/java/com/andview/example/activity/HeadAdActivity.java +++ b/app/src/main/java/com/andview/example/activity/HeadAdActivity.java @@ -55,10 +55,10 @@ public void onCreate(Bundle savedInstanceState) { outView.setCustomFooterView(new CustomerFooter(this)); // outView.setCustomHeaderView(new XRefreshViewHeader(this)); outView.setMoveForHorizontal(true); - outView.setPinnedContent(true); +// outView.setPinnedContent(true); outView.setXRefreshViewListener(new SimpleXRefreshListener() { @Override - public void onRefresh() { + public void onRefresh(boolean isPullDown) { new Handler().postDelayed(new Runnable() { @Override @@ -69,7 +69,7 @@ public void run() { } @Override - public void onLoadMore(boolean isSlience) { + public void onLoadMore(boolean isSilence) { final List addlist = new ArrayList(); for (int i = 0; i < 20; i++) { addlist.add("数据" + (i + str_name.size())); diff --git a/app/src/main/java/com/andview/example/activity/JDActivity.java b/app/src/main/java/com/andview/example/activity/JDActivity.java new file mode 100644 index 0000000..907a664 --- /dev/null +++ b/app/src/main/java/com/andview/example/activity/JDActivity.java @@ -0,0 +1,153 @@ +package com.andview.example.activity; + +import android.animation.Animator; +import android.animation.ObjectAnimator; +import android.graphics.drawable.AnimationDrawable; +import android.os.Bundle; +import android.app.Activity; +import android.os.Handler; +import android.util.Log; +import android.view.View; +import android.view.animation.Animation; +import android.view.animation.AnimationSet; +import android.view.animation.ScaleAnimation; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.SeekBar; + +import com.andview.example.R; +import com.andview.example.view.XRefreshViewJDHeader; +import com.andview.example.view.XRefreshViewWineHeader; +import com.andview.refreshview.XRefreshView; + +public class JDActivity extends Activity { + private final static String TAG = JDActivity.class.getSimpleName(); + + private ImageView ivPerson; + private ImageView ivPackage; + + private Button btnPackageScan; + private Button btnPersonScan; + + private SeekBar jdSeekBar; + + private XRefreshView jdXRefreshView; + + private float startPoint = 0; + private float endPoint = 0; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_jd); + initView(); + initData(); + } + + private void initView() { + ivPerson = (ImageView) findViewById(R.id.ivPerson); + ivPackage = (ImageView) findViewById(R.id.ivPackage); + + btnPackageScan = (Button) findViewById(R.id.btnPackageScan); + btnPersonScan = (Button) findViewById(R.id.btnPersonScan); + + jdSeekBar = (SeekBar) findViewById(R.id.jdSeekBar); + + jdXRefreshView = (XRefreshView) findViewById(R.id.jdXRefreshView); + jdXRefreshView.setCustomHeaderView(new XRefreshViewJDHeader(this)); + jdXRefreshView.setMoveForHorizontal(true); + } + + private void initData() { + + btnPackageScan.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + packageScan(); + } + }); + + btnPersonScan.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + personScan(); + } + }); + + + jdSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + startPoint = endPoint; + endPoint = (float) progress / 100f; + if (endPoint != 1f) { + ivPackage.setImageResource(R.drawable.jd_package); + ivPerson.setImageResource(R.drawable.jd_person); + } + + ScaleAnimation scaleAnimation = new ScaleAnimation(startPoint, endPoint, startPoint, endPoint, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); + scaleAnimation.setFillAfter(true); + ivPackage.startAnimation(scaleAnimation); + + ScaleAnimation scaleAnimationPerson = new ScaleAnimation(startPoint, endPoint, startPoint, endPoint, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0.5f); + scaleAnimationPerson.setFillAfter(true); + ivPerson.startAnimation(scaleAnimationPerson); + + if (startPoint != endPoint) { + startPoint = endPoint; + } + + if (endPoint == 1f) { + ivPackage.setImageDrawable(null); + ivPerson.setImageResource(R.drawable.jd_loading); + ((AnimationDrawable) ivPerson.getDrawable()).start(); + + } + + Log.d(TAG, "滑动初始距离:" + startPoint); + Log.d(TAG, "滑动结束比例:" + endPoint); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + + } + }); + + + jdXRefreshView.setAutoRefresh(false); + jdXRefreshView.setPullRefreshEnable(true); + jdXRefreshView.setMoveForHorizontal(true); + jdXRefreshView.setXRefreshViewListener(new XRefreshView.SimpleXRefreshListener() { + @Override + public void onRefresh(boolean isPullDown) { + super.onRefresh(isPullDown); + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + jdXRefreshView.stopRefresh(); + } + }, 1000); + } + }); + } + + private void packageScan() { + ScaleAnimation scaleAnimation = new ScaleAnimation(0f, 1f, 0f, 1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); + scaleAnimation.setDuration(1000); + ivPackage.startAnimation(scaleAnimation); + } + + private void personScan() { + ScaleAnimation scaleAnimation = new ScaleAnimation(0f, 1f, 0f, 1f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0.5f); + scaleAnimation.setDuration(1000); + ivPerson.startAnimation(scaleAnimation); + } + + +} diff --git a/app/src/main/java/com/andview/example/activity/ListViewActivity.java b/app/src/main/java/com/andview/example/activity/ListViewActivity.java index a08a780..4854a42 100644 --- a/app/src/main/java/com/andview/example/activity/ListViewActivity.java +++ b/app/src/main/java/com/andview/example/activity/ListViewActivity.java @@ -10,44 +10,44 @@ import android.widget.Toast; import com.andview.example.R; -import com.andview.example.ui.raindrop.CustomerFooter; import com.andview.refreshview.XRefreshView; import com.andview.refreshview.XRefreshView.SimpleXRefreshListener; -import com.andview.refreshview.listener.OnBottomLoadMoreTime; import com.andview.refreshview.utils.LogUtils; import java.util.ArrayList; import java.util.List; public class ListViewActivity extends Activity { - private ListView lv; - private List str_name = new ArrayList(); - private XRefreshView refreshView; - private ArrayAdapter adapter; - public static long lastRefreshTime; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_listview); - for (int i = 0; i < 30; i++) { - str_name.add("数据" + i); - } - lv = (ListView) findViewById(R.id.lv); - refreshView = (XRefreshView) findViewById(R.id.custom_view); - - adapter = new ArrayAdapter(this, - android.R.layout.simple_list_item_1, str_name); - lv.setAdapter(adapter); - - // 设置是否可以下拉刷新 - refreshView.setPullRefreshEnable(false); - // 设置是否可以上拉加载 - refreshView.setPullLoadEnable(false); - // 设置上次刷新的时间 - refreshView.restoreLastRefreshTime(lastRefreshTime); - // 设置时候可以自动刷新 - refreshView.setAutoRefresh(false); + private ListView lv; + private List str_name = new ArrayList(); + private XRefreshView refreshView; + private ArrayAdapter adapter; + public static long lastRefreshTime; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_listview); + for (int i = 0; i < 3; i++) { + str_name.add("数据" + i); + } + lv = (ListView) findViewById(R.id.lv); + refreshView = (XRefreshView) findViewById(R.id.custom_view); + + adapter = new ArrayAdapter(this, + android.R.layout.simple_list_item_1, str_name); + lv.setAdapter(adapter); + + // 设置是否可以下拉刷新 + refreshView.setPullRefreshEnable(false); + // 设置是否可以上拉加载 + refreshView.setPullLoadEnable(false); + // 设置上次刷新的时间 + refreshView.restoreLastRefreshTime(lastRefreshTime); + //当下拉刷新被禁用时,调用这个方法并传入false可以不让头部被下拉 + refreshView.setMoveHeadWhenDisablePullRefresh(true); + // 设置时候可以自动刷新 + refreshView.setAutoRefresh(false); // refreshView.setOnBottomLoadMoreTime(new OnBottomLoadMoreTime() { // @Override // public boolean isBottom() { @@ -55,59 +55,57 @@ public void onCreate(Bundle savedInstanceState) { // } // }); - refreshView.setXRefreshViewListener(new SimpleXRefreshListener() { - - @Override - public void onRefresh() { - - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - refreshView.stopRefresh(); - lastRefreshTime = refreshView.getLastRefreshTime(); - } - }, 2000); - } - - @Override - public void onLoadMore(boolean isSlience) { - new Handler().postDelayed(new Runnable() { - - @Override - public void run() { - refreshView.stopLoadMore(); - } - }, 2000); - } - - @Override - public void onRelease(float direction) { - super.onRelease(direction); - if (direction > 0) { - toast("下拉"); - } else { - toast("上拉"); - } - } - }); - refreshView.setOnAbsListViewScrollListener(new OnScrollListener() { - - @Override - public void onScrollStateChanged(AbsListView view, int scrollState) { - LogUtils.i("onScrollStateChanged"); - } - - @Override - public void onScroll(AbsListView view, int firstVisibleItem, - int visibleItemCount, int totalItemCount) { - LogUtils.i("onScroll"); - } - }); - - } - - public void toast(String msg) { - Toast.makeText(getApplicationContext(), msg, 0).show(); - } + refreshView.setXRefreshViewListener(new SimpleXRefreshListener() { + @Override + public void onRefresh(boolean isPullDown) { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + refreshView.stopRefresh(); + lastRefreshTime = refreshView.getLastRefreshTime(); + } + }, 2000); + } + + @Override + public void onLoadMore(boolean isSilence) { + new Handler().postDelayed(new Runnable() { + + @Override + public void run() { + refreshView.stopLoadMore(); + } + }, 2000); + } + + @Override + public void onRelease(float direction) { + super.onRelease(direction); + if (direction > 0) { + toast("下拉"); + } else { + toast("上拉"); + } + } + }); + refreshView.setOnAbsListViewScrollListener(new OnScrollListener() { + + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) { + LogUtils.i("onScrollStateChanged"); + } + + @Override + public void onScroll(AbsListView view, int firstVisibleItem, + int visibleItemCount, int totalItemCount) { + LogUtils.i("onScroll"); + } + }); + + } + + public void toast(String msg) { + Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show(); + } } \ No newline at end of file diff --git a/app/src/main/java/com/andview/example/activity/MainActivity.java b/app/src/main/java/com/andview/example/activity/MainActivity.java index 68b55dc..3b28807 100644 --- a/app/src/main/java/com/andview/example/activity/MainActivity.java +++ b/app/src/main/java/com/andview/example/activity/MainActivity.java @@ -6,6 +6,8 @@ import android.view.View; import com.andview.example.R; +import com.andview.example.view.EatPluseView; +import com.andview.refreshview.utils.LogUtils; public class MainActivity extends Activity { @@ -13,6 +15,8 @@ public class MainActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); + //如果不想XRefreshView后台输出log,此处传入false即可 + LogUtils.enableLog(true); } public void onClick(View v) { @@ -42,9 +46,31 @@ public void onClick(View v) { case R.id.bt_not_full_screen: intent = new Intent(this, NotFullScreenActivity.class); break; + case R.id.bt_not_fullscreen_nofooter: + intent = new Intent(this, NotFullScreenWithoutFooterActivity.class); + break; + case R.id.bt_emptyview: + intent = new Intent(this, EmptyViewActivity.class); + break; + case R.id.bt_smileview: + intent = new Intent(this, SmileViewActivity.class); + break; case R.id.bt_rain: // intent = new Intent(this, RainDropActivity.class); break; + + case R.id.bt_wine: + intent = new Intent(this, WineActivity.class); + break; + case R.id.bt_jd: + intent = new Intent(this, JDActivity.class); + break; + case R.id.bt_carcrm: + intent = new Intent(this, CarCrmActivity.class); + break; + case R.id.bt_pluse: + intent = new Intent(this, PluseActivity.class); + break; default: break; } diff --git a/app/src/main/java/com/andview/example/activity/NotFullScreenActivity.java b/app/src/main/java/com/andview/example/activity/NotFullScreenActivity.java index 38e9d81..095a35d 100644 --- a/app/src/main/java/com/andview/example/activity/NotFullScreenActivity.java +++ b/app/src/main/java/com/andview/example/activity/NotFullScreenActivity.java @@ -3,11 +3,13 @@ import android.app.Activity; import android.os.Bundle; import android.os.Handler; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; import android.view.Menu; import android.view.MenuItem; +import android.view.View; + +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import com.andview.example.R; import com.andview.example.recylerview.Person; @@ -43,7 +45,7 @@ protected void onCreate(Bundle savedInstanceState) { adapter = new SimpleAdapter(personList, this); // 设置静默加载模式 -// xRefreshView.setSilenceLoadMore(); +// xRefreshView1.setSilenceLoadMore(); layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); // 静默加载模式不能设置footerview @@ -53,14 +55,17 @@ protected void onCreate(Bundle savedInstanceState) { xRefreshView.setPullLoadEnable(true); xRefreshView.setMoveForHorizontal(true); xRefreshView.setAutoLoadMore(true); + xRefreshView.setEmptyView(R.layout.layout_emptyview); + showXRefreshView(false); + adapter.setCustomLoadMoreView(new XRefreshViewFooter(this)); //设置静默加载时提前加载的item个数 -// xRefreshView.setPreLoadCount(4); +// xRefreshView1.setPreLoadCount(4); xRefreshView.setXRefreshViewListener(new SimpleXRefreshListener() { @Override - public void onRefresh() { + public void onRefresh(boolean isPullDown) { new Handler().postDelayed(new Runnable() { @Override public void run() { @@ -70,14 +75,15 @@ public void run() { } @Override - public void onLoadMore(boolean isSlience) { + public void onLoadMore(boolean isSilence) { + LogUtils.e("loadmore"); new Handler().postDelayed(new Runnable() { public void run() { for (int i = 0; i < 1; i++) { adapter.insert(new Person("More ", mLoadCount + "21"), adapter.getAdapterItemCount()); } - LogUtils.i("test onLoadMore adapter.count="+adapter.getItemCount()); + LogUtils.i("test onLoadMore recyclerviewAdapter.count=" + adapter.getItemCount()); mLoadCount++; if (mLoadCount >= 5) { @@ -91,10 +97,10 @@ public void run() { } }); //如果想在数据加载完成以后不隐藏footerview则需要调用下面这行代码并传入false -// xRefreshView.setHideFooterWhenComplete(false); +// xRefreshView1.setHideFooterWhenComplete(false); requestData(); // // 实现Recyclerview的滚动监听 -// xRefreshView.setOnRecyclerViewScrollListener(new OnScrollListener() { +// xRefreshView1.setOnRecyclerViewScrollListener(new OnScrollListener() { // @Override // public void onScrolled(RecyclerView recyclerView, int dx, int dy) { // super.onScrolled(recyclerView, dx, dy); @@ -104,12 +110,16 @@ public void run() { // public void onScrollStateChanged(RecyclerView recyclerView, // int newState) { // if (newState == RecyclerView.SCROLL_STATE_IDLE) { -// isBottom = adapter.getItemCount() - 1 == lastVisibleItem; +// isBottom = recyclerviewAdapter.getItemCount() - 1 == lastVisibleItem; // } // } // }); } + public void showXRefreshView(boolean show) { + xRefreshView.setVisibility(show ? View.VISIBLE : View.GONE); + } + public void requestData() { new Handler().postDelayed(new Runnable() { @Override @@ -124,6 +134,7 @@ private void initData() { for (int i = 0; i < 1; i++) { Person person = new Person("name" + i, "" + i); personList.add(person); + showXRefreshView(true); } } diff --git a/app/src/main/java/com/andview/example/activity/NotFullScreenWithoutFooterActivity.java b/app/src/main/java/com/andview/example/activity/NotFullScreenWithoutFooterActivity.java new file mode 100644 index 0000000..6588b43 --- /dev/null +++ b/app/src/main/java/com/andview/example/activity/NotFullScreenWithoutFooterActivity.java @@ -0,0 +1,156 @@ +package com.andview.example.activity; + +import android.app.Activity; +import android.os.Bundle; +import android.os.Handler; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.andview.example.R; +import com.andview.example.recylerview.Person; +import com.andview.example.recylerview.SimpleAdapter; +import com.andview.example.ui.CustomFooterView; +import com.andview.refreshview.XRefreshView; +import com.andview.refreshview.XRefreshView.SimpleXRefreshListener; + +import java.util.ArrayList; +import java.util.List; + +public class NotFullScreenWithoutFooterActivity extends Activity { + RecyclerView recyclerView; + SimpleAdapter adapter; + List personList = new ArrayList(); + XRefreshView xRefreshView; + // GridLayoutManager layoutManager; + LinearLayoutManager layoutManager; + private int mLoadCount = 0; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_recylerview2); + xRefreshView = (XRefreshView) findViewById(R.id.xrefreshview); + xRefreshView.setPullLoadEnable(true); + recyclerView = (RecyclerView) findViewById(R.id.recycler_view_test_rv); + recyclerView.setHasFixedSize(true); + + adapter = new SimpleAdapter(personList, this); + // 设置静默加载模式 +// xRefreshView1.setSilenceLoadMore(); + layoutManager = new LinearLayoutManager(this); + recyclerView.setLayoutManager(layoutManager); + // 静默加载模式不能设置footerview + recyclerView.setAdapter(adapter); + //设置刷新完成以后,headerview固定的时间 + xRefreshView.setPinnedTime(1000); + xRefreshView.setPullLoadEnable(true); + xRefreshView.setMoveForHorizontal(true); + xRefreshView.setAutoLoadMore(true); + xRefreshView.setEmptyView(R.layout.layout_emptyview); + xRefreshView.getEmptyView().setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + xRefreshView.startRefresh(); + } + }); + //设置静默加载时提前加载的item个数 +// xRefreshView1.setPreLoadCount(4); + + xRefreshView.setXRefreshViewListener(new SimpleXRefreshListener() { + + @Override + public void onRefresh(boolean isPullDown) { + requestData(); + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + xRefreshView.stopRefresh(); + } + }, 1000); + } + + @Override + public void onLoadMore(boolean isSilence) { + new Handler().postDelayed(new Runnable() { + public void run() { + for (int i = 0; i < 1; i++) { + adapter.insert(new Person("More ", mLoadCount + "21"), + adapter.getAdapterItemCount()); + } + mLoadCount++; + + if (mLoadCount >= 5) { + xRefreshView.setLoadComplete(true); + } else { + // 刷新完成必须调用此方法停止加载 + xRefreshView.stopLoadMore(); + } + } + }, 1000); + } + }); + //如果想在数据加载完成以后不隐藏footerview则需要调用下面这行代码并传入false +// xRefreshView1.setHideFooterWhenComplete(false); + requestData(); +// // 实现Recyclerview的滚动监听 +// xRefreshView1.setOnRecyclerViewScrollListener(new OnScrollListener() { +// @Override +// public void onScrolled(RecyclerView recyclerView, int dx, int dy) { +// super.onScrolled(recyclerView, dx, dy); +// lastVisibleItem = layoutManager.findLastVisibleItemPosition(); +// } +// +// public void onScrollStateChanged(RecyclerView recyclerView, +// int newState) { +// if (newState == RecyclerView.SCROLL_STATE_IDLE) { +// isBottom = recyclerviewAdapter.getItemCount() - 1 == lastVisibleItem; +// } +// } +// }); + } + + public void requestData() { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + if (adapter.getCustomLoadMoreView() == null) { + adapter.setCustomLoadMoreView(new CustomFooterView(NotFullScreenWithoutFooterActivity.this)); + } + addData(); + adapter.setData(personList); + } + }, 1000); + } + + private void addData() { + for (int i = 0; i < 3; i++) { + Person person = new Person("name" + i, "" + i); + personList.add(person); + } + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // 加载菜单 + getMenuInflater().inflate(R.menu.main, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int menuId = item.getItemId(); + switch (menuId) { + case R.id.menu_clear: + xRefreshView.setLoadComplete(false); + break; + case R.id.menu_refresh: + xRefreshView.startRefresh(); + break; + } + return super.onOptionsItemSelected(item); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/andview/example/activity/PluseActivity.java b/app/src/main/java/com/andview/example/activity/PluseActivity.java new file mode 100644 index 0000000..061379c --- /dev/null +++ b/app/src/main/java/com/andview/example/activity/PluseActivity.java @@ -0,0 +1,16 @@ +package com.andview.example.activity; + +import android.os.Bundle; +import android.app.Activity; + +import com.andview.example.R; + +public class PluseActivity extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_pluse); + } + +} diff --git a/app/src/main/java/com/andview/example/activity/RainDropActivity.java b/app/src/main/java/com/andview/example/activity/RainDropActivity.java index 0897188..7b039a9 100644 --- a/app/src/main/java/com/andview/example/activity/RainDropActivity.java +++ b/app/src/main/java/com/andview/example/activity/RainDropActivity.java @@ -19,7 +19,7 @@ public class RainDropActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_scrollview); + setContentView(R.layout.adapter_scrollview); outView = (XRefreshView) findViewById(R.id.custom_view); ll = (LinearLayout) findViewById(R.id.ll); @@ -30,7 +30,7 @@ public void onCreate(Bundle savedInstanceState) { outView.setXRefreshViewListener(new SimpleXRefreshListener() { @Override - public void onRefresh() { + public void onRefresh(boolean isPullDown) { new Handler().postDelayed(new Runnable() { @Override @@ -41,7 +41,7 @@ public void run() { } @Override - public void onLoadMore(boolean isSlience) { + public void onLoadMore(boolean isSilence) { new Handler().postDelayed(new Runnable() { @Override public void run() { diff --git a/app/src/main/java/com/andview/example/activity/RecyclerViewsActivity.java b/app/src/main/java/com/andview/example/activity/RecyclerViewsActivity.java index 1284ce7..5d330d9 100644 --- a/app/src/main/java/com/andview/example/activity/RecyclerViewsActivity.java +++ b/app/src/main/java/com/andview/example/activity/RecyclerViewsActivity.java @@ -6,6 +6,14 @@ import android.view.View; import com.andview.example.R; +import com.andview.example.activity.recyclerview.BannerRecyclerViewActivity; +import com.andview.example.activity.recyclerview.GridRecyclerViewActivity; +import com.andview.example.activity.recyclerview.LinearRecyclerViewActivity; +import com.andview.example.activity.recyclerview.MultiItemRecyclerViewActivity; +import com.andview.example.activity.recyclerview.ShowFooterWhenNoMoreDataRecyclerViewActivity; +import com.andview.example.activity.recyclerview.SilenceRecyclerViewActivity; +import com.andview.example.activity.recyclerview.StaggeredRecyclerViewActivity; +import com.andview.example.activity.recyclerview.WithoutBaseAdapterRecyclerViewActivity; public class RecyclerViewsActivity extends Activity { @@ -36,6 +44,12 @@ public void onClick(View v) { case R.id.bt_multi_item: intent = new Intent(this, MultiItemRecyclerViewActivity.class); break; + case R.id.bt_without_baseRecyclerAdapter: + intent = new Intent(this, WithoutBaseAdapterRecyclerViewActivity.class); + break; + case R.id.bt_showFooter_noMoreData: + intent = new Intent(this, ShowFooterWhenNoMoreDataRecyclerViewActivity.class); + break; default: break; } diff --git a/app/src/main/java/com/andview/example/activity/ScrollViewActivity.java b/app/src/main/java/com/andview/example/activity/ScrollViewActivity.java index 36822db..8bb6968 100644 --- a/app/src/main/java/com/andview/example/activity/ScrollViewActivity.java +++ b/app/src/main/java/com/andview/example/activity/ScrollViewActivity.java @@ -2,71 +2,25 @@ import android.app.Activity; import android.os.Bundle; -import android.os.Handler; import android.view.Menu; import android.view.MenuItem; -import android.widget.LinearLayout; -import android.widget.TextView; + +import androidx.viewpager.widget.ViewPager; import com.andview.example.R; -import com.andview.example.ui.raindrop.CustomerFooter; -import com.andview.refreshview.XRefreshView; -import com.andview.refreshview.XRefreshView.SimpleXRefreshListener; +import com.andview.example.ScrollAdapter; public class ScrollViewActivity extends Activity { - private XRefreshView outView; - private LinearLayout ll; - private int count = 1; + private ViewPager mViewPager; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_scrollview); - outView = (XRefreshView) findViewById(R.id.custom_view); - ll = (LinearLayout) findViewById(R.id.ll); - outView.setAutoRefresh(false); - outView.setPullLoadEnable(true); - outView.setPinnedTime(1000); - outView.setAutoLoadMore(true); -// outView.setAutoLoadMore(true); -// outView.setSilenceLoadMore(); - outView.setCustomFooterView(new CustomerFooter(this)); - - outView.setXRefreshViewListener(new SimpleXRefreshListener() { - - @Override - public void onRefresh() { + mViewPager = (ViewPager) findViewById(R.id.index_viewpager); + ScrollAdapter adapter = new ScrollAdapter(this); + mViewPager.setAdapter(adapter); - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - outView.stopRefresh(); - } - }, 2000); - } - - @Override - public void onLoadMore(boolean isSlience) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - //setLoadComplete不要和stopLoadMore同时调用 - if (count > 100) { - outView.setLoadComplete(true); - } else { - outView.stopLoadMore(); - } - count++; - } - }, 2000); - } - }); - for (int i = 0; i < 50; i++) { - TextView tv = new TextView(this); - tv.setTextIsSelectable(true); - tv.setText("数据" + i); - ll.addView(tv); - } } @Override @@ -78,23 +32,6 @@ public boolean onCreateOptionsMenu(Menu menu) { @Override public boolean onOptionsItemSelected(MenuItem item) { - int menuId = item.getItemId(); - switch (menuId) { - case R.id.menu_clear: - outView.setPullLoadEnable(!outView.getPullLoadEnable()); - break; - case R.id.menu_refresh: - outView.startRefresh(); - break; - - default: - break; - } return super.onOptionsItemSelected(item); } -// @Override -// protected void onResume() { -// super.onResume(); -// outView.startRefresh(); -// } } diff --git a/app/src/main/java/com/andview/example/activity/SmileViewActivity.java b/app/src/main/java/com/andview/example/activity/SmileViewActivity.java new file mode 100644 index 0000000..0150917 --- /dev/null +++ b/app/src/main/java/com/andview/example/activity/SmileViewActivity.java @@ -0,0 +1,124 @@ +package com.andview.example.activity; + +import android.app.Activity; +import android.os.Bundle; +import android.os.Handler; +import android.view.View; +import android.widget.AbsListView; +import android.widget.AbsListView.OnScrollListener; + +import com.andview.example.R; +import com.andview.example.StickyListBean; +import com.andview.example.StickylistAdapter; +import com.andview.example.stickyListHeaders.StickyListHeadersListView; +import com.andview.example.ui.raindrop.CustomerFooter; +import com.andview.example.ui.smileyloadingview.SmileyHeaderView; +import com.andview.refreshview.XRefreshView; +import com.andview.refreshview.listener.OnBottomLoadMoreTime; +import com.andview.refreshview.listener.OnTopRefreshTime; + +import java.util.ArrayList; +import java.util.List; + +public class SmileViewActivity extends Activity { + private StickyListHeadersListView stickyLv; + private List list = new ArrayList(); + private XRefreshView refreshView; + private int mTotalItemCount; + private StickylistAdapter adapter; + private final int mPinnedTime = 1000; + + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_customview); + initData(); + stickyLv = (StickyListHeadersListView) findViewById(R.id.sticky_list); + adapter = new StickylistAdapter(getApplicationContext(), list); + stickyLv.setAdapter(adapter); + refreshView = (XRefreshView) findViewById(R.id.custom_view); + refreshView.setPullLoadEnable(true); + refreshView.setPinnedTime(mPinnedTime); + refreshView.setCustomHeaderView(new SmileyHeaderView(this)); + refreshView.setCustomFooterView(new CustomerFooter(SmileViewActivity.this)); + refreshView.setOnTopRefreshTime(new OnTopRefreshTime() { + + @Override + public boolean isTop() { + if (stickyLv.getFirstVisiblePosition() == 0) { + View firstVisibleChild = stickyLv.getListChildAt(0); + return firstVisibleChild.getTop() >= 0; + } + return false; + } + }); + refreshView.setOnBottomLoadMoreTime(new OnBottomLoadMoreTime() { + + @Override + public boolean isBottom() { + if (stickyLv.getLastVisiblePosition() == mTotalItemCount - 1) { + View lastChild = stickyLv.getListChildAt(stickyLv.getListChildCount() - 1); + return (lastChild.getBottom() + stickyLv.getPaddingBottom()) <= stickyLv.getMeasuredHeight(); + } + return false; + } + }); + stickyLv.setOnScrollListener(new OnScrollListener() { + + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) { + + } + + @Override + public void onScroll(AbsListView view, int firstVisibleItem, + int visibleItemCount, int totalItemCount) { + mTotalItemCount = totalItemCount; + } + }); + refreshView.setXRefreshViewListener(new XRefreshView.SimpleXRefreshListener() { + + @Override + public void onRefresh(boolean isPullDown) { + + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + refreshView.stopRefresh(); + } + }, 4000); + } + + @Override + public void onLoadMore(boolean isSilence) { + + new Handler().postDelayed(new Runnable() { + + @Override + public void run() { + refreshView.stopLoadMore(); + } + }, 2000); + } + }); + } + + int section = 0; + String YM = null; + String content = null; + + private void initData() { + + for (int i = 0; i < 20; i++) { + if (i % 5 == 0) { + section++; + YM = "第" + section + "个头"; + } + content = "第" + i + "项数据"; + StickyListBean bean = new StickyListBean(section, YM, content); + list.add(bean); + } + + } +} diff --git a/app/src/main/java/com/andview/example/activity/TaoBaoActivity.java b/app/src/main/java/com/andview/example/activity/TaoBaoActivity.java new file mode 100644 index 0000000..6a94bd7 --- /dev/null +++ b/app/src/main/java/com/andview/example/activity/TaoBaoActivity.java @@ -0,0 +1,16 @@ +package com.andview.example.activity; + +import android.os.Bundle; +import android.app.Activity; + +import com.andview.example.R; + +public class TaoBaoActivity extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_tao_bao); + } + +} diff --git a/app/src/main/java/com/andview/example/activity/WebViewActivity.java b/app/src/main/java/com/andview/example/activity/WebViewActivity.java index 2c8c4d5..2819dee 100644 --- a/app/src/main/java/com/andview/example/activity/WebViewActivity.java +++ b/app/src/main/java/com/andview/example/activity/WebViewActivity.java @@ -10,6 +10,7 @@ import com.andview.example.ui.raindrop.CustomerFooter; import com.andview.refreshview.XRefreshView; import com.andview.refreshview.XRefreshView.SimpleXRefreshListener; +import com.andview.refreshview.utils.LogUtils; public class WebViewActivity extends Activity { private XRefreshView outView; @@ -30,6 +31,12 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { return true; } + @Override + public void onScaleChanged(WebView view, float oldScale, float newScale) { + super.onScaleChanged(view, oldScale, newScale); + LogUtils.e("oldScale="+oldScale+";newScale="+newScale); + } + @Override public void onPageFinished(WebView view, String url) { outView.stopRefresh(); @@ -44,12 +51,12 @@ public void onPageFinished(WebView view, String url) { outView.setXRefreshViewListener(new SimpleXRefreshListener() { @Override - public void onRefresh() { + public void onRefresh(boolean isPullDown) { mWebView.loadUrl("http://www.baidu.com"); } @Override - public void onLoadMore(boolean isSlience) { + public void onLoadMore(boolean isSilence) { new Handler().postDelayed(new Runnable() { @Override diff --git a/app/src/main/java/com/andview/example/activity/WineActivity.java b/app/src/main/java/com/andview/example/activity/WineActivity.java new file mode 100644 index 0000000..c258315 --- /dev/null +++ b/app/src/main/java/com/andview/example/activity/WineActivity.java @@ -0,0 +1,49 @@ +package com.andview.example.activity; + +import android.os.Bundle; +import android.app.Activity; +import android.os.Handler; + +import com.andview.example.DensityUtil; +import com.andview.example.R; +import com.andview.example.view.XRefreshViewWineHeader; +import com.andview.refreshview.XRefreshView; + +public class WineActivity extends Activity { + private XRefreshView wineXRefreshView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_wine); + + initView(); + initData(); + } + + private void initView() { + wineXRefreshView = (XRefreshView) findViewById(R.id.wineXRefreshView); + wineXRefreshView.setCustomHeaderView(new XRefreshViewWineHeader(this)); + wineXRefreshView.setAddHeaderTop(true); + wineXRefreshView.setHeaderTopHeight(DensityUtil.dip2px(this, 212)); + } + + private void initData() { + wineXRefreshView.setAutoRefresh(false); + wineXRefreshView.setPullRefreshEnable(true); + wineXRefreshView.setMoveForHorizontal(true); + wineXRefreshView.setXRefreshViewListener(new XRefreshView.SimpleXRefreshListener() { + @Override + public void onRefresh(boolean isPullDown) { + super.onRefresh(isPullDown); + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + wineXRefreshView.stopRefresh(); + } + }, 1000); + } + }); + } + +} diff --git a/app/src/main/java/com/andview/example/activity/BannerRecyclerViewActivity.java b/app/src/main/java/com/andview/example/activity/recyclerview/BannerRecyclerViewActivity.java similarity index 74% rename from app/src/main/java/com/andview/example/activity/BannerRecyclerViewActivity.java rename to app/src/main/java/com/andview/example/activity/recyclerview/BannerRecyclerViewActivity.java index 3e88410..f728ebc 100644 --- a/app/src/main/java/com/andview/example/activity/BannerRecyclerViewActivity.java +++ b/app/src/main/java/com/andview/example/activity/recyclerview/BannerRecyclerViewActivity.java @@ -1,10 +1,10 @@ -package com.andview.example.activity; +package com.andview.example.activity.recyclerview; import android.app.Activity; import android.os.Bundle; import android.os.Handler; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Random; public class BannerRecyclerViewActivity extends Activity { RecyclerView recyclerView; @@ -50,7 +51,7 @@ protected void onCreate(Bundle savedInstanceState) { initData(); adapter = new SimpleAdapter(personList, this); // 设置静默加载模式 -// xRefreshView.setSilenceLoadMore(); +// xRefreshView1.setSilenceLoadMore(); layoutManager = new GridLayoutManager(this, 2); recyclerView.setLayoutManager(layoutManager); headerView = adapter.setHeaderView(R.layout.bannerview, recyclerView); @@ -66,33 +67,45 @@ protected void onCreate(Bundle savedInstanceState) { xRefreshView.setAutoLoadMore(false); xRefreshView.setPinnedTime(1000); xRefreshView.setMoveForHorizontal(true); -// adapter.setHeaderView(headerView, recyclerView); + xRefreshView.setPullLoadEnable(true); +// recyclerviewAdapter.setHeaderView(headerView, recyclerView); adapter.setCustomLoadMoreView(new XRefreshViewFooter(this)); -// xRefreshView.setPullRefreshEnable(false); +// xRefreshView1.setPullRefreshEnable(false); //设置在下拉刷新被禁用的情况下,是否允许界面被下拉,默认是true -// xRefreshView.setMoveHeadWhenDisablePullRefresh(false); -// xRefreshView.enablePullUpWhenLoadCompleted(false); -// xRefreshView.setPullLoadEnable(false); -// xRefreshView.enableRecyclerViewPullUp(false); +// xRefreshView1.setMoveHeadWhenDisablePullRefresh(false); +// xRefreshView1.enablePullUpWhenLoadCompleted(false); +// xRefreshView1.setPullLoadEnable(false); +// xRefreshView1.enableRecyclerViewPullUp(false); //设置静默加载时提前加载的item个数 -// xRefreshView.setPreLoadCount(2); +// xRefreshView1.setPreLoadCount(2); xRefreshView.setXRefreshViewListener(new SimpleXRefreshListener() { @Override - public void onRefresh() { + public void onRefresh(boolean isPullDown) { new Handler().postDelayed(new Runnable() { @Override public void run() { - xRefreshView.stopRefresh(); + //模拟数据加载失败的情况 + Random random = new Random(); + boolean success = random.nextBoolean(); + if (success) { + xRefreshView.stopRefresh(); + } else { + xRefreshView.stopRefresh(false); + } + //或者 +// xRefreshView1.stopRefresh(success); } }, 2000); } @Override - public void onLoadMore(boolean isSlience) { + public void onLoadMore(boolean isSilence) { new Handler().postDelayed(new Runnable() { public void run() { + if(xRefreshView.hasLoadCompleted()){ + } for (int i = 0; i < 6; i++) { adapter.insert(new Person("More ", "21"), adapter.getAdapterItemCount()); @@ -102,7 +115,7 @@ public void run() { xRefreshView.setLoadComplete(true); } else { // 刷新完成必须调用此方法停止加载 - xRefreshView.stopLoadMore(); + xRefreshView.stopLoadMore(false); } } }, 1000); @@ -111,7 +124,7 @@ public void run() { } private void initData() { - for (int i = 0; i < 3; i++) { + for (int i = 0; i < 10; i++) { Person person = new Person("name" + i, "" + i); personList.add(person); } @@ -141,8 +154,8 @@ public boolean onOptionsItemSelected(MenuItem item) { break; case R.id.menu_refresh: xRefreshView.startRefresh(); -// xRefreshView.setPullRefreshEnable(true); -// xRefreshView.setPullLoadEnable(!xRefreshView.getPullLoadEnable()); +// xRefreshView1.setPullRefreshEnable(true); +// xRefreshView1.setPullLoadEnable(!xRefreshView1.getPullLoadEnable()); break; } diff --git a/app/src/main/java/com/andview/example/activity/GridRecyclerViewActivity.java b/app/src/main/java/com/andview/example/activity/recyclerview/GridRecyclerViewActivity.java similarity index 85% rename from app/src/main/java/com/andview/example/activity/GridRecyclerViewActivity.java rename to app/src/main/java/com/andview/example/activity/recyclerview/GridRecyclerViewActivity.java index 042613f..820beec 100644 --- a/app/src/main/java/com/andview/example/activity/GridRecyclerViewActivity.java +++ b/app/src/main/java/com/andview/example/activity/recyclerview/GridRecyclerViewActivity.java @@ -1,10 +1,10 @@ -package com.andview.example.activity; +package com.andview.example.activity.recyclerview; import android.app.Activity; import android.os.Bundle; import android.os.Handler; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.view.Menu; import android.view.MenuItem; @@ -40,12 +40,12 @@ protected void onCreate(Bundle savedInstanceState) { initData(); adapter = new SimpleAdapter(personList,this); // 设置静默加载模式 -// xRefreshView.setSilenceLoadMore(); +// xRefreshView1.setSilenceLoadMore(); layoutManager = new GridLayoutManager(this,2); recyclerView.setLayoutManager(layoutManager); // 静默加载模式不能设置footerview recyclerView.setAdapter(adapter); -// xRefreshView.setAutoLoadMore(false); +// xRefreshView1.setAutoLoadMore(false); xRefreshView.setPinnedTime(1000); xRefreshView.setMoveForHorizontal(true); @@ -53,18 +53,18 @@ protected void onCreate(Bundle savedInstanceState) { //并注释掉第四行代码 // CustomerFooter customerFooter = new CustomerFooter(this); // customerFooter.setRecyclerView(recyclerView); -// adapter.setCustomLoadMoreView(customerFooter); +// recyclerviewAdapter.setCustomLoadMoreView(customerFooter); adapter.setCustomLoadMoreView(new XRefreshViewFooter(this)); -// adapter.setCustomLoadMoreView(new XRefreshViewFooter(this)); -// xRefreshView.setPullLoadEnable(false); +// recyclerviewAdapter.setCustomLoadMoreView(new XRefreshViewFooter(this)); +// xRefreshView1.setPullLoadEnable(false); //设置静默加载时提前加载的item个数 -// xRefreshView.setPreLoadCount(2); +// xRefreshView1.setPreLoadCount(2); xRefreshView.setXRefreshViewListener(new SimpleXRefreshListener() { @Override - public void onRefresh() { + public void onRefresh(boolean isPullDown) { new Handler().postDelayed(new Runnable() { @Override public void run() { @@ -74,7 +74,7 @@ public void run() { } @Override - public void onLoadMore(boolean isSlience) { + public void onLoadMore(boolean isSilence) { new Handler().postDelayed(new Runnable() { public void run() { for (int i = 0; i < 6; i++) { @@ -93,7 +93,7 @@ public void run() { } }); // // 实现Recyclerview的滚动监听,在这里可以自己处理到达底部加载更多的操作,可以不实现onLoadMore方法,更加自由 -// xRefreshView.setOnRecyclerViewScrollListener(new OnScrollListener() { +// xRefreshView1.setOnRecyclerViewScrollListener(new OnScrollListener() { // @Override // public void onScrolled(RecyclerView recyclerView, int dx, int dy) { // super.onScrolled(recyclerView, dx, dy); @@ -103,7 +103,7 @@ public void run() { // public void onScrollStateChanged(RecyclerView recyclerView, // int newState) { // if (newState == RecyclerView.SCROLL_STATE_IDLE) { -// isBottom = adapter.getItemCount() - 1 == lastVisibleItem; +// isBottom = recyclerviewAdapter.getItemCount() - 1 == lastVisibleItem; // } // } // }); diff --git a/app/src/main/java/com/andview/example/activity/LinearRecyclerViewActivity.java b/app/src/main/java/com/andview/example/activity/recyclerview/LinearRecyclerViewActivity.java similarity index 75% rename from app/src/main/java/com/andview/example/activity/LinearRecyclerViewActivity.java rename to app/src/main/java/com/andview/example/activity/recyclerview/LinearRecyclerViewActivity.java index c117281..a2046eb 100644 --- a/app/src/main/java/com/andview/example/activity/LinearRecyclerViewActivity.java +++ b/app/src/main/java/com/andview/example/activity/recyclerview/LinearRecyclerViewActivity.java @@ -1,11 +1,11 @@ -package com.andview.example.activity; +package com.andview.example.activity.recyclerview; import android.app.Activity; import android.os.Bundle; import android.os.Handler; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.view.Menu; import android.view.MenuItem; @@ -44,7 +44,7 @@ protected void onCreate(Bundle savedInstanceState) { initData(); adapter = new SimpleAdapter(personList, this); // 设置静默加载模式 -// xRefreshView.setSilenceLoadMore(); +// xRefreshView1.setSilenceLoadMore(); layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); // 静默加载模式不能设置footerview @@ -59,12 +59,23 @@ protected void onCreate(Bundle savedInstanceState) { xRefreshView.enableRecyclerViewPullUp(true); xRefreshView.enablePullUpWhenLoadCompleted(true); //设置静默加载时提前加载的item个数 -// xRefreshView.setPreLoadCount(4); +// xefreshView1.setPreLoadCount(4); + //设置Recyclerview的滑动监听 + xRefreshView.setOnRecyclerViewScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + } + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + } + }); xRefreshView.setXRefreshViewListener(new SimpleXRefreshListener() { @Override - public void onRefresh() { + public void onRefresh(boolean isPullDown) { new Handler().postDelayed(new Runnable() { @Override public void run() { @@ -74,29 +85,29 @@ public void run() { } @Override - public void onLoadMore(boolean isSlience) { + public void onLoadMore(boolean isSilence) { new Handler().postDelayed(new Runnable() { public void run() { // for (int i = 0; i < 6; i++) { -// adapter.insert(new Person("More ", mLoadCount + "21"), -// adapter.getAdapterItemCount()); +// recyclerviewAdapter.insert(new Person("More ", mLoadCount + "21"), +// recyclerviewAdapter.getAdapterItemCount()); // } mLoadCount++; - if (mLoadCount >= 3) { + if (mLoadCount >= 3) {//模拟没有更多数据的情况 xRefreshView.setLoadComplete(true); } else { // 刷新完成必须调用此方法停止加载 - xRefreshView.stopLoadMore(); - //当数据加载失败时,可以调用以下方法,传入false,不传默认为true + xRefreshView.stopLoadMore(false); + //当数据加载失败 不需要隐藏footerview时,可以调用以下方法,传入false,不传默认为true // 同时在Footerview的onStateFinish(boolean hideFooter),可以在hideFooter为false时,显示数据加载失败的ui -// xRefreshView.stopLoadMore(false); +// xRefreshView1.stopLoadMore(false); } } }, 1000); } }); // // 实现Recyclerview的滚动监听,在这里可以自己处理到达底部加载更多的操作,可以不实现onLoadMore方法,更加自由 -// xRefreshView.setOnRecyclerViewScrollListener(new OnScrollListener() { +// xRefreshView1.setOnRecyclerViewScrollListener(new OnScrollListener() { // @Override // public void onScrolled(RecyclerView recyclerView, int dx, int dy) { // super.onScrolled(recyclerView, dx, dy); @@ -106,14 +117,14 @@ public void run() { // public void onScrollStateChanged(RecyclerView recyclerView, // int newState) { // if (newState == RecyclerView.SCROLL_STATE_IDLE) { -// isBottom = adapter.getItemCount() - 1 == lastVisibleItem; +// isBottom = recyclerviewAdapter.getItemCount() - 1 == lastVisibleItem; // } // } // }); } private void initData() { - for (int i = 0; i < 30; i++) { + for (int i = 0; i < 15; i++) { Person person = new Person("name" + i, "" + i); personList.add(person); } diff --git a/app/src/main/java/com/andview/example/activity/MultiItemRecyclerViewActivity.java b/app/src/main/java/com/andview/example/activity/recyclerview/MultiItemRecyclerViewActivity.java similarity index 87% rename from app/src/main/java/com/andview/example/activity/MultiItemRecyclerViewActivity.java rename to app/src/main/java/com/andview/example/activity/recyclerview/MultiItemRecyclerViewActivity.java index 5d186b8..0917b64 100644 --- a/app/src/main/java/com/andview/example/activity/MultiItemRecyclerViewActivity.java +++ b/app/src/main/java/com/andview/example/activity/recyclerview/MultiItemRecyclerViewActivity.java @@ -1,10 +1,10 @@ -package com.andview.example.activity; +package com.andview.example.activity.recyclerview; import android.app.Activity; import android.os.Bundle; import android.os.Handler; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.view.Menu; import android.view.MenuItem; @@ -39,7 +39,7 @@ protected void onCreate(Bundle savedInstanceState) { adapter = new MultiItemAdapter(personList); // 设置静默加载模式 -// xRefreshView.setSilenceLoadMore(); +// xRefreshView1.setSilenceLoadMore(); layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); // 静默加载模式不能设置footerview @@ -48,15 +48,15 @@ protected void onCreate(Bundle savedInstanceState) { xRefreshView.setPinnedTime(1000); xRefreshView.setPullLoadEnable(true); xRefreshView.setMoveForHorizontal(true); -// xRefreshView.setAutoLoadMore(true); +// xRefreshView1.setAutoLoadMore(true); adapter.setCustomLoadMoreView(new XRefreshViewFooter(this)); //设置静默加载时提前加载的item个数 -// xRefreshView.setPreLoadCount(4); +// xRefreshView1.setPreLoadCount(4); xRefreshView.setXRefreshViewListener(new SimpleXRefreshListener() { @Override - public void onRefresh() { + public void onRefresh(boolean isPullDown) { new Handler().postDelayed(new Runnable() { @Override public void run() { @@ -65,13 +65,12 @@ public void run() { adapter.insert(new Person("More ", mLoadCount + "21", getType()), adapter.getAdapterItemCount()); } - xRefreshView.setLoadComplete(false); } }, 500); } @Override - public void onLoadMore(boolean isSlience) { + public void onLoadMore(boolean isSilence) { new Handler().postDelayed(new Runnable() { public void run() { for (int i = 0; i < 1; i++) { @@ -84,13 +83,15 @@ public void run() { } else { // 刷新完成必须调用此方法停止加载 xRefreshView.stopLoadMore(); + //如果数据加载完成以后不隐藏footerview,传入false +// xRefreshView1.stopLoadMore(false); } } }, 1000); } }); //如果想在数据加载完成以后不隐藏footerview则需要调用下面这行代码并传入false -// xRefreshView.setHideFooterWhenComplete(false); +// xRefreshView1.setHideFooterWhenComplete(false); requestData(); } diff --git a/app/src/main/java/com/andview/example/activity/recyclerview/ShowFooterWhenNoMoreDataRecyclerViewActivity.java b/app/src/main/java/com/andview/example/activity/recyclerview/ShowFooterWhenNoMoreDataRecyclerViewActivity.java new file mode 100644 index 0000000..89e0af2 --- /dev/null +++ b/app/src/main/java/com/andview/example/activity/recyclerview/ShowFooterWhenNoMoreDataRecyclerViewActivity.java @@ -0,0 +1,172 @@ +package com.andview.example.activity.recyclerview; + +import android.app.Activity; +import android.os.Bundle; +import android.os.Handler; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import android.view.Menu; +import android.view.MenuItem; + +import com.andview.example.R; +import com.andview.example.recylerview.Person; +import com.andview.example.recylerview.SimpleAdapter; +import com.andview.example.ui.NoMoreDataFooterView; +import com.andview.refreshview.XRefreshView; +import com.andview.refreshview.XRefreshView.SimpleXRefreshListener; + +import java.util.ArrayList; +import java.util.List; + +public class ShowFooterWhenNoMoreDataRecyclerViewActivity extends Activity { + RecyclerView recyclerView; + SimpleAdapter adapter; + List personList = new ArrayList(); + XRefreshView xRefreshView; + int lastVisibleItem = 0; + // GridLayoutManager layoutManager; + LinearLayoutManager layoutManager; + private boolean isBottom = false; + private int mLoadCount = 0; + + + private boolean isList = true;//false 为grid布局 + private boolean noMoreData = false; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_recylerview2); + xRefreshView = (XRefreshView) findViewById(R.id.xrefreshview); + recyclerView = (RecyclerView) findViewById(R.id.recycler_view_test_rv); + recyclerView.setHasFixedSize(true); + + initData(); + adapter = new SimpleAdapter(personList, this); + // 设置静默加载模式 +// xRefreshView1.setSilenceLoadMore(); + layoutManager = new LinearLayoutManager(this); + recyclerView.setLayoutManager(layoutManager); + // 静默加载模式不能设置footerview + recyclerView.setAdapter(adapter); + //设置刷新完成以后,headerview固定的时间 + xRefreshView.setPinnedTime(1000); + xRefreshView.setMoveForHorizontal(true); + xRefreshView.setPullLoadEnable(true); + xRefreshView.setAutoLoadMore(true); + adapter.setCustomLoadMoreView(new NoMoreDataFooterView(this)); + xRefreshView.enableReleaseToLoadMore(false); + xRefreshView.enableRecyclerViewPullUp(true); + xRefreshView.enablePullUpWhenLoadCompleted(true); + //设置静默加载时提前加载的item个数 +// xefreshView1.setPreLoadCount(4); + //设置Recyclerview的滑动监听 + xRefreshView.setOnRecyclerViewScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + } + + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + } + }); + xRefreshView.setXRefreshViewListener(new SimpleXRefreshListener() { + + @Override + public void onRefresh(boolean isPullDown) { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + xRefreshView.stopRefresh(); + } + }, 500); + } + + @Override + public void onLoadMore(boolean isSilence) { + if (noMoreData) { + xRefreshView.stopLoadMore(false); + return; + } + new Handler().postDelayed(new Runnable() { + public void run() { + mLoadCount++; + if (mLoadCount >= 2) {//模拟没有更多数据的情况 + xRefreshView.stopLoadMore(false); + noMoreData = true; + } else { + for (int i = 0; i < 6; i++) { + adapter.insert(new Person("More ", mLoadCount + "21"), adapter.getAdapterItemCount()); + } + // 刷新完成必须调用此方法停止加载 + xRefreshView.stopLoadMore(); + //当数据加载失败 不需要隐藏footerview时,可以调用以下方法,传入false,不传默认为true + // 同时在Footerview的onStateFinish(boolean hideFooter),可以在hideFooter为false时,显示数据加载失败的ui +// xRefreshView1.stopLoadMore(false); + } + } + }, 1000); + } + }); +// // 实现Recyclerview的滚动监听,在这里可以自己处理到达底部加载更多的操作,可以不实现onLoadMore方法,更加自由 +// xRefreshView1.setOnRecyclerViewScrollListener(new OnScrollListener() { +// @Override +// public void onScrolled(RecyclerView recyclerView, int dx, int dy) { +// super.onScrolled(recyclerView, dx, dy); +// lastVisibleItem = layoutManager.findLastVisibleItemPosition(); +// } +// +// public void onScrollStateChanged(RecyclerView recyclerView, +// int newState) { +// if (newState == RecyclerView.SCROLL_STATE_IDLE) { +// isBottom = recyclerviewAdapter.getItemCount() - 1 == lastVisibleItem; +// } +// } +// }); + } + + private void initData() { + for (int i = 0; i < 15; i++) { + Person person = new Person("name" + i, "" + i); + personList.add(person); + } + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // 加载菜单 + getMenuInflater().inflate(R.menu.main, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int menuId = item.getItemId(); + switch (menuId) { + case R.id.menu_clear: + mLoadCount = 0; + noMoreData = false; + xRefreshView.setLoadComplete(false); + //切换布局 + isList = !isList; + + if (isList) { + LinearLayoutManager layoutManager = new LinearLayoutManager(getApplicationContext()); + layoutManager.setOrientation(LinearLayoutManager.VERTICAL); + recyclerView.setLayoutManager(layoutManager); + } else { + recyclerView.setLayoutManager(new GridLayoutManager(getApplicationContext(), 2)); + } + //当切换layoutManager时,需调用此方法 + xRefreshView.notifyLayoutManagerChanged(); + break; + case R.id.menu_refresh: + xRefreshView.startRefresh(); + break; + } + return super.onOptionsItemSelected(item); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/andview/example/activity/SilenceRecyclerViewActivity.java b/app/src/main/java/com/andview/example/activity/recyclerview/SilenceRecyclerViewActivity.java similarity index 87% rename from app/src/main/java/com/andview/example/activity/SilenceRecyclerViewActivity.java rename to app/src/main/java/com/andview/example/activity/recyclerview/SilenceRecyclerViewActivity.java index 7ea2223..0962c95 100644 --- a/app/src/main/java/com/andview/example/activity/SilenceRecyclerViewActivity.java +++ b/app/src/main/java/com/andview/example/activity/recyclerview/SilenceRecyclerViewActivity.java @@ -1,14 +1,15 @@ -package com.andview.example.activity; +package com.andview.example.activity.recyclerview; import android.app.Activity; import android.os.Bundle; import android.os.Handler; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; import android.view.Menu; import android.view.MenuItem; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import com.andview.example.R; import com.andview.example.recylerview.Person; import com.andview.example.recylerview.SimpleAdapter; @@ -47,24 +48,24 @@ protected void onCreate(Bundle savedInstanceState) { initData(); adapter = new SimpleAdapter(personList, this); // 设置静默加载模式 - xRefreshView.setSilenceLoadMore(); + xRefreshView.setSilenceLoadMore(true); layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); // 静默加载模式不能设置footerview recyclerView.setAdapter(adapter); -// xRefreshView.setAutoLoadMore(true); +// xRefreshView1.setAutoLoadMore(true); //设置刷新完成以后,headerview固定的时间 xRefreshView.setPinnedTime(1000); xRefreshView.setMoveForHorizontal(true); -// adapter.setCustomLoadMoreView(new XRefreshViewFooter(this)); -// xRefreshView.setPullLoadEnable(false); +// recyclerviewAdapter.setCustomLoadMoreView(new XRefreshViewFooter(this)); +// xRefreshView1.setPullLoadEnable(false); //设置静默加载时提前加载的item个数 xRefreshView.setPreLoadCount(4); xRefreshView.setXRefreshViewListener(new SimpleXRefreshListener() { @Override - public void onRefresh() { + public void onRefresh(boolean isPullDown) { new Handler().postDelayed(new Runnable() { @Override public void run() { @@ -74,7 +75,7 @@ public void run() { } @Override - public void onLoadMore(boolean isSlience) { + public void onLoadMore(boolean isSilence) { new Handler().postDelayed(new Runnable() { public void run() { for (int i = 0; i < 6; i++) { @@ -94,7 +95,7 @@ public void run() { } }); // // 实现Recyclerview的滚动监听,在这里可以自己处理到达底部加载更多的操作,可以不实现onLoadMore方法,更加自由 -// xRefreshView.setOnRecyclerViewScrollListener(new OnScrollListener() { +// xRefreshView1.setOnRecyclerViewScrollListener(new OnScrollListener() { // @Override // public void onScrolled(RecyclerView recyclerView, int dx, int dy) { // super.onScrolled(recyclerView, dx, dy); @@ -104,7 +105,7 @@ public void run() { // public void onScrollStateChanged(RecyclerView recyclerView, // int newState) { // if (newState == RecyclerView.SCROLL_STATE_IDLE) { -// isBottom = adapter.getItemCount() - 1 == lastVisibleItem; +// isBottom = recyclerviewAdapter.getItemCount() - 1 == lastVisibleItem; // } // } // }); diff --git a/app/src/main/java/com/andview/example/activity/StaggeredRecyclerViewActivity.java b/app/src/main/java/com/andview/example/activity/recyclerview/StaggeredRecyclerViewActivity.java similarity index 87% rename from app/src/main/java/com/andview/example/activity/StaggeredRecyclerViewActivity.java rename to app/src/main/java/com/andview/example/activity/recyclerview/StaggeredRecyclerViewActivity.java index ef5adab..e2e2020 100644 --- a/app/src/main/java/com/andview/example/activity/StaggeredRecyclerViewActivity.java +++ b/app/src/main/java/com/andview/example/activity/recyclerview/StaggeredRecyclerViewActivity.java @@ -1,13 +1,14 @@ -package com.andview.example.activity; +package com.andview.example.activity.recyclerview; import android.app.Activity; import android.os.Bundle; import android.os.Handler; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.Menu; import android.view.MenuItem; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; + import com.andview.example.R; import com.andview.example.recylerview.Person; import com.andview.example.recylerview.SimpleAdapter; @@ -40,23 +41,23 @@ protected void onCreate(Bundle savedInstanceState) { initData(); adapter = new SimpleAdapter(personList,this); // 设置静默加载模式 -// xRefreshView.setSilenceLoadMore(); +// xRefreshView1.setSilenceLoadMore(); layoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL); recyclerView.setLayoutManager(layoutManager); // 静默加载模式不能设置footerview recyclerView.setAdapter(adapter); -// xRefreshView.setAutoLoadMore(true); +// xRefreshView1.setAutoLoadMore(true); xRefreshView.setPinnedTime(1000); xRefreshView.setMoveForHorizontal(true); adapter.setCustomLoadMoreView(new XRefreshViewFooter(this)); -// xRefreshView.setPullLoadEnable(false); +// xRefreshView1.setPullLoadEnable(false); //设置静默加载时提前加载的item个数 -// xRefreshView.setPreLoadCount(2); +// xRefreshView1.setPreLoadCount(2); xRefreshView.setXRefreshViewListener(new SimpleXRefreshListener() { @Override - public void onRefresh() { + public void onRefresh(boolean isPullDown) { new Handler().postDelayed(new Runnable() { @Override public void run() { @@ -66,7 +67,7 @@ public void run() { } @Override - public void onLoadMore(boolean isSlience) { + public void onLoadMore(boolean isSilence) { new Handler().postDelayed(new Runnable() { public void run() { for (int i = 0; i < 6; i++) { @@ -85,7 +86,7 @@ public void run() { } }); // // 实现Recyclerview的滚动监听,在这里可以自己处理到达底部加载更多的操作,可以不实现onLoadMore方法,更加自由 -// xRefreshView.setOnRecyclerViewScrollListener(new OnScrollListener() { +// xRefreshView1.setOnRecyclerViewScrollListener(new OnScrollListener() { // @Override // public void onScrolled(RecyclerView recyclerView, int dx, int dy) { // super.onScrolled(recyclerView, dx, dy); @@ -95,7 +96,7 @@ public void run() { // public void onScrollStateChanged(RecyclerView recyclerView, // int newState) { // if (newState == RecyclerView.SCROLL_STATE_IDLE) { -// isBottom = adapter.getItemCount() - 1 == lastVisibleItem; +// isBottom = recyclerviewAdapter.getItemCount() - 1 == lastVisibleItem; // } // } // }); diff --git a/app/src/main/java/com/andview/example/activity/recyclerview/WithoutBaseAdapterRecyclerViewActivity.java b/app/src/main/java/com/andview/example/activity/recyclerview/WithoutBaseAdapterRecyclerViewActivity.java new file mode 100644 index 0000000..b1673f7 --- /dev/null +++ b/app/src/main/java/com/andview/example/activity/recyclerview/WithoutBaseAdapterRecyclerViewActivity.java @@ -0,0 +1,169 @@ +package com.andview.example.activity.recyclerview; + +import android.app.Activity; +import android.os.Bundle; +import android.os.Handler; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import android.view.Menu; +import android.view.MenuItem; + +import com.andview.example.R; +import com.andview.example.recylerview.Person; +import com.andview.example.recylerview.NormalRecyclerAdapter; +import com.andview.refreshview.XRefreshView; +import com.andview.refreshview.XRefreshView.SimpleXRefreshListener; +import com.andview.refreshview.utils.LogUtils; + +import java.util.ArrayList; +import java.util.List; + +public class WithoutBaseAdapterRecyclerViewActivity extends Activity { + RecyclerView recyclerView; + NormalRecyclerAdapter adapter; + List personList = new ArrayList(); + XRefreshView xRefreshView; + int lastVisibleItem = 0; + // GridLayoutManager layoutManager; + LinearLayoutManager layoutManager; + private boolean isBottom = false; + private int mLoadCount = 0; + + + private boolean isList = true;//false 为grid布局 + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_recylerview2); + xRefreshView = (XRefreshView) findViewById(R.id.xrefreshview); + recyclerView = (RecyclerView) findViewById(R.id.recycler_view_test_rv); + recyclerView.setHasFixedSize(true); + + initData(); + adapter = new NormalRecyclerAdapter(personList, this); + // 设置静默加载模式 +// xRefreshView1.setSilenceLoadMore(); + layoutManager = new LinearLayoutManager(this); + recyclerView.setLayoutManager(layoutManager); + // 静默加载模式不能设置footerview + recyclerView.setAdapter(adapter); + //设置刷新完成以后,headerview固定的时间 + xRefreshView.setPinnedTime(1000); + xRefreshView.setMoveForHorizontal(true); + xRefreshView.setPullLoadEnable(true); + xRefreshView.setAutoLoadMore(false); +// adapter.setCustomLoadMoreView(new XRefreshViewFooter(this)); + xRefreshView.enableReleaseToLoadMore(true); + xRefreshView.enableRecyclerViewPullUp(true); + xRefreshView.enablePullUpWhenLoadCompleted(true); + //设置静默加载时提前加载的item个数 +// xRefreshView1.setPreLoadCount(4); + //设置Recyclerview的滑动监听 + xRefreshView.setOnRecyclerViewScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + LogUtils.e("onScrollStateChanged"); + } + + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + LogUtils.e("onScrolled"); + } + }); + + xRefreshView.setXRefreshViewListener(new SimpleXRefreshListener() { + + @Override + public void onRefresh(boolean isPullDown) { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + xRefreshView.stopRefresh(); + } + }, 500); + } + + @Override + public void onLoadMore(boolean isSilence) { + new Handler().postDelayed(new Runnable() { + public void run() { +// for (int i = 0; i < 6; i++) { +// recyclerviewAdapter.insert(new Person("More ", mLoadCount + "21"), +// recyclerviewAdapter.getAdapterItemCount()); +// } + mLoadCount++; + if (mLoadCount >= 3) {//模拟没有更多数据的情况 + xRefreshView.setLoadComplete(true); + } else { + // 刷新完成必须调用此方法停止加载 + xRefreshView.stopLoadMore(false); + //当数据加载失败 不需要隐藏footerview时,可以调用以下方法,传入false,不传默认为true + // 同时在Footerview的onStateFinish(boolean hideFooter),可以在hideFooter为false时,显示数据加载失败的ui +// xRefreshView1.stopLoadMore(false); + } + } + }, 1000); + } + }); +// // 实现Recyclerview的滚动监听,在这里可以自己处理到达底部加载更多的操作,可以不实现onLoadMore方法,更加自由 +// xRefreshView1.setOnRecyclerViewScrollListener(new OnScrollListener() { +// @Override +// public void onScrolled(RecyclerView recyclerView, int dx, int dy) { +// super.onScrolled(recyclerView, dx, dy); +// lastVisibleItem = layoutManager.findLastVisibleItemPosition(); +// } +// +// public void onScrollStateChanged(RecyclerView recyclerView, +// int newState) { +// if (newState == RecyclerView.SCROLL_STATE_IDLE) { +// isBottom = recyclerviewAdapter.getItemCount() - 1 == lastVisibleItem; +// } +// } +// }); + } + + private void initData() { + for (int i = 0; i < 30; i++) { + Person person = new Person("name" + i, "" + i); + personList.add(person); + } + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // 加载菜单 + getMenuInflater().inflate(R.menu.main, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int menuId = item.getItemId(); + switch (menuId) { + case R.id.menu_clear: + mLoadCount = 0; + xRefreshView.setLoadComplete(false); + //切换布局 + isList = !isList; + + if (isList) { + LinearLayoutManager layoutManager = new LinearLayoutManager(getApplicationContext()); + layoutManager.setOrientation(LinearLayoutManager.VERTICAL); + recyclerView.setLayoutManager(layoutManager); + } else { + recyclerView.setLayoutManager(new GridLayoutManager(getApplicationContext(), 2)); + } + //当切换layoutManager时,需调用此方法,如果Recyclerview的adapter没有集成BaseRecyclerAdapter,则不用加这行代码 +// xRefreshView.notifyLayoutManagerChanged(); + break; + case R.id.menu_refresh: + xRefreshView.startRefresh(); + break; + } + return super.onOptionsItemSelected(item); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/andview/example/recylerview/MultiItemAdapter.java b/app/src/main/java/com/andview/example/recylerview/MultiItemAdapter.java index e9b2c5d..a78d626 100644 --- a/app/src/main/java/com/andview/example/recylerview/MultiItemAdapter.java +++ b/app/src/main/java/com/andview/example/recylerview/MultiItemAdapter.java @@ -1,6 +1,6 @@ package com.andview.example.recylerview; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -21,7 +21,12 @@ public MultiItemAdapter(List list) { @Override public void onBindViewHolder(SimpleAdapterViewHolder holder, int position, boolean isItem) { Person person = list.get(position); - holder.nameTv.setText(person.getName()); + int type = getAdapterItemViewType(position); + if (type == 0) { + holder.tvLeft.setText(person.getName()); + } else { + holder.tvRight.setText(person.getName()); + } } @Override @@ -62,7 +67,7 @@ public SimpleAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType public class SimpleAdapterViewHolder extends RecyclerView.ViewHolder { - public TextView nameTv; + public TextView tvRight, tvLeft; public SimpleAdapterViewHolder(View itemView, boolean isItem) { super(itemView); @@ -78,10 +83,10 @@ private void init(View itemView, int viewType, boolean isItem) { if (isItem) { switch (viewType) { case 0: - nameTv = (TextView) itemView.findViewById(R.id.tv_multi_left); + tvLeft = (TextView) itemView.findViewById(R.id.tv_multi_left); break; default: - nameTv = (TextView) itemView.findViewById(R.id.tv_multi_right); + tvRight = (TextView) itemView.findViewById(R.id.tv_multi_right); break; } } diff --git a/app/src/main/java/com/andview/example/recylerview/NormalRecyclerAdapter.java b/app/src/main/java/com/andview/example/recylerview/NormalRecyclerAdapter.java new file mode 100644 index 0000000..4ce99da --- /dev/null +++ b/app/src/main/java/com/andview/example/recylerview/NormalRecyclerAdapter.java @@ -0,0 +1,88 @@ +package com.andview.example.recylerview; + +import android.content.Context; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.andview.example.DensityUtil; +import com.andview.example.R; + +import java.util.List; + +public class NormalRecyclerAdapter extends RecyclerView.Adapter { + private List list; + private int largeCardHeight, smallCardHeight; + + public NormalRecyclerAdapter(List list, Context context) { + this.list = list; + largeCardHeight = DensityUtil.dip2px(context, 150); + smallCardHeight = DensityUtil.dip2px(context, 100); + } + + @Override + public void onBindViewHolder(SimpleAdapterViewHolder holder, int position) { + Person person = list.get(position); + holder.nameTv.setText(person.getName()); + holder.ageTv.setText(person.getAge()); + ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams(); + if (layoutParams instanceof StaggeredGridLayoutManager.LayoutParams) { + holder.rootView.getLayoutParams().height = position % 2 != 0 ? largeCardHeight : smallCardHeight; + } + } + + @Override + public int getItemCount() { + return list.size(); + } + + public void setData(List list) { + this.list = list; + notifyDataSetChanged(); + } + + @Override + public SimpleAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View v = LayoutInflater.from(parent.getContext()).inflate( + R.layout.item_recylerview, parent, false); + SimpleAdapterViewHolder vh = new SimpleAdapterViewHolder(v, true); + return vh; + } + + public void insert(Person person, int position) { + list.add(position, person); + notifyItemInserted(position); + } + + public class SimpleAdapterViewHolder extends RecyclerView.ViewHolder { + + public View rootView; + public TextView nameTv; + public TextView ageTv; + public int position; + + public SimpleAdapterViewHolder(View itemView, boolean isItem) { + super(itemView); + if (isItem) { + nameTv = (TextView) itemView + .findViewById(R.id.recycler_view_test_item_person_name_tv); + ageTv = (TextView) itemView + .findViewById(R.id.recycler_view_test_item_person_age_tv); + rootView = itemView + .findViewById(R.id.card_view); + } + + } + } + + public Person getItem(int position) { + if (position < list.size()) + return list.get(position); + else + return null; + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/andview/example/recylerview/SimpleAdapter.java b/app/src/main/java/com/andview/example/recylerview/SimpleAdapter.java index a4138de..66e2a9b 100644 --- a/app/src/main/java/com/andview/example/recylerview/SimpleAdapter.java +++ b/app/src/main/java/com/andview/example/recylerview/SimpleAdapter.java @@ -1,13 +1,14 @@ package com.andview.example.recylerview; import android.content.Context; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; + import com.andview.example.DensityUtil; import com.andview.example.R; import com.andview.refreshview.recyclerview.BaseRecyclerAdapter; diff --git a/app/src/main/java/com/andview/example/ui/AdHeader.java b/app/src/main/java/com/andview/example/ui/AdHeader.java index fab1318..0dea346 100644 --- a/app/src/main/java/com/andview/example/ui/AdHeader.java +++ b/app/src/main/java/com/andview/example/ui/AdHeader.java @@ -67,7 +67,7 @@ private void initView(Context context) { mRotateDownAnim = new RotateAnimation(-180.0f, 0.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); - mRotateDownAnim.setDuration(ROTATE_ANIM_DURATION); + mRotateDownAnim.setDuration(0); mRotateDownAnim.setFillAfter(true); } @@ -139,7 +139,7 @@ public void onStateRefreshing() { } @Override - public void onStateFinish() { + public void onStateFinish(boolean success) { mArrowImageView.setVisibility(View.GONE); mOkImageView.setVisibility(View.VISIBLE); mProgressBar.setVisibility(View.GONE); diff --git a/app/src/main/java/com/andview/example/ui/BannerViewPager.java b/app/src/main/java/com/andview/example/ui/BannerViewPager.java index 0eb9350..c4edec2 100644 --- a/app/src/main/java/com/andview/example/ui/BannerViewPager.java +++ b/app/src/main/java/com/andview/example/ui/BannerViewPager.java @@ -1,11 +1,12 @@ package com.andview.example.ui; import android.content.Context; -import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.ViewGroup; +import androidx.viewpager.widget.ViewPager; + /** * Created by huxq17 on 2016/2/1. */ diff --git a/app/src/main/java/com/andview/example/ui/CustomFooterView.java b/app/src/main/java/com/andview/example/ui/CustomFooterView.java new file mode 100644 index 0000000..20736fd --- /dev/null +++ b/app/src/main/java/com/andview/example/ui/CustomFooterView.java @@ -0,0 +1,136 @@ +package com.andview.example.ui; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.recyclerview.widget.RecyclerView; + +import com.andview.refreshview.XRefreshView; +import com.andview.refreshview.callback.IFooterCallBack; +import com.andview.refreshview.utils.Utils; + +public class CustomFooterView extends LinearLayout implements IFooterCallBack { + private Context mContext; + + private View mContentView; + private View mProgressBar; + private TextView mHintView; + private TextView mClickView; + private boolean showing = true; + + public CustomFooterView(Context context) { + super(context); + initView(context); + } + + public CustomFooterView(Context context, AttributeSet attrs) { + super(context, attrs); + initView(context); + } + + @Override + public void callWhenNotAutoLoadMore(final XRefreshView xRefreshView) { + View childView = xRefreshView.getChildAt(1); + if (childView != null && childView instanceof RecyclerView) { + show(Utils.isRecyclerViewFullscreen((RecyclerView) childView)); + xRefreshView.enableReleaseToLoadMore(Utils.isRecyclerViewFullscreen((RecyclerView) childView)); + } + mClickView.setText(com.andview.refreshview.R.string.xrefreshview_footer_hint_click); + mClickView.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View v) { + xRefreshView.notifyLoadMore(); + } + }); + } + + @Override + public void onStateReady() { + mHintView.setVisibility(View.GONE); + mProgressBar.setVisibility(View.GONE); + mClickView.setText(com.andview.refreshview.R.string.xrefreshview_footer_hint_click); + mClickView.setVisibility(View.VISIBLE); +// show(true); + } + + @Override + public void onStateRefreshing() { + mHintView.setVisibility(View.GONE); + mProgressBar.setVisibility(View.VISIBLE); + mClickView.setVisibility(View.GONE); + show(true); + } + + @Override + public void onReleaseToLoadMore() { + mHintView.setVisibility(View.GONE); + mProgressBar.setVisibility(View.GONE); + mClickView.setText(com.andview.refreshview.R.string.xrefreshview_footer_hint_release); + mClickView.setVisibility(View.VISIBLE); + } + + @Override + public void onStateFinish(boolean hideFooter) { + if (hideFooter) { + mHintView.setText(com.andview.refreshview.R.string.xrefreshview_footer_hint_normal); + } else { + //处理数据加载失败时ui显示的逻辑,也可以不处理,看自己的需求 + mHintView.setText(com.andview.refreshview.R.string.xrefreshview_footer_hint_fail); + } + mHintView.setVisibility(View.VISIBLE); + mProgressBar.setVisibility(View.GONE); + mClickView.setVisibility(View.GONE); + } + + @Override + public void onStateComplete() { + mHintView.setText(com.andview.refreshview.R.string.xrefreshview_footer_hint_complete); + mHintView.setVisibility(View.VISIBLE); + mProgressBar.setVisibility(View.GONE); + mClickView.setVisibility(View.GONE); + } + + @Override + public void show(final boolean show) { + if (show == showing) { + return; + } + showing = show; + LayoutParams lp = (LayoutParams) mContentView + .getLayoutParams(); + lp.height = show ? LayoutParams.WRAP_CONTENT : 0; + mContentView.setLayoutParams(lp); +// setVisibility(show?VISIBLE:GONE); + + } + + @Override + public boolean isShowing() { + return showing; + } + + private void initView(Context context) { + mContext = context; + ViewGroup moreView = (ViewGroup) LayoutInflater.from(mContext).inflate(com.andview.refreshview.R.layout.xrefreshview_footer, this); + moreView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); + + mContentView = moreView.findViewById(com.andview.refreshview.R.id.xrefreshview_footer_content); + mProgressBar = moreView + .findViewById(com.andview.refreshview.R.id.xrefreshview_footer_progressbar); + mHintView = (TextView) moreView + .findViewById(com.andview.refreshview.R.id.xrefreshview_footer_hint_textview); + mClickView = (TextView) moreView + .findViewById(com.andview.refreshview.R.id.xrefreshview_footer_click_textview); + } + + @Override + public int getFooterHeight() { + return getMeasuredHeight(); + } +} diff --git a/app/src/main/java/com/andview/example/ui/CustomGifHeader.java b/app/src/main/java/com/andview/example/ui/CustomGifHeader.java index 80b4591..e33e1b6 100644 --- a/app/src/main/java/com/andview/example/ui/CustomGifHeader.java +++ b/app/src/main/java/com/andview/example/ui/CustomGifHeader.java @@ -44,9 +44,6 @@ private void initView(Context context) { public void setRefreshTime(long lastRefreshTime) { } - /** - * hide footer when disable pull load more - */ public void hide() { setVisibility(View.GONE); } @@ -79,15 +76,15 @@ public void onStateRefreshing() { } @Override - public void onStateFinish() { - mHintTextView.setText(R.string.xrefreshview_header_hint_loaded); + public void onStateFinish(boolean success) { + mHintTextView.setText(success ? R.string.xrefreshview_header_hint_loaded : R.string.xrefreshview_header_hint_loaded_fail); // gifView1.setVisibility(View.VISIBLE); gifView2.setVisibility(View.GONE); gifView2.setPaused(true); } @Override - public void onHeaderMove(double offset, int offsetY, int deltaY) { + public void onHeaderMove(double headerMovePercent, int offsetY, int deltaY) { // } diff --git a/app/src/main/java/com/andview/example/ui/CustomHeader.java b/app/src/main/java/com/andview/example/ui/CustomHeader.java index 2282f5e..cc2157a 100644 --- a/app/src/main/java/com/andview/example/ui/CustomHeader.java +++ b/app/src/main/java/com/andview/example/ui/CustomHeader.java @@ -19,10 +19,12 @@ public class CustomHeader extends View implements IHeaderCallBack { , 0xFF00FFFF, 0xFFFF0000, 0xFF8B00FF, 0xFFFFFF00}; // Default background for the progress spinner private static final int CIRCLE_BG_LIGHT = 0xFFFAFAFA; + private int mPinnedTime; - public CustomHeader(Context context) { + public CustomHeader(Context context, int pinnedTime) { super(context); initView(); + this.mPinnedTime = pinnedTime; } public CustomHeader(Context context, AttributeSet attrs) { @@ -92,8 +94,8 @@ protected void onDraw(Canvas canvas) { @Override public void onStateNormal() { mScale = 1f; - mDrawable.stop(); - + isStop = false; +// mDrawable.stop(); } @Override @@ -109,27 +111,32 @@ public void onStateRefreshing() { } @Override - public void onStateFinish() { - isStop = true; - mDrawable.stop(); + public void onStateFinish(boolean success) { + postDelayed(new Runnable() { + @Override + public void run() { + isStop = true; + mDrawable.stop(); + } + }, mPinnedTime); } private boolean isStop = false; @Override - public void onHeaderMove(double offset, int offsetY, int deltaY) { + public void onHeaderMove(double headerMovePercent, int offsetY, int deltaY) { if (isStop) { return; } - mDrawable.setAlpha((int) (255 * offset)); + mDrawable.setAlpha((int) (255 * headerMovePercent)); mDrawable.showArrow(true); - float strokeStart = (float) ((offset) * .8f); + float strokeStart = (float) ((headerMovePercent) * .8f); mDrawable.setStartEndTrim(0f, Math.min(0.8f, strokeStart)); - mDrawable.setArrowScale((float) Math.min(1f, offset)); + mDrawable.setArrowScale((float) Math.min(1f, headerMovePercent)); // magic - float rotation = (float) ((-0.25f + .4f * offset + offset * 2) * .5f); + float rotation = (float) ((-0.25f + .4f * headerMovePercent + headerMovePercent * 2) * .5f); mDrawable.setProgressRotation(rotation); invalidate(); @@ -143,7 +150,6 @@ public void setRefreshTime(long lastRefreshTime) { @Override public void hide() { setVisibility(View.GONE); - } @Override diff --git a/app/src/main/java/com/andview/example/ui/GifView.java b/app/src/main/java/com/andview/example/ui/GifView.java index 6a837a8..8d2473b 100644 --- a/app/src/main/java/com/andview/example/ui/GifView.java +++ b/app/src/main/java/com/andview/example/ui/GifView.java @@ -172,7 +172,8 @@ private void updateAnimationTime() { private void drawMovieFrame(Canvas canvas) { // 设置要显示的帧,绘制即可 mMovie.setTime(mCurrentAnimationTime); - canvas.save(Canvas.MATRIX_SAVE_FLAG); + canvas.save(); +// canvas.saveLayer(0, 0, getWidth(), getHeight(), null); canvas.scale(mScale, mScale); mMovie.draw(canvas, mLeft / mScale, mTop / mScale); canvas.restore(); diff --git a/app/src/main/java/com/andview/example/ui/MaterialProgressDrawable.java b/app/src/main/java/com/andview/example/ui/MaterialProgressDrawable.java index dd7ddf2..5504fe1 100644 --- a/app/src/main/java/com/andview/example/ui/MaterialProgressDrawable.java +++ b/app/src/main/java/com/andview/example/ui/MaterialProgressDrawable.java @@ -48,7 +48,7 @@ /** * Fancy progress indicator for Material theme. It's taken from - * {@link android.support.v4.widget}. I've done some slight changes. + * {@link androidx.core.widget}. I've done some slight changes. * */ public class MaterialProgressDrawable extends Drawable implements Animatable { diff --git a/app/src/main/java/com/andview/example/ui/NoMoreDataFooterView.java b/app/src/main/java/com/andview/example/ui/NoMoreDataFooterView.java new file mode 100644 index 0000000..43a30de --- /dev/null +++ b/app/src/main/java/com/andview/example/ui/NoMoreDataFooterView.java @@ -0,0 +1,136 @@ +package com.andview.example.ui; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.recyclerview.widget.RecyclerView; + +import com.andview.refreshview.XRefreshView; +import com.andview.refreshview.callback.IFooterCallBack; +import com.andview.refreshview.utils.Utils; + +public class NoMoreDataFooterView extends LinearLayout implements IFooterCallBack { + private Context mContext; + + private View mContentView; + private View mProgressBar; + private TextView mHintView; + private TextView mClickView; + private boolean showing = true; + + public NoMoreDataFooterView(Context context) { + super(context); + initView(context); + } + + public NoMoreDataFooterView(Context context, AttributeSet attrs) { + super(context, attrs); + initView(context); + } + + @Override + public void callWhenNotAutoLoadMore(final XRefreshView xRefreshView) { + View childView = xRefreshView.getChildAt(1); + if (childView != null && childView instanceof RecyclerView) { + show(Utils.isRecyclerViewFullscreen((RecyclerView) childView)); + xRefreshView.enableReleaseToLoadMore(Utils.isRecyclerViewFullscreen((RecyclerView) childView)); + } + mClickView.setText(com.andview.refreshview.R.string.xrefreshview_footer_hint_click); + mClickView.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View v) { + xRefreshView.notifyLoadMore(); + } + }); + } + + @Override + public void onStateReady() { + mHintView.setVisibility(View.GONE); + mProgressBar.setVisibility(View.GONE); + mClickView.setText(com.andview.refreshview.R.string.xrefreshview_footer_hint_click); + mClickView.setVisibility(View.VISIBLE); +// show(true); + } + + @Override + public void onStateRefreshing() { + mHintView.setVisibility(View.GONE); + mProgressBar.setVisibility(View.VISIBLE); + mClickView.setVisibility(View.GONE); + show(true); + } + + @Override + public void onReleaseToLoadMore() { + mHintView.setVisibility(View.GONE); + mProgressBar.setVisibility(View.GONE); + mClickView.setText(com.andview.refreshview.R.string.xrefreshview_footer_hint_release); + mClickView.setVisibility(View.VISIBLE); + } + + @Override + public void onStateFinish(boolean hideFooter) { + if (hideFooter) { + mHintView.setText(com.andview.refreshview.R.string.xrefreshview_footer_hint_normal); + } else { + //处理数据加载失败时ui显示的逻辑,也可以不处理,看自己的需求 + mHintView.setText("没有更多数据"); + } + mHintView.setVisibility(View.VISIBLE); + mProgressBar.setVisibility(View.GONE); + mClickView.setVisibility(View.GONE); + } + + @Override + public void onStateComplete() { + mHintView.setText(com.andview.refreshview.R.string.xrefreshview_footer_hint_complete); + mHintView.setVisibility(View.VISIBLE); + mProgressBar.setVisibility(View.GONE); + mClickView.setVisibility(View.GONE); + } + + @Override + public void show(final boolean show) { + if (show == showing) { + return; + } + showing = show; + LayoutParams lp = (LayoutParams) mContentView + .getLayoutParams(); + lp.height = show ? LayoutParams.WRAP_CONTENT : 0; + mContentView.setLayoutParams(lp); +// setVisibility(show?VISIBLE:GONE); + + } + + @Override + public boolean isShowing() { + return showing; + } + + private void initView(Context context) { + mContext = context; + ViewGroup moreView = (ViewGroup) LayoutInflater.from(mContext).inflate(com.andview.refreshview.R.layout.xrefreshview_footer, this); + moreView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); + + mContentView = moreView.findViewById(com.andview.refreshview.R.id.xrefreshview_footer_content); + mProgressBar = moreView + .findViewById(com.andview.refreshview.R.id.xrefreshview_footer_progressbar); + mHintView = (TextView) moreView + .findViewById(com.andview.refreshview.R.id.xrefreshview_footer_hint_textview); + mClickView = (TextView) moreView + .findViewById(com.andview.refreshview.R.id.xrefreshview_footer_click_textview); + } + + @Override + public int getFooterHeight() { + return getMeasuredHeight(); + } +} diff --git a/app/src/main/java/com/andview/example/ui/raindrop/CustomerFooter.java b/app/src/main/java/com/andview/example/ui/raindrop/CustomerFooter.java index 1f85f09..66f6712 100644 --- a/app/src/main/java/com/andview/example/ui/raindrop/CustomerFooter.java +++ b/app/src/main/java/com/andview/example/ui/raindrop/CustomerFooter.java @@ -1,7 +1,6 @@ package com.andview.example.ui.raindrop; import android.content.Context; -import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -9,6 +8,8 @@ import android.widget.LinearLayout; import android.widget.TextView; +import androidx.recyclerview.widget.RecyclerView; + import com.andview.refreshview.XRefreshView; import com.andview.refreshview.callback.IFooterCallBack; import com.andview.refreshview.utils.Utils; diff --git a/app/src/main/java/com/andview/example/ui/raindrop/RainDropHeader.java b/app/src/main/java/com/andview/example/ui/raindrop/RainDropHeader.java index 3e5bf52..963effe 100644 --- a/app/src/main/java/com/andview/example/ui/raindrop/RainDropHeader.java +++ b/app/src/main/java/com/andview/example/ui/raindrop/RainDropHeader.java @@ -77,7 +77,7 @@ public void onStateRefreshing() { } @Override - public void onStateFinish() { + public void onStateFinish(boolean success) { } public int getVisiableHeight() { diff --git a/app/src/main/java/com/andview/example/ui/smileyloadingview/SmileyHeaderView.java b/app/src/main/java/com/andview/example/ui/smileyloadingview/SmileyHeaderView.java new file mode 100644 index 0000000..ca613d9 --- /dev/null +++ b/app/src/main/java/com/andview/example/ui/smileyloadingview/SmileyHeaderView.java @@ -0,0 +1,140 @@ +package com.andview.example.ui.smileyloadingview; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.view.animation.LinearInterpolator; +import android.widget.LinearLayout; +import android.widget.Scroller; + +import com.andview.example.R; +import com.andview.refreshview.callback.IHeaderCallBack; + +/** + * Created by 2144 on 2016/8/26. + */ +public class SmileyHeaderView extends LinearLayout implements IHeaderCallBack { + public SmileyHeaderView(Context context) { + this(context, null); + } + + public SmileyHeaderView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public SmileyHeaderView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context); + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public SmileyHeaderView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + init(context); + } + + private SmileyLoadingView loadingView; + private Scroller mScroller; + + private void init(Context context) { + View contentView = LayoutInflater.from(context).inflate(R.layout.smiley_headerview, this); + loadingView = (SmileyLoadingView) contentView.findViewById(R.id.loading_view); + mScroller = new Scroller(getContext(), new LinearInterpolator()); + } + + @Override + public void onStateNormal() { + finished = false; + } + + @Override + public void onStateReady() { + } + + @Override + public void onStateRefreshing() { + refreshing = true; + start(); + } + + @Override + public void onStateFinish(boolean success) { + refreshing = false; + finished = true; + mScroller.forceFinished(true); + removeCallbacks(mRunnable); + loadingView.smile(360 + 180); + hasHeaderMove = false; + } + + private void start() { + if (!refreshing) { + return; + } + loadingView.mRunning = true; + if (!hasHeaderMove) { + mAngle = 90; + } + int duration = (int) ((720.0f + 2 * 90 - mAngle) * 2000 / (720.0f + 90)); + mScroller.startScroll(mAngle, 0, (int) (720.0f + 2 * 90 - mAngle), 0, duration); + post(mRunnable); + } + + + private boolean hasHeaderMove = false; + + private AnimalRunnable mRunnable = new AnimalRunnable(); + + public class AnimalRunnable implements Runnable { + + @Override + public void run() { + int curX = mScroller.getCurrX(); + if (curX != 0) + loadingView.smile(curX); + if (mScroller.computeScrollOffset()) { + post(this); + } else { + mAngle = 90; + loadingView.mRunning = false; + start(); + } + } + } + + private boolean finished = false; + private boolean refreshing = false; + + private int mAngle; + + @Override + public void onHeaderMove(double headerMovePercent, int offsetY, int deltaY) { + if (finished || refreshing) return; + hasHeaderMove = true; + if (headerMovePercent <= 1) { + mAngle = (int) ((360 + 180 - 90) * headerMovePercent + 90); + loadingView.smile(mAngle); + } + } + + @Override + public void setRefreshTime(long lastRefreshTime) { + + } + + public void hide() { + setVisibility(View.GONE); + } + + public void show() { + setVisibility(View.VISIBLE); + } + + @Override + public int getHeaderHeight() { + return getMeasuredHeight(); + } +} diff --git a/app/src/main/java/com/andview/example/ui/smileyloadingview/SmileyLoadingView.java b/app/src/main/java/com/andview/example/ui/smileyloadingview/SmileyLoadingView.java new file mode 100644 index 0000000..be257fa --- /dev/null +++ b/app/src/main/java/com/andview/example/ui/smileyloadingview/SmileyLoadingView.java @@ -0,0 +1,471 @@ +/** + * Copyright 2016 andy + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.andview.example.ui.smileyloadingview; + +import android.animation.Animator; +import android.animation.ValueAnimator; +import android.annotation.TargetApi; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PathMeasure; +import android.graphics.RectF; +import android.os.Build; +import android.util.AttributeSet; +import android.view.View; +import android.view.animation.LinearInterpolator; + +import com.andview.example.R; + +/** + * Create by andy (https://github.com/andyxialm) + * Create time: 16/8/18 10:17 + * + * Modify by huxq17 (https://github.com/huxq17) at 16/8/29 17:30 + * + * Description : SmileyLoadingView + */ +public class SmileyLoadingView extends View { + + private static final int DEFAULT_WIDHT = 30; + private static final int DEFAULT_HEIGHT = 30; + private static final int DEFAULT_PAINT_WIDTH = 5; + + private static final int DEFAULT_ANIM_DURATION = 2000; + private static final int DEFAULT_PAINT_COLOR = Color.parseColor("#b3d8f3"); + private static final int ROTATE_OFFSET = 90; + + private Paint mArcPaint, mCirclePaint; + private Path mCirclePath, mArcPath; + private RectF mRectF; + + private float[] mCenterPos, mLeftEyePos, mRightEyePos; + private float mStartAngle, mSweepAngle; + private float mEyeCircleRadius; + + private int mStrokeColor; + private int mAnimDuration; + private int mAnimRepeatCount; + + private int mStrokeWidth; + public boolean mRunning; + private boolean mStopping; + + private boolean mFirstStep; + private boolean mShowLeftEye, mShowRightEye; + private boolean mStopUntilAnimationPerformCompleted; + + private OnAnimPerformCompletedListener mOnAnimPerformCompletedListener; + private ValueAnimator mValueAnimator; + + public SmileyLoadingView(Context context) { + this(context, null); + } + + public SmileyLoadingView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public SmileyLoadingView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(attrs); + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public SmileyLoadingView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + init(attrs); + } + + private void init(AttributeSet attrs) { + + // get attrs + TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.SmileyLoadingView); + mStrokeColor = ta.getColor(R.styleable.SmileyLoadingView_strokeColor, DEFAULT_PAINT_COLOR); + mStrokeWidth = ta.getDimensionPixelSize(R.styleable.SmileyLoadingView_strokeWidth, dp2px(DEFAULT_PAINT_WIDTH)); + mAnimDuration = ta.getInt(R.styleable.SmileyLoadingView_duration, DEFAULT_ANIM_DURATION); + mAnimRepeatCount = ta.getInt(R.styleable.SmileyLoadingView_animRepeatCount, ValueAnimator.INFINITE); + ta.recycle(); + + mSweepAngle = 180; // init sweepAngle, the mouth line sweep angle + mCirclePath = new Path(); + mArcPath = new Path(); + + mArcPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mArcPaint.setStyle(Paint.Style.STROKE); + mArcPaint.setStrokeCap(Paint.Cap.ROUND); + mArcPaint.setStrokeJoin(Paint.Join.ROUND); + mArcPaint.setStrokeWidth(mStrokeWidth); + mArcPaint.setColor(mStrokeColor); + + mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mCirclePaint.setStyle(Paint.Style.STROKE); + mCirclePaint.setStrokeCap(Paint.Cap.ROUND); + mCirclePaint.setStrokeJoin(Paint.Join.ROUND); + mCirclePaint.setStyle(Paint.Style.FILL); + mCirclePaint.setColor(mStrokeColor); + + mCenterPos = new float[2]; + mLeftEyePos = new float[2]; + mRightEyePos = new float[2]; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + setMeasuredDimension(measureWidthSize(widthMeasureSpec), measureHeightSize(heightMeasureSpec)); + } + + @Override + protected void onDraw(Canvas canvas) { + if (mRunning) { + if (mShowLeftEye) { + canvas.drawCircle(mLeftEyePos[0], mLeftEyePos[1], mEyeCircleRadius, mCirclePaint); + } + + if (mShowRightEye) { + canvas.drawCircle(mRightEyePos[0], mRightEyePos[1], mEyeCircleRadius, mCirclePaint); + } + + if (mFirstStep) { + mArcPath.reset(); + mArcPath.addArc(mRectF, mStartAngle, mSweepAngle); + canvas.drawPath(mArcPath, mArcPaint); + } else { + mArcPath.reset(); + mArcPath.addArc(mRectF, mStartAngle, mSweepAngle); + canvas.drawPath(mArcPath, mArcPaint); + } + } else { + canvas.drawCircle(mLeftEyePos[0], mLeftEyePos[1], mEyeCircleRadius, mCirclePaint); + canvas.drawCircle(mRightEyePos[0], mRightEyePos[1], mEyeCircleRadius, mCirclePaint); + + mArcPath.reset(); + mArcPath.addArc(mRectF, mStartAngle, mSweepAngle); + canvas.drawPath(mArcPath, mArcPaint); + } + } + + /** + * measure width + * + * @param measureSpec spec + * @return width + */ + private int measureWidthSize(int measureSpec) { + int defSize = dp2px(DEFAULT_WIDHT); + int specSize = MeasureSpec.getSize(measureSpec); + int specMode = MeasureSpec.getMode(measureSpec); + + int result = 0; + switch (specMode) { + case MeasureSpec.UNSPECIFIED: + case MeasureSpec.AT_MOST: + result = Math.min(defSize, specSize); + break; + case MeasureSpec.EXACTLY: + result = specSize; + break; + } + return result; + } + + /** + * measure height + * + * @param measureSpec spec + * @return height + */ + private int measureHeightSize(int measureSpec) { + int defSize = dp2px(DEFAULT_HEIGHT); + int specSize = MeasureSpec.getSize(measureSpec); + int specMode = MeasureSpec.getMode(measureSpec); + + int result = 0; + switch (specMode) { + case MeasureSpec.UNSPECIFIED: + case MeasureSpec.AT_MOST: + result = Math.min(defSize, specSize); + break; + case MeasureSpec.EXACTLY: + result = specSize; + break; + } + return result; + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + int paddingLeft = getPaddingLeft(); + int paddingRight = getPaddingRight(); + int paddingTop = getPaddingTop(); + int paddingBottom = getPaddingBottom(); + + int width = getWidth(); + int height = getHeight(); + mCenterPos[0] = (width - paddingRight + paddingLeft) >> 1; + mCenterPos[1] = (height - paddingBottom + paddingTop) >> 1; + + + float radiusX = (width - paddingRight - paddingLeft - mStrokeWidth) >> 1; + float radiusY = (height - paddingTop - paddingBottom - mStrokeWidth) >> 1; + float radius = Math.min(radiusX, radiusY); + mEyeCircleRadius = mStrokeWidth / 2; + + mRectF = new RectF(paddingLeft + mStrokeWidth, paddingTop + mStrokeWidth, + width - mStrokeWidth - paddingRight, height - mStrokeWidth - paddingBottom); + + mArcPath.arcTo(mRectF, 0, 180); + mCirclePath.addCircle(mCenterPos[0], mCenterPos[1], radius, Path.Direction.CW); + PathMeasure circlePathMeasure = new PathMeasure(mCirclePath, true); + + circlePathMeasure.getPosTan(circlePathMeasure.getLength() / 8 * 5, mLeftEyePos, null); + circlePathMeasure.getPosTan(circlePathMeasure.getLength() / 8 * 7, mRightEyePos, null); + mLeftEyePos[0] += mStrokeWidth >> 2; + mLeftEyePos[1] += mStrokeWidth >> 1; + mRightEyePos[0] -= mStrokeWidth >> 2; + mRightEyePos[1] += mStrokeWidth >> 1; + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + if (mValueAnimator != null && mValueAnimator.isRunning()) { + mValueAnimator.end(); + } + } + + /** + * Set paint color alpha + * + * @param alpha alpha + */ + public void setPaintAlpha(int alpha) { + mArcPaint.setAlpha(alpha); + mCirclePaint.setAlpha(alpha); + invalidate(); + } + + /** + * Set paint stroke color + * + * @param color color + */ + public void setStrokeColor(int color) { + mStrokeColor = color; + invalidate(); + } + + /** + * Set paint stroke width + * + * @param width px + */ + public void setStrokeWidth(int width) { + mStrokeWidth = width; + } + + /** + * Set animation running duration + * + * @param duration duration + */ + @SuppressWarnings("unused") + public void setAnimDuration(int duration) { + mAnimDuration = duration; + } + + /** + * Set animation repeat count, ValueAnimator.INFINITE(-1) means cycle + * + * @param repeatCount repeat count + */ + @SuppressWarnings("unused") + public void setAnimRepeatCount(int repeatCount) { + mAnimRepeatCount = repeatCount; + } + + public void start(int animRepeatCount) { + if (mRunning) { + return; + } + mAnimRepeatCount = animRepeatCount; + + mFirstStep = true; + + mValueAnimator = ValueAnimator.ofFloat(ROTATE_OFFSET, 720.0f + 2 * ROTATE_OFFSET); + mValueAnimator.setDuration(mAnimDuration); + mValueAnimator.setInterpolator(new LinearInterpolator()); + mValueAnimator.setRepeatCount(mAnimRepeatCount); + mValueAnimator.setRepeatMode(ValueAnimator.RESTART); + mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + if (!animation.isRunning()) { + return; + } + float animatedValue = (float) animation.getAnimatedValue(); + update(animatedValue); + } + }); + mValueAnimator.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { + mRunning = true; + } + + @Override + public void onAnimationEnd(Animator animation) { + mRunning = false; + mStopping = false; + if (mOnAnimPerformCompletedListener != null) { + mOnAnimPerformCompletedListener.onCompleted(); + } + reset(); + } + + @Override + public void onAnimationCancel(Animator animation) { + mRunning = false; + mStopping = false; + if (mOnAnimPerformCompletedListener != null) { + mOnAnimPerformCompletedListener.onCompleted(); + } + reset(); + } + + @Override + public void onAnimationRepeat(Animator animation) { + if (mStopUntilAnimationPerformCompleted) { + animation.cancel(); + mStopUntilAnimationPerformCompleted = false; + } + } + }); + mValueAnimator.start(); + } + + private void update(float angle) { + mFirstStep = angle / 360.0f <= 1; + if (mFirstStep) { + mShowLeftEye = angle % 360 > 225.0f; + mShowRightEye = angle % 360 > 315.0f; + + // set arc sweep angle when the step is first, set value: 0.1f similar to a circle + mSweepAngle = 0.1f; + mStartAngle = angle; + } else { + mShowLeftEye = (angle / 360.0f <= 2) && angle % 360 <= 225.0f; + mShowRightEye = (angle / 360.0f <= 2) && angle % 360 <= 315.0f; + if (angle >= (720.0f + ROTATE_OFFSET)) { + mStartAngle = angle - (720.0f + ROTATE_OFFSET); + mSweepAngle = ROTATE_OFFSET - mStartAngle; + } else { + mStartAngle = (angle / 360.0f <= 1.625) ? 0 : angle - mSweepAngle - 360; + mSweepAngle = (angle / 360.0f <= 1.625) ? angle % 360 : 225 - (angle - 225 - 360) / 5 * 3; + } + } + invalidate(); + } + + /** + * smile + * + * @param angle + */ + public void smile(float angle) { + update(angle); + } + + /** + * Start animation + */ + public void start() { + start(ValueAnimator.INFINITE); + } + + /** + * Stop animation + */ + public void stop() { + stop(true); + } + + /** + * stop it after animation perform completed + * + * @param stopUntilAnimationPerformCompleted boolean + */ + public void stop(boolean stopUntilAnimationPerformCompleted) { + if (mStopping || mValueAnimator == null || !mValueAnimator.isRunning()) { + return; + } + mStopping = stopUntilAnimationPerformCompleted; + + mStopUntilAnimationPerformCompleted = stopUntilAnimationPerformCompleted; + if (mValueAnimator != null && mValueAnimator.isRunning()) { + if (!stopUntilAnimationPerformCompleted) { + mValueAnimator.end(); + } + } else { + mStopping = false; + if (mOnAnimPerformCompletedListener != null) { + mOnAnimPerformCompletedListener.onCompleted(); + } + } + } + + /** + * set status changed listener + * + * @param l OnStatusChangedListener + */ + public void setOnAnimPerformCompletedListener(OnAnimPerformCompletedListener l) { + mOnAnimPerformCompletedListener = l; + } + + /** + * reset UI + */ + private void reset() { + mStartAngle = 0; + mSweepAngle = 180; + invalidate(); + } + + /** + * dp to px + * + * @param dpValue dp + * @return px + */ + private int dp2px(float dpValue) { + final float scale = getContext().getResources().getDisplayMetrics().density; + return (int) (dpValue * scale + 0.5f); + } + + /** + * Callback + */ + public interface OnAnimPerformCompletedListener { + void onCompleted(); + } +} diff --git a/app/src/main/java/com/andview/example/view/EatPluseView.java b/app/src/main/java/com/andview/example/view/EatPluseView.java new file mode 100644 index 0000000..b946539 --- /dev/null +++ b/app/src/main/java/com/andview/example/view/EatPluseView.java @@ -0,0 +1,120 @@ +package com.andview.example.view; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.RectF; +import android.os.Handler; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; + +/** + * Author: fanyafeng + * Date: 17/9/28 下午1:46 + * Email: fanyafeng@live.cn + */ +public class EatPluseView extends View { + + private static final String TAG = EatPluseView.class.getSimpleName(); + + private static int width = 0; + private static int height = 0; + + private final static int sunR = 120; + private Paint sunPaint; + private int sunX; + private int sunY; + private static RectF sunRectF; + + private int startAngle = 0; + private int swipeAngle = 360; + + private boolean isAdd = true; + + private int pluseR; + + public EatPluseView(Context context) { + super(context); + init(); + } + + public EatPluseView(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + public EatPluseView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(); + } + + private void init() { + sunPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + sunPaint.setAntiAlias(true); + sunPaint.setColor(Color.BLUE); + sunPaint.setStyle(Paint.Style.FILL); + sunPaint.setStrokeWidth(1); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (width == 0) { + width = getWidth(); + } + if (height == 0) { + height = getHeight(); + } + + if (sunX == 0) { + sunX = width / 2; + } + if (sunY == 0) { + sunY = height / 2; + } + Log.d(TAG, "宽度:" + width + "高度:" + height); + + Log.d(TAG, "sunX - sunR:" + (sunX - sunR) + " sunY - sunR:" + (sunY - sunR) + " sunX + sunR:" + (sunX + sunR) + " sunY - sunR:" + (sunY + sunR)); + if (sunRectF == null) { + sunRectF = new RectF(0, sunY - sunR, 2 * sunR, sunY + sunR); + + pluseR = sunR * 11 / 6 + sunR; + } + + canvas.drawArc(sunRectF, startAngle, swipeAngle, true, sunPaint); + + canvas.drawCircle(pluseR, sunY, sunR / 6, sunPaint); + if (pluseR <= sunR * 5 / 6) { + pluseR = sunR * 11 / 6 + sunR; + } else { + pluseR -= 4; + } + if (!isAdd) { + startAngle--; + swipeAngle += 2; + } else { + startAngle++; + swipeAngle -= 2; + } + + if (startAngle == 30) { + isAdd = false; + } + + if (startAngle == 0) { + isAdd = true; + } + + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + invalidate(); + } + }, 10); + + } + + +} diff --git a/app/src/main/java/com/andview/example/view/XRefreshViewCarHeader.java b/app/src/main/java/com/andview/example/view/XRefreshViewCarHeader.java new file mode 100644 index 0000000..c69de7e --- /dev/null +++ b/app/src/main/java/com/andview/example/view/XRefreshViewCarHeader.java @@ -0,0 +1,112 @@ +package com.andview.example.view; + +import android.content.Context; +import android.graphics.drawable.AnimationDrawable; +import android.os.Handler; +import android.util.AttributeSet; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.Animation; +import android.view.animation.ScaleAnimation; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.andview.example.DensityUtil; +import com.andview.example.R; +import com.andview.refreshview.callback.IHeaderCallBack; + +/** + * Author: fanyafeng + * Date: 18/10/1 下午5:17 + * Email: fanyafeng@live.cn + */ +public class XRefreshViewCarHeader extends LinearLayout implements IHeaderCallBack { + private ViewGroup mContent; + + private ImageView ivStatus; + private TextView tvStatus; + + private float startPoint = 0; + private float endPoint = 0; + + public XRefreshViewCarHeader(Context context) { + super(context); + initView(context); + } + + /** + * @param context + * @param attrs + */ + public XRefreshViewCarHeader(Context context, AttributeSet attrs) { + super(context, attrs); + initView(context); + } + + private void initView(Context context) { + mContent = (ViewGroup) LayoutInflater.from(context).inflate(R.layout.xrefreshview_car_header, this); + tvStatus = (TextView) mContent.findViewById(R.id.tvStatus); + ivStatus = (ImageView) mContent.findViewById(R.id.ivStatus); + } + + /** + * hide footer when disable pull load more + */ + public void hide() { + setVisibility(View.GONE); + } + + public void show() { + setVisibility(View.VISIBLE); + } + + @Override + public void onStateNormal() { + tvStatus.setText("下拉刷新查看状态"); + ivStatus.setImageResource(R.drawable.colors_refresh_icon); + } + + @Override + public void onStateReady() { + tvStatus.setText("松手后刷新"); + ivStatus.setImageResource(R.drawable.colors_refresh_icon); + } + + @Override + public void onStateRefreshing() { + tvStatus.setText("正在刷新"); + ivStatus.setImageResource(R.drawable.colors_refresh_loading); + ((AnimationDrawable) ivStatus.getDrawable()).start(); + } + + @Override + public void onStateFinish(boolean success) { + if (success) { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + tvStatus.setText("刷新完成"); + ivStatus.setImageResource(R.drawable.colors_refresh_icon); + } + }, 1000); + } + } + + @Override + public void onHeaderMove(double offset, int offsetY, int deltaY) { + Log.d("offsetY", "y轴滑动距离 offsetY:" + offsetY + "对应的距离73dp:" + DensityUtil.dip2px(getContext(), 73)); + } + + @Override + public void setRefreshTime(long lastRefreshTime) { + + } + + @Override + public int getHeaderHeight() { + return getMeasuredHeight(); + } +} diff --git a/app/src/main/java/com/andview/example/view/XRefreshViewJDHeader.java b/app/src/main/java/com/andview/example/view/XRefreshViewJDHeader.java new file mode 100644 index 0000000..ba64398 --- /dev/null +++ b/app/src/main/java/com/andview/example/view/XRefreshViewJDHeader.java @@ -0,0 +1,147 @@ +package com.andview.example.view; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.drawable.AnimationDrawable; +import android.os.Handler; +import android.util.AttributeSet; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.Animation; +import android.view.animation.RotateAnimation; +import android.view.animation.ScaleAnimation; +import android.widget.ImageView; +import android.widget.LinearLayout; + +import com.andview.example.DensityUtil; +import com.andview.example.R; +import com.andview.refreshview.callback.IHeaderCallBack; +import com.andview.refreshview.utils.Utils; + +import java.util.Calendar; + +public class XRefreshViewJDHeader extends LinearLayout implements IHeaderCallBack { + private ViewGroup mContent; + + private ImageView ivPerson; + private ImageView ivPackage; + + private float startPoint = 0; + private float endPoint = 0; + + public XRefreshViewJDHeader(Context context) { + super(context); + initView(context); + } + + /** + * @param context + * @param attrs + */ + public XRefreshViewJDHeader(Context context, AttributeSet attrs) { + super(context, attrs); + initView(context); + } + + private void initView(Context context) { + mContent = (ViewGroup) LayoutInflater.from(context).inflate(R.layout.xrefreshview_jd_header, this); + ivPackage = (ImageView) mContent.findViewById(R.id.ivPackage); + ivPerson = (ImageView) mContent.findViewById(R.id.ivPerson); + } + + /** + * hide footer when disable pull load more + */ + public void hide() { + setVisibility(View.GONE); + } + + public void show() { + setVisibility(View.VISIBLE); + } + + @Override + public void onStateNormal() { + ivPackage.setImageResource(R.drawable.jd_package); + ivPerson.setImageResource(R.drawable.jd_person); + } + + @Override + public void onStateReady() { + ivPackage.setImageResource(R.drawable.jd_package); + ivPerson.setImageResource(R.drawable.jd_person); + } + + @Override + public void onStateRefreshing() { + ivPackage.setImageDrawable(null); + ivPerson.setImageResource(R.drawable.jd_loading); + ((AnimationDrawable) ivPerson.getDrawable()).start(); + } + + @Override + public void onStateFinish(boolean success) { + if (success) { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + ivPackage.setImageResource(R.drawable.jd_package); + ivPerson.setImageResource(R.drawable.jd_person); + } + }, 1000); + } + } + + @Override + public void onHeaderMove(double offset, int offsetY, int deltaY) { + Log.d("offsetY", "y轴滑动距离 offsetY:" + offsetY + "对应的距离73dp:" + DensityUtil.dip2px(getContext(), 73)); + + startPoint = endPoint; + endPoint = (float) offsetY / (float) DensityUtil.dip2px(getContext(), 73); + + if (endPoint <= 1) { + + ScaleAnimation scaleAnimation = new ScaleAnimation(startPoint, endPoint, startPoint, endPoint, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); + scaleAnimation.setFillAfter(true); + ivPackage.startAnimation(scaleAnimation); + + ScaleAnimation scaleAnimationPerson = new ScaleAnimation(startPoint, endPoint, startPoint, endPoint, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0.5f); + scaleAnimationPerson.setFillAfter(true); + ivPerson.startAnimation(scaleAnimationPerson); + } + + if (startPoint != endPoint) { + startPoint = endPoint; + } + } + + @Override + public void setRefreshTime(long lastRefreshTime) { + // 获取当前时间 + Calendar mCalendar = Calendar.getInstance(); + long refreshTime = mCalendar.getTimeInMillis(); + long howLong = refreshTime - lastRefreshTime; + int minutes = (int) (howLong / 1000 / 60); + String refreshTimeText = null; + Resources resources = getContext().getResources(); + if (minutes < 1) { + refreshTimeText = resources.getString(R.string.xrefreshview_refresh_justnow); + } else if (minutes < 60) { + refreshTimeText = resources.getString(R.string.xrefreshview_refresh_minutes_ago); + refreshTimeText = Utils.format(refreshTimeText, minutes); + } else if (minutes < 60 * 24) { + refreshTimeText = resources.getString(R.string.xrefreshview_refresh_hours_ago); + refreshTimeText = Utils.format(refreshTimeText, minutes / 60); + } else { + refreshTimeText = resources.getString(R.string.xrefreshview_refresh_days_ago); + refreshTimeText = Utils.format(refreshTimeText, minutes / 60 / 24); + } + } + + @Override + public int getHeaderHeight() { + return getMeasuredHeight(); + } +} diff --git a/app/src/main/java/com/andview/example/view/XRefreshViewWineHeader.java b/app/src/main/java/com/andview/example/view/XRefreshViewWineHeader.java new file mode 100644 index 0000000..374dbdb --- /dev/null +++ b/app/src/main/java/com/andview/example/view/XRefreshViewWineHeader.java @@ -0,0 +1,141 @@ +package com.andview.example.view; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.drawable.AnimationDrawable; +import android.os.Handler; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.Animation; +import android.view.animation.RotateAnimation; +import android.widget.ImageView; +import android.widget.LinearLayout; + +import com.andview.example.R; +import com.andview.refreshview.callback.IHeaderCallBack; +import com.andview.refreshview.utils.Utils; + +import java.util.Calendar; + +public class XRefreshViewWineHeader extends LinearLayout implements IHeaderCallBack { + private ViewGroup mContent; + // private ImageView mArrowImageView; + private ImageView mOkImageView; + private View layoutTop; + // private ProgressBar mProgressBar; +// private TextView mHintTextView; +// private TextView mHeaderTimeTextView; + private Animation mRotateUpAnim; + private Animation mRotateDownAnim; + private final int ROTATE_ANIM_DURATION = 180; + + public XRefreshViewWineHeader(Context context) { + super(context); + initView(context, true); + } + + public XRefreshViewWineHeader(Context context, boolean isAddHeaderTop) { + super(context); + initView(context, isAddHeaderTop); + } + + /** + * @param context + * @param attrs + */ + public XRefreshViewWineHeader(Context context, AttributeSet attrs) { + super(context, attrs); + initView(context, true); + } + + private void initView(Context context, boolean isAddHeaderTop) { + mContent = (ViewGroup) LayoutInflater.from(context).inflate(R.layout.xrefreshview_wine_header, this); + mOkImageView = (ImageView) findViewById(R.id.xrefreshview_header_ok); + layoutTop = findViewById(R.id.layout_top); + layoutTop.setVisibility(isAddHeaderTop ? VISIBLE : GONE); + + mOkImageView.setImageResource(R.drawable.wine_loading); + mRotateUpAnim = new RotateAnimation(0.0f, -180.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); + mRotateUpAnim.setDuration(ROTATE_ANIM_DURATION); + mRotateUpAnim.setFillAfter(true); + mRotateDownAnim = new RotateAnimation(-180.0f, 0.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); + mRotateDownAnim.setDuration(ROTATE_ANIM_DURATION); + mRotateDownAnim.setFillAfter(true); + } + + public void setRefreshTime(long lastRefreshTime) { + // 获取当前时间 + Calendar mCalendar = Calendar.getInstance(); + long refreshTime = mCalendar.getTimeInMillis(); + long howLong = refreshTime - lastRefreshTime; + int minutes = (int) (howLong / 1000 / 60); + String refreshTimeText = null; + Resources resources = getContext().getResources(); + if (minutes < 1) { + refreshTimeText = resources.getString(R.string.xrefreshview_refresh_justnow); + } else if (minutes < 60) { + refreshTimeText = resources.getString(R.string.xrefreshview_refresh_minutes_ago); + refreshTimeText = Utils.format(refreshTimeText, minutes); + } else if (minutes < 60 * 24) { + refreshTimeText = resources.getString(R.string.xrefreshview_refresh_hours_ago); + refreshTimeText = Utils.format(refreshTimeText, minutes / 60); + } else { + refreshTimeText = resources.getString(R.string.xrefreshview_refresh_days_ago); + refreshTimeText = Utils.format(refreshTimeText, minutes / 60 / 24); + } + } + + /** + * hide footer when disable pull load more + */ + public void hide() { + setVisibility(View.GONE); + } + + public void show() { + setVisibility(View.VISIBLE); + } + + @Override + public void onStateNormal() { + mOkImageView.setVisibility(View.VISIBLE); + ((AnimationDrawable) mOkImageView.getDrawable()).stop(); + } + + @Override + public void onStateReady() { + mOkImageView.setVisibility(View.VISIBLE); + ((AnimationDrawable) mOkImageView.getDrawable()).stop(); + } + + @Override + public void onStateRefreshing() { + mOkImageView.setVisibility(View.VISIBLE); + ((AnimationDrawable) mOkImageView.getDrawable()).start(); + } + + @Override + public void onStateFinish(boolean success) { + if (success) { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + mOkImageView.setVisibility(View.VISIBLE); + ((AnimationDrawable) mOkImageView.getDrawable()).stop(); + } + }, 1000); + } + } + + @Override + public void onHeaderMove(double offset, int offsetY, int deltaY) { + + } + + @Override + public int getHeaderHeight() { + return getMeasuredHeight(); + } +} diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_00.png b/app/src/main/res/drawable-xhdpi/colors_refresh_00.png new file mode 100644 index 0000000..690c423 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_00.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_01.png b/app/src/main/res/drawable-xhdpi/colors_refresh_01.png new file mode 100644 index 0000000..e27b474 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_01.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_02.png b/app/src/main/res/drawable-xhdpi/colors_refresh_02.png new file mode 100644 index 0000000..b3698ec Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_02.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_03.png b/app/src/main/res/drawable-xhdpi/colors_refresh_03.png new file mode 100644 index 0000000..e676cd8 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_03.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_04.png b/app/src/main/res/drawable-xhdpi/colors_refresh_04.png new file mode 100644 index 0000000..b7a54fa Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_04.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_05.png b/app/src/main/res/drawable-xhdpi/colors_refresh_05.png new file mode 100644 index 0000000..9ea3e92 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_05.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_06.png b/app/src/main/res/drawable-xhdpi/colors_refresh_06.png new file mode 100644 index 0000000..d273ee9 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_06.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_07.png b/app/src/main/res/drawable-xhdpi/colors_refresh_07.png new file mode 100644 index 0000000..641bd0f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_07.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_08.png b/app/src/main/res/drawable-xhdpi/colors_refresh_08.png new file mode 100644 index 0000000..1f19bb4 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_08.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_09.png b/app/src/main/res/drawable-xhdpi/colors_refresh_09.png new file mode 100644 index 0000000..8ae9f88 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_09.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_10.png b/app/src/main/res/drawable-xhdpi/colors_refresh_10.png new file mode 100644 index 0000000..2376e2c Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_10.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_11.png b/app/src/main/res/drawable-xhdpi/colors_refresh_11.png new file mode 100644 index 0000000..d0cab7a Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_11.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_12.png b/app/src/main/res/drawable-xhdpi/colors_refresh_12.png new file mode 100644 index 0000000..4080956 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_12.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_13.png b/app/src/main/res/drawable-xhdpi/colors_refresh_13.png new file mode 100644 index 0000000..61422a6 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_13.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_14.png b/app/src/main/res/drawable-xhdpi/colors_refresh_14.png new file mode 100644 index 0000000..a08a80f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_14.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_15.png b/app/src/main/res/drawable-xhdpi/colors_refresh_15.png new file mode 100644 index 0000000..0eb7de0 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_15.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_16.png b/app/src/main/res/drawable-xhdpi/colors_refresh_16.png new file mode 100644 index 0000000..414f3d9 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_16.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_17.png b/app/src/main/res/drawable-xhdpi/colors_refresh_17.png new file mode 100644 index 0000000..0f6398f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_17.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_18.png b/app/src/main/res/drawable-xhdpi/colors_refresh_18.png new file mode 100644 index 0000000..34a8183 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_18.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_19.png b/app/src/main/res/drawable-xhdpi/colors_refresh_19.png new file mode 100644 index 0000000..1f1a931 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_19.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_20.png b/app/src/main/res/drawable-xhdpi/colors_refresh_20.png new file mode 100644 index 0000000..bb8ad7f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_20.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_21.png b/app/src/main/res/drawable-xhdpi/colors_refresh_21.png new file mode 100644 index 0000000..e196ef8 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_21.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_22.png b/app/src/main/res/drawable-xhdpi/colors_refresh_22.png new file mode 100644 index 0000000..9b7f401 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_22.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_23.png b/app/src/main/res/drawable-xhdpi/colors_refresh_23.png new file mode 100644 index 0000000..6ef0be6 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_23.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_24.png b/app/src/main/res/drawable-xhdpi/colors_refresh_24.png new file mode 100644 index 0000000..27087c1 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_24.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_25.png b/app/src/main/res/drawable-xhdpi/colors_refresh_25.png new file mode 100644 index 0000000..58e6f71 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_25.png differ diff --git a/app/src/main/res/drawable-xhdpi/colors_refresh_icon.png b/app/src/main/res/drawable-xhdpi/colors_refresh_icon.png new file mode 100644 index 0000000..cb4cbf7 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/colors_refresh_icon.png differ diff --git a/app/src/main/res/drawable-xhdpi/jd_package.png b/app/src/main/res/drawable-xhdpi/jd_package.png new file mode 100755 index 0000000..5e9a8fa Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/jd_package.png differ diff --git a/app/src/main/res/drawable-xhdpi/jd_person.png b/app/src/main/res/drawable-xhdpi/jd_person.png new file mode 100755 index 0000000..0b8ef69 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/jd_person.png differ diff --git a/app/src/main/res/drawable-xhdpi/jd_person_package_1.png b/app/src/main/res/drawable-xhdpi/jd_person_package_1.png new file mode 100755 index 0000000..2d4840c Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/jd_person_package_1.png differ diff --git a/app/src/main/res/drawable-xhdpi/jd_person_package_2.png b/app/src/main/res/drawable-xhdpi/jd_person_package_2.png new file mode 100755 index 0000000..3729a72 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/jd_person_package_2.png differ diff --git a/app/src/main/res/drawable-xhdpi/jd_person_package_3.png b/app/src/main/res/drawable-xhdpi/jd_person_package_3.png new file mode 100755 index 0000000..c077683 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/jd_person_package_3.png differ diff --git a/app/src/main/res/drawable-xhdpi/loading_1.png b/app/src/main/res/drawable-xhdpi/loading_1.png new file mode 100755 index 0000000..fad6cb5 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/loading_1.png differ diff --git a/app/src/main/res/drawable-xhdpi/loading_2.png b/app/src/main/res/drawable-xhdpi/loading_2.png new file mode 100755 index 0000000..bfa7518 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/loading_2.png differ diff --git a/app/src/main/res/drawable-xhdpi/water_point_left.png b/app/src/main/res/drawable-xhdpi/water_point_left.png new file mode 100755 index 0000000..c07c2ce Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/water_point_left.png differ diff --git a/app/src/main/res/drawable-xhdpi/water_point_right.png b/app/src/main/res/drawable-xhdpi/water_point_right.png new file mode 100755 index 0000000..584e8bb Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/water_point_right.png differ diff --git a/app/src/main/res/drawable/colors_refresh_loading.xml b/app/src/main/res/drawable/colors_refresh_loading.xml new file mode 100644 index 0000000..6a0b205 --- /dev/null +++ b/app/src/main/res/drawable/colors_refresh_loading.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/jd_loading.xml b/app/src/main/res/drawable/jd_loading.xml new file mode 100644 index 0000000..ffd59e8 --- /dev/null +++ b/app/src/main/res/drawable/jd_loading.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/wine_loading.xml b/app/src/main/res/drawable/wine_loading.xml new file mode 100644 index 0000000..d7c2e7a --- /dev/null +++ b/app/src/main/res/drawable/wine_loading.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_car_crm.xml b/app/src/main/res/layout/activity_car_crm.xml new file mode 100644 index 0000000..c2a0f69 --- /dev/null +++ b/app/src/main/res/layout/activity_car_crm.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + +