diff --git a/.gitignore b/.gitignore index c1e8a1ac9408233861d61b520c7d1a035745f675..37a4eb8b43d978ea05b2c6e3fb934f9b40dddd4d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,15 @@ *.iml .gradle /local.properties -/.idea +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml .DS_Store /build /captures -gradle* -/TODO_list.md - +.externalNativeBuild +/entry/.preview +.cxx diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index 96cc43efa6a0885098044e976cd780bb42c68a70..0000000000000000000000000000000000000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml deleted file mode 100644 index e7bedf3377d40335424fd605124d4761390218bb..0000000000000000000000000000000000000000 --- a/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index 8ea0936df7d5700b9fd5e1a8b441f162c0442fd3..0000000000000000000000000000000000000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 5d19981032aa01b060f5a568641d7a8840cc90dc..0000000000000000000000000000000000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index a026ddeaf96712fad7370ed7996fe99ab1906908..0000000000000000000000000000000000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460d8b38ac04e3a3224d7c79ef719b1991a9..0000000000000000000000000000000000000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1ddfbbc029bcab630581847471d7f238ec53..0000000000000000000000000000000000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..e35f13e36dce7eefde71fdc09901a6ebe4b4b69d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,6 @@ +## 0.0.1-SNAPSHOT +ohos 第一个版本,实现了原库的部分api功能: +1,Webview上做刷新操作无法实现,Webview会覆盖其它组件 +2,ListContenter通过设置toucher监听改变滑动屏幕的刷新样式,Touch监听事件开启再取消后无效。 +3,列表滚动监听,列表滚动刷新太快会导致执行操作处理不及时。 +4,底部拉动 加载更多,滚动数据 和滑动屏幕无法区分,只能通过检查最后一个来做限制 \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE similarity index 99% rename from LICENSE.txt rename to LICENSE index d645695673349e3947e8e5ae42332d0ac3164cd7..7a4a3ea2424c09fbe48d455aed1eaa94d9124835 100644 --- a/LICENSE.txt +++ b/LICENSE @@ -199,4 +199,4 @@ 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. + limitations under the License. \ No newline at end of file diff --git a/README.OPENSOURCE b/README.OPENSOURCE new file mode 100644 index 0000000000000000000000000000000000000000..5d69cc60d6ef4ff9324fc52ebe249538ebfe9f61 --- /dev/null +++ b/README.OPENSOURCE @@ -0,0 +1,10 @@ +[ + { + "Name": "TwinklingRefreshLayout", + "License": "Apache License", + "License File": "LICENSE", + "Version Number": "master", + "Upstream URL": "https://github.com/lcodecorex/TwinklingRefreshLayout", + "Description": "TwinklingRefreshLayout延伸了Google的SwipeRefreshLayout的思想,不在列表控件上动刀,而是使用一个ViewGroup来包含列表控件,以保持其较低的耦合性和较高的通用性。" + } +] \ No newline at end of file diff --git a/README.md b/README.md index a198c9dbc84d0b0860c0f41b0221cd2702711788..14cfd005252925bb973409b899369d3360711e1f 100644 --- a/README.md +++ b/README.md @@ -1,444 +1,156 @@ -## 【DECREEPTED】 - # TwinklingRefreshLayout -[中文文档](./README_CN.md) - -TwinklingRefreshLayout extended the thoughts of SwipeRefreshLayout,using a ViewGroup to include a list of Views, to maintain its low coupling and high versatility. Follows are its main features. - - - New overscroll animations, running smoothly, much better than iOS. - - Support RecyclerView, ScrollView, AbsListView, WebView and so on. - - Support to load more. - - Default support cross-border rebound. - - You can open a pure bounds rebound mode. - - Lots of methods in the class OnRefreshListener. - - It provides an interface to the callback during the sliding coefficient. Personalized offer good support. - - NestedScroll,CoordinatorLayout - **Any View is supported.** +#### 项目介绍 -![](art/structure_v1.0.png) +- 项目名称:TwinklingRefreshLayout +- 所属系列:openharmony的第三方组件适配移植 +- 功能:TwinklingRefreshLayout延伸了Google的SwipeRefreshLayout的思想,不在列表控件上动刀,而是使用一个ViewGroup来包含列表控件,以保持其较低的耦合性和较高的通用性。 +- 项目移植状态:主功能完成 +- 调用差异:无 +- 开发版本:sdk6,DevEco Studio2.2 Beta1 +- 基线版本:master分支 -## Demo -[Download Demo](art/app-debug.apk) +#### 效果演示 -![](art/gif_recyclerview.gif) ![](art/gif_listview.gif) ![](art/gif_gridview.gif) ![](art/gif_recyclerview2.gif) ![](art/gif_scrollview.gif) ![](art/gif_webview.gif) + -You can download these Videos for more details. +#### 安装教程 -- [Music - ListView - FixedHeader](art/gif_listview.mp4) -- [Food - RecyclerView - PureScrollMode](art/gif_recyclerview.mp4) -- [Science - GridView - SinaHeader](art/gif_gridview.mp4) -- [Photo - RecyclerView - BezierLayout](art/gif_recyclerview2.mp4) -- [Story - ScrollView - GoogleDotView](art/gif_scrollview.mp4) -- [Dribbble - WebView - FloatRefresh](art/gif_webview.mp4) - -## Usage -#### 1.Add a gradle dependency. +1.在项目根目录下的build.gradle文件中, ``` -compile 'com.lcodecorex:tkrefreshlayout:1.0.7' +allprojects { + repositories { + maven { + url 'https://s01.oss.sonatype.org/content/repositories/snapshots/' + } + } +} ``` - -#### 2.Add TwinklingRefreshLayout in the layout xml. -```xml - - - - - +2.在entry模块的build.gradle文件中, ``` - -To get better effect, you'd better add code `android:overScrollMode="never"` to the childView. - -#### 3.Coding in the Activity or Fragment. -##### Change of state need to be manually controlled. -```java -refreshLayout.setOnRefreshListener(new RefreshListenerAdapter(){ - @Override - public void onRefresh(final TwinklingRefreshLayout refreshLayout) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - refreshLayout.finishRefreshing(); - } - },2000); - } - - @Override - public void onLoadMore(final TwinklingRefreshLayout refreshLayout) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - refreshLayout.finishLoadmore(); - } - },2000); - } - }); - } -``` - -Use finishRefreshing() method to end refresh, finishLoadmore() method to end load more. OnRefreshListener there are other methods, you can choose need to override. - -And if you want you refresh automatically, call the method startRefresh(). - -##### setWaveHeight、setHeaderHeight、setBottomHeight、setOverScrollHeight -- setMaxHeadHeight is used To set the maximum height of the head can be stretched. -- setHeaderHeight is used to set the standard head height. -- setMaxBottomHeight. -- setBottomHeight is used to set the Bottom height. -- setOverScrollHeight is used to set the max height of overscroll. - -And now dp value is supported. - -#### setEnableRefresh、setEnableLoadmore -Flexible settings for whether to disable the pulling-down mode. - -##### setHeaderView(IHeaderView headerView)、setBottomView(IBottomView bottomView) - -#### setEnableOverScroll -Whether to allow overscroll mode, opened by default. - -##### setOverScrollTopShow、setOverScrollBottomShow、setOverScrollRefreshShow -Whether to allow the display refresh control on overscrolling, the default is true. - -##### setPureScrollModeOn() -To open the pure overscroll mode so that refreshView would gone permanently. - -##### setAutoLoadMore -if open the loadmore mode after overscrolling bottom automatically. - -##### addFixedExHeader -Allow you to add a view fixed on the top. - -##### startRefresh、startLoadMore、finishRefreshing、finishLoadmore - -##### setFloatRefresh(boolean) -Make refresh-animation like SwipeRefreshLayout. - -##### setTargetView(View view) -Set the target view that you can scroll. - -##### setDefaultHeader、setDefaultFooter -static methods aims to set a default header/footer in a/an Application/Activity. - -#### 4.Attributes -- tr_max_head_height - Flexible head height -- tr_head_height - Head height -- tr_max_bottom_height -- tr_bottom_height - Bottom height -- tr_overscroll_height - OverScroll Height -- tr_enable_refresh - default is true -- tr_enable_loadmore - default is true -- tr_pureScrollMode_on - default is false -- tr_overscroll_top_show - default is true -- tr_overscroll_bottom_show - default is true -- tr_enable_overscroll - default is true. -- tr_floatRefresh - open the float-refresh mode. -- tr_autoLoadMore -- tr_enable_keepIView - default is true. -- tr_showRefreshingWhenOverScroll - default is true. -- tr_showLoadingWhenOverScroll - default is true. - -## Other -### 1.setOnRefreshListener -- onPullingDown(TwinklingRefreshLayout refreshLayout, float fraction) -- onPullingUp(TwinklingRefreshLayout refreshLayout, float fraction) -- onPullDownReleasing(TwinklingRefreshLayout refreshLayout, float fraction) -- onPullUpReleasing(TwinklingRefreshLayout refreshLayout, float fraction) -- onRefresh(TwinklingRefreshLayout refreshLayout) -- onLoadMore(TwinklingRefreshLayout refreshLayout) - -fraction = currentMoveHeight/headHeight OR (fraction = currentMoveHeight/bottomHeight). - -### 3.Header and Footer -##### BezierLayout(pic 4) -- setWaveColor -- setRippleColor - -##### GoogleDotView(pic 5) -##### SinaRefreshView(pic 3) -- setArrowResource -- setTextColor -- setPullDownStr -- setReleaseRefreshStr -- setRefreshingStr - -##### ProgressLayout(SwipeRefreshLayout pic 6) -- setProgressBackgroundColorSchemeResource(@ColorRes int colorRes) -- setProgressBackgroundColorSchemeColor(@ColorInt int color) -- setColorSchemeResources(@ColorRes int... colorResIds) - -####Footer -##### BallPulseView(pic 2) -- setNormalColor(@ColorInt int color) -- setAnimatingColor(@ColorInt int color) - -##### LoadingView(pic 3) -Here is more animations.[AVLoadingIndicatorView](https://github.com/81813780/AVLoadingIndicatorView)。 - -### 3.Personalize the Header and Footer. -The Header needs to implement IHeaderView interface and Footer in in the same way(IBottomView). -```java -public interface IHeaderView { - View getView(); - - void onPullingDown(float fraction,float maxHeadHeight,float headHeight); - - void onPullReleasing(float fraction,float maxHeadHeight,float headHeight); - - void startAnim(float maxHeadHeight,float headHeight); - - void reset(); +dependencies { + implementation('com.gitee.chinasoft_ohos:TwinklingRefreshLayout_library:0.0.1-SNAPSHOT') + ...... } ``` +在sdk6,DevEco Studio2.2 Beta1 下项目可直接运行 如无法运行,删除项目.gradle,.idea,build,gradle,build.gradle文件, 并依据自己的版本创建新项目,将新项目的对应文件复制到根目录下 -getView() method is not allow to return null. +#### 使用说明 -#### Let's implement a simple refresh dynamic efficiency. -1.Define SinaRefreshHeader extended from FrameLayout and implement IHeaderView interface. +Demo中调用library组件库,操作展示组件功能。 -2.Return this in the method getView(). +1、布局文件中引用界面效果: +```xml + +``` +列表展示功能主要再 XRecyclerView类中。 +其中 density属性 是列表的头部和尾部样式类型。 -3.Inflate and find Views in the layout xml. +自定义类 ArrowRefreshHeader 是头部刷新效果: ```java -void init() { - if (rootView == null) { - rootView = View.inflate(getContext(), R.layout.view_sinaheader, null); - refreshArrow = (ImageView) rootView.findViewById(R.id.iv_arrow); - refreshTextView = (TextView) rootView.findViewById(R.id.tv); - loadingView = (ImageView) rootView.findViewById(R.id.iv_loading); - addView(rootView); +public void headView(Context context){ + LayoutScatter scatter = LayoutScatter.getInstance(context); + mContainer = (DirectionalLayout) scatter.parse(ResourceTable.Layout_listview_header, null, false); + + listview_header_text = (DirectionalLayout) mContainer.findComponentById(ResourceTable.Id_listview_header_text); // 功能3 箭头和提示刷新 + cricle_refresh = (DirectionalLayout) mContainer.findComponentById(ResourceTable.Id_cricle_refresh); // 功能1 圆圈刷新 + mHeaderRefreshTimeContainer = (DirectionalLayout) mContainer.findComponentById(ResourceTable.Id_header_refresh_time_container); + + DirectionalLayout.LayoutConfig lp = new DirectionalLayout.LayoutConfig(DirectionalLayout.LayoutConfig.MATCH_PARENT, DirectionalLayout.LayoutConfig.MATCH_CONTENT); + lp.setMargins(0, 0, 0, 0); + this.setPadding(0, 0, 0, 0); + this.setLayoutConfig(lp); + + addComponent(mContainer, new DirectionalLayout.LayoutConfig(DirectionalLayout.LayoutConfig.MATCH_PARENT, 0)); + setAlignment(TextAlignment.BOTTOM); + + frameAnimationElement = new FrameAnimationElement(context, ResourceTable.Graphic_anim_loading_view); + componentContainer = (DirectionalLayout) findComponentById(ResourceTable.Id_frame_container); + mArrowImageView = (Image) mContainer.findComponentById(ResourceTable.Id_listview_header_arrow); + mStatusTextView = (Text) mContainer.findComponentById(ResourceTable.Id_refresh_status_textview); + mHeaderTimeView = (Text) mContainer.findComponentById(ResourceTable.Id_last_refresh_time); + + head_top = (DirectionalLayout) mContainer.findComponentById(ResourceTable.Id_head_top); + if (XRecyclerView.stateInfo == 3) { // 功能3的刷新 + listview_header_text.setVisibility(VISIBLE); + mArrowImageView.setVisibility(VISIBLE); + cricle_refresh.setVisibility(HIDE); + } else if(XRecyclerView.stateInfo == 1) { + cricle_refresh.setVisibility(VISIBLE); + listview_header_text.setVisibility(HIDE); + } else if(XRecyclerView.stateInfo == 5) { + cricle_refresh.setVisibility(HIDE); + listview_header_text.setVisibility(HIDE); + head_top.setVisibility(VISIBLE); } - } -``` - -4.Override some methods. -```java -@Override - public void onPullingDown(float fraction, float maxHeadHeight, float headHeight) { - if (fraction < 1f) refreshTextView.setText(pullDownStr); - if (fraction > 1f) refreshTextView.setText(releaseRefreshStr); - refreshArrow.setRotation(fraction * headHeight / maxHeadHeight * 180); - - - } - - @Override - public void onPullReleasing(float fraction, float maxHeadHeight, float headHeight) { - if (fraction < 1f) { - refreshTextView.setText(pullDownStr); - refreshArrow.setRotation(fraction * headHeight / maxHeadHeight * 180); - if (refreshArrow.getVisibility() == GONE) { - refreshArrow.setVisibility(VISIBLE); - loadingView.setVisibility(GONE); - } + //init the progress view + mProgressBar = (SimpleViewSwitcher) mContainer.findComponentById(ResourceTable.Id_listview_header_progressbar); + progressView = new AVLoadingIndicatorView(context); + progressView.setIndicatorColor(0xffB5B5B5); + progressView.setIndicatorId(ProgressStyle.BallSpinFadeLoader); + if (mProgressBar != null) { + mProgressBar.setView(progressView); + progressView.applyAnimation(); } + estimateSize(ComponentContainer.LayoutConfig.MATCH_CONTENT, ComponentContainer.LayoutConfig.MATCH_CONTENT); + mMeasuredHeight = getEstimatedHeight(); + loadingView = (LoadingView) + mContainer.findComponentById(ResourceTable.Id_progress_bar_loading); + loadingView.setBindStateChangedListener(loadingView); + loadingView.setPaintcolor(0xff000000); + loadingView.setSize(45); + loadingView.stopAnimation(); } - @Override - public void startAnim(float maxHeadHeight, float headHeight) { - refreshTextView.setText(refreshingStr); - refreshArrow.setVisibility(GONE); - loadingView.setVisibility(VISIBLE); - } - - @Override - public void onFinish(OnAnimEndListener listener) { - listener.onAnimEnd(); - } -``` - -5.layout xml. -```xml - - - - - - - - -``` - -Pay attention to the using of the parameter `fraction`. Such as the code above`refreshArrow.setRotation(fraction * headHeight / maxHeadHeight * 180)`,`fraction * headHeight` is the translationY of the Head and 180 is the angle the arrow would rotate,so that we can make the arrow rotate 180 degrees when the translationY is come to the maxHeadHeight. - - -onPullingDown/onPullingUp -onPullReleasing -startAnim - be called automatically after the method onRefresh/onLoadMore is called. - -Congratulations! Simple to use and simple to Personalise.(To see a more simple example. **TextHeaderView(pic 4)**)。 - -### NestedScroll -#### TwinklingRefreshLayout Nested CoordinatorLayout ----layout -```xml - - - - - - - - - - - - - - - ``` ---- code1 -``` -refreshLayout.setTargetView(rv); -``` -Find the RecyclerView/ListView. +自定义类 LoadingMoreFooter 是尾部加载更多效果: ---- code2 ```java -AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.appbar_layout); -appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { - @Override - public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { - if (verticalOffset >= 0) { - refreshLayout.setEnableRefresh(true); - refreshLayout.setEnableOverScroll(false); - } else { - refreshLayout.setEnableRefresh(false); - refreshLayout.setEnableOverScroll(false); + private void initView(Context context, AttrSet attrSet, String styleName){ + setAlignment(CENTER); + setOrientation(HORIZONTAL); + setComponentSize(LayoutConfig.MATCH_PARENT, DeviceUtils.dp2px(getContext(),5)); + progressCon = new SimpleViewSwitcher(context); + progressCon.setWidth(DeviceUtils.dp2px(getContext(),40)); + progressCon.setHeight(DeviceUtils.dp2px(getContext(),40)); + addComponent(progressCon); + + if (XRecyclerView.stateInfo == 3) { + addHeadFoot(); + } else if(XRecyclerView.stateInfo == 1 || XRecyclerView.stateInfo == 5){ + addText(); } + } -}); ``` +2、自定义刷新和加载跟多效果属性 +```java + mRecyclerView.setPullRefreshEnabled(false); // 设置刷新的开启状态,默认开启 + mRecyclerView.setLoadingMoreEnabled(false); // 设置加载更多的状态,默认是开启 + mRecyclerView.setLongClickable(false); // 设置长按 + mRecyclerView.setReboundEffect(true); //设置上下滚动效果 + photoAdapter.setNumColumns(2); //设置列表的列数 -####CoordinatorLayout nested TwinklingRefreshLayout ---- layout -```xml - - - - - - - - - - ``` -Pay attention to `layout_behavior="@string/appbar_scrolling_view_behavior"` for TwinklingRefreshLayout. - -> ps:Contact me: lcodecore@163.com -> QQ group: 202640706 - -If you like this library, you can donate me. Buy me a coffee! - -![](art/alipay.jpg) ![](art/wepay.png) - -## Update Logs -#### v1.07 -- NestedScroll,CoordinateLayout -- Any View -- Keep state when refreshing/loading. - -#### v1.06 -- Repair memory leaks of customized Views. -- remove the dependence of AVLoadingIndicatorView. -- Fix bugs of OverScroll when TargetView scrolls at the top/bottom. -- Repair bugs of touching,scroll-event listeners. -- Optimization of interface flicker problems after load-more. - -#### v1.05 Emergency Fix -- Fix the bug of setAutoLoadMore(). -- Fix the bug that FixedHeader covered the first item of listview. -- Add onRefreshCanceled()/onLoadmoreCanceled() for RefreshListenerAdapter. -#### v1.04 -- Refactor the code. -- Make animations smoothly. -- Add support to Fixed Header. -- Add support to float refresh mode. -- IHeadView.onFinish(animEndListener) -> Available to run animations before finishRefresh. +#### 测试信息 -#### v1.03 -- more attributes. -- Fix the NullPointerException bug in Fragment. -- Fix the Sliding conflict. +CodeCheck代码测试无异常 +CloudTest代码测试无异常 -License -------- +病毒安全检测通过 - Copyright 2016 lcodecorex +当前版本demo功能与原组件基本无差异 - 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 +当前版本demo部分功能暂不支持模拟器运行 - 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. +- 0.0.1-SNAPSHOT \ No newline at end of file diff --git a/README_CN.md b/README_CN.md deleted file mode 100644 index 6ba9e6eb15ecc37f347399c31a63e189cac4815d..0000000000000000000000000000000000000000 --- a/README_CN.md +++ /dev/null @@ -1,491 +0,0 @@ -# TwinklingRefreshLayout -TwinklingRefreshLayout延伸了Google的SwipeRefreshLayout的思想,不在列表控件上动刀,而是使用一个ViewGroup来包含列表控件,以保持其较低的耦合性和较高的通用性。其主要特性有: - -1. 支持RecyclerView、ScrollView、AbsListView系列(ListView、GridView)、WebView以及其它可以获取到scrollY的控件 -2. 支持加载更多 -3. 默认支持 **越界回弹**,随手势速度有不同的效果 -4. 可开启没有刷新控件的纯净越界回弹模式 -5. setOnRefreshListener中拥有大量可以回调的方法 -6. 将Header和Footer抽象成了接口,并回调了滑动过程中的系数,方便实现个性化的Header和Footer -7. 支持NestedScroll,嵌套CoordinatorLayout - -**目前已经支持了所有的View,比如是一个FrameLayout,LinearLayout,AnyView。** - -![](art/structure_v1.0.png) - -## Demo -[下载Demo](art/app-debug.apk) - -![](art/gif_recyclerview.gif) ![](art/gif_listview.gif) ![](art/gif_gridview.gif) ![](art/gif_recyclerview2.gif) ![](art/gif_scrollview.gif) ![](art/gif_webview.gif) - -You can download these Videos for more details. - -- [Music - ListView - FixedHeader](art/gif_listview.mp4) -- [Food - RecyclerView - PureScrollMode](art/gif_recyclerview.mp4) -- [Science - GridView - SinaHeader](art/gif_gridview.mp4) -- [Photo - RecyclerView - BezierLayout](art/gif_recyclerview2.mp4) -- [Story - ScrollView - GoogleDotView](art/gif_scrollview.mp4) -- [Dribbble - WebView - FloatRefresh](art/gif_webview.mp4) - -## 使用方法 -#### 1.添加gradle依赖 -将libray模块复制到项目中,或者直接在build.gradle中依赖: -``` -compile 'com.lcodecorex:tkrefreshlayout:1.0.7' -``` - -#### 2.在xml中添加TwinklingRefreshLayout -```xml - - - - - -``` - -Android系统为了跟iOS不一样,当界面OverScroll的时候会显示一个阴影。为了达到更好的显示效果,最好禁用系统的overScroll,如上给RecyclerView添加`android:overScrollMode="never"`。 - -#### 3.在Activity或者Fragment中配置 -##### TwinklingRefreshLayout不会自动结束刷新或者加载更多,需要手动控制 -```java -refreshLayout.setOnRefreshListener(new RefreshListenerAdapter(){ - @Override - public void onRefresh(final TwinklingRefreshLayout refreshLayout) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - refreshLayout.finishRefreshing(); - } - },2000); - } - - @Override - public void onLoadMore(final TwinklingRefreshLayout refreshLayout) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - refreshLayout.finishLoadmore(); - } - },2000); - } - }); - } -``` -使用finishRefreshing()方法结束刷新,finishLoadmore()方法结束加载更多。此处OnRefreshListener还有其它方法,可以选择需要的来重写。 - -如果你想进入到界面的时候主动调用下刷新,可以调用startRefresh()/startLoadmore()方法。 - -##### setWaveHeight、setHeaderHeight、setBottomHeight、setOverScrollHeight -- setMaxHeadHeight 设置头部可拉伸的最大高度。 -- setHeaderHeight 头部固定高度(在此高度上显示刷新状态) -- setMaxBottomHeight -- setBottomHeight 底部高度 -- setOverScrollHeight 设置最大的越界高度 - -#### setEnableRefresh、setEnableLoadmore -灵活的设置是否禁用上下拉。 - -##### setHeaderView(IHeaderView headerView)、setBottomView(IBottomView bottomView) -设置头部/底部个性化刷新效果,头部需要实现IHeaderView,底部需要实现IBottomView。 - -#### setEnableOverScroll -是否允许越界回弹。 - -##### setOverScrollTopShow、setOverScrollBottomShow、setOverScrollRefreshShow -是否允许在越界的时候显示刷新控件,默认是允许的,也就是Fling越界的时候Header或Footer照常显示,反之就是不显示;可能有特殊的情况,刷新控件会影响显示体验才设立了这个状态。 - -##### setPureScrollModeOn() -开启纯净的越界回弹模式,也就是所有刷新相关的View都不显示,只显示越界回弹效果 - -##### setAutoLoadMore -是否在底部越界的时候自动切换到加载更多模式 - -##### addFixedExHeader -添加一个固定在顶部的Header(效果还需要优化) - -##### startRefresh、startLoadMore、finishRefreshing、finishLoadmore - -##### setFloatRefresh(boolean) -支持切换到像SwipeRefreshLayout一样的悬浮刷新模式了。 - -##### setTargetView(View view) -设置滚动事件的作用对象。 - -##### setDefaultHeader、setDefaultFooter -现在已经提供了设置默认的Header、Footer的static方法,可在Application或者一个Activity中这样设置: -```java -TwinklingRefreshLayout.setDefaultHeader(SinaRefreshView.class.getName()); -TwinklingRefreshLayout.setDefaultFooter(BallPulseView.class.getName()); -``` - - -#### 4.扩展属性 -- tr_max_head_height 头部拉伸允许的最大高度 -- tr_head_height 头部高度 -- tr_max_bottom_height -- tr_bottom_height 底部高度 -- tr_overscroll_height 允许越界的最大高度 -- tr_enable_refresh 是否允许刷新,默认为true -- tr_enable_loadmore 是否允许加载更多,默认为true -- tr_pureScrollMode_on 是否开启纯净的越界回弹模式 -- tr_overscroll_top_show - 否允许顶部越界时显示顶部View -- tr_overscroll_bottom_show 是否允许底部越界时显示底部View -- tr_enable_overscroll 是否允许越界回弹 -- tr_floatRefresh 开启悬浮刷新模式 -- tr_autoLoadMore 越界时自动加载更多 -- tr_enable_keepIView 是否在开始刷新之后保持状态,默认为true;若需要保持原来的操作逻辑,这里设置为false即可 -- tr_showRefreshingWhenOverScroll 越界时直接显示正在刷新中的头部 -- tr_showLoadingWhenOverScroll 越界时直接显示正在加载更多中的底部 - -## 其它说明 -### 1.默认支持越界回弹,并可以随手势越界不同的高度 -这一点很多类似SwipeRefreshLayout的刷新控件都没有做到(包括SwipeRefreshLayout),因为没有拦截下来的时间会传递给列表控件,而列表控件的滚动状态很难获取。解决方案就是给列表控件设置了OnTouchListener并把事件交给GestureDetector处理,然后在列表控件的OnScrollListener中监听View是否滚动到了顶部(没有OnScrollListener的则采用延时监听策略)。 - -### 2.setOnRefreshListener大量可以回调的方法 -- onPullingDown(TwinklingRefreshLayout refreshLayout, float fraction) 正在下拉的过程 -- onPullingUp(TwinklingRefreshLayout refreshLayout, float fraction) 正在上拉的过程 -- onPullDownReleasing(TwinklingRefreshLayout refreshLayout, float fraction) 下拉释放过程 -- onPullUpReleasing(TwinklingRefreshLayout refreshLayout, float fraction) 上拉释放过程 -- onRefresh(TwinklingRefreshLayout refreshLayout) 正在刷新 -- onLoadMore(TwinklingRefreshLayout refreshLayout) 正在加载更多 - -其中fraction表示当前下拉的距离与Header高度的比值(或者当前上拉距离与Footer高度的比值)。 - -### 3.Header和Footer -##### BezierLayout(pic 4) -- setWaveColor -- setRippleColor - -##### GoogleDotView(pic 5) -##### SinaRefreshView(pic 3) -- setArrowResource -- setTextColor -- setPullDownStr -- setReleaseRefreshStr -- setRefreshingStr - -##### ProgressLayout(SwipeRefreshLayout pic 6) -- setProgressBackgroundColorSchemeResource(@ColorRes int colorRes) -- setProgressBackgroundColorSchemeColor(@ColorInt int color) -- setColorSchemeResources(@ColorRes int... colorResIds) - -####Footer -##### BallPulseView(pic 2) -- setNormalColor(@ColorInt int color) -- setAnimatingColor(@ColorInt int color) - -##### LoadingView(pic 3) -更多动效可以参考[AVLoadingIndicatorView](https://github.com/81813780/AVLoadingIndicatorView)库。 - - -### 3.实现个性化的Header和Footer -相关接口分别为IHeaderView和IBottomView,代码如下: -```java -public interface IHeaderView { - View getView(); - - void onPullingDown(float fraction,float maxHeadHeight,float headHeight); - - void onPullReleasing(float fraction,float maxHeadHeight,float headHeight); - - void startAnim(float maxHeadHeight,float headHeight); - - void reset(); -} -``` - -其中getView()方法用于在TwinklingRefreshLayout中获取到实际的Header,因此不能返回null。 - -**实现像新浪微博那样的刷新效果**(有部分修改,具体请看源码),实现代码如下: - -1.首先定义SinaRefreshHeader继承自FrameLayout并实现IHeaderView方法 - -2.getView()方法中返回this - -3.在onAttachedToWindow()或者构造函数方法中获取一下需要用到的布局 - -4. 在onFinish()方法中调用listener.onAnimEnd()。此方法的目的是为了在finish之前可以执行一段动画。 - -```java -private void init() { - View rootView = View.inflate(getContext(), R.layout.view_sinaheader, null); - refreshArrow = (ImageView) rootView.findViewById(R.id.iv_arrow); - refreshTextView = (TextView) rootView.findViewById(R.id.tv); - loadingView = (ImageView) rootView.findViewById(R.id.iv_loading); - addView(rootView); - } -``` - -4.实现其它方法 -```java -@Override - public void onPullingDown(float fraction, float maxHeadHeight, float headHeight) { - if (fraction < 1f) refreshTextView.setText(pullDownStr); - if (fraction > 1f) refreshTextView.setText(releaseRefreshStr); - refreshArrow.setRotation(fraction * headHeight / maxHeadHeight * 180); - - - } - - @Override - public void onPullReleasing(float fraction, float maxHeadHeight, float headHeight) { - if (fraction < 1f) { - refreshTextView.setText(pullDownStr); - refreshArrow.setRotation(fraction * headHeight / maxHeadHeight * 180); - if (refreshArrow.getVisibility() == GONE) { - refreshArrow.setVisibility(VISIBLE); - loadingView.setVisibility(GONE); - } - } - } - - @Override - public void startAnim(float maxHeadHeight, float headHeight) { - refreshTextView.setText(refreshingStr); - refreshArrow.setVisibility(GONE); - loadingView.setVisibility(VISIBLE); - } - - @Override - public void onFinish(OnAnimEndListener listener) { - listener.onAnimEnd(); - } -``` - -5.布局文件 -```xml - - - - - - - - -``` - -注意fraction的使用,比如上面的代码`refreshArrow.setRotation(fraction * headHeight / maxHeadHeight * 180)`,`fraction * headHeight`表示当前头部滑动的距离,然后算出它和最大高度的比例,然后乘以180,可以使得在滑动到最大距离时Arrow恰好能旋转180度。 - - -onPullingDown/onPullingUp表示正在下拉/正在上拉的过程。 -onPullReleasing表示向上拉/下拉释放时回调的状态。 -startAnim则是在onRefresh/onLoadMore之后才会回调的过程(此处是显示了加载中的小菊花) - -如上所示,轻而易举就可以实现一个个性化的Header或者Footer。(更简单的实现请参考Demo中的 **TextHeaderView(图四)**)。 - -### NestedScroll -#### TwinklingRefreshLayout嵌套CoordinatorLayout ----layout -```xml - - - - - - - - - - - - - - - -``` - ---- 代码1 -``` -refreshLayout.setTargetView(rv); -``` -让refreshLayout能够找到RecyclerView/ListView - ---- 代码2 -```java -AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.appbar_layout); -appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { - @Override - public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { - if (verticalOffset >= 0) { - refreshLayout.setEnableRefresh(true); - refreshLayout.setEnableOverScroll(false); - } else { - refreshLayout.setEnableRefresh(false); - refreshLayout.setEnableOverScroll(false); - } - } -}); -``` -设置AppBarLayout的移动监听器,需要下拉显示AppBarLayout时需设置setEnableRefresh(false),setEnableOverScroll(false);AppBarLayout隐藏后还原为原来设置的值即可。 - -####CoordinatorLayout嵌套TwinklingRefreshLayout ---- layout -```xml - - - - - - - - - - -``` -注意给TwinklingRefreshLayout设置一个layout_behavior="@string/appbar_scrolling_view_behavior" - -## TODO -- 制作一个star相关的动效 -- 带视差效果的Header - -> ps:如有任何问题或者是建议,可以邮箱联系我!(lcodecore@163.com) -> 如有问题或新的需求,请加QQ群202640706讨论,开源库会根据需求持续更新。 - -开源库消耗了我大量的精力和时间,如果你喜欢这个库或者对自己有所帮助,还请多多支持我。Buy me a coffee! - -![](art/alipay.jpg) ![](art/wepay.png) - -## 更新日志 -#### v1.07 -- 你们要的设置默认刷新头/脚的方法来啦 -- Demo中集成StrictMode、BlockCanary检测ANR -- 支持NestedScroll -- 修复item点击失效/点击闪烁的问题 -- Nested滑动显示刷新头/尾支持 -- 支持刷新/加载更多状态保持 -- 空白View亦可刷新/加载 - -#### v1.06 -- 修复触摸监听失效问题 -- 修复wrap_content时刷新控件显示在屏幕中央问题 -- 去除AVLoadingIndicatorView等依赖,改为BallPulseView -- 优化加载更多完成时出现的闪烁问题 -- 修复ValueAnimator以及Demo中WebView带来的内存泄漏问题 -- 理论上解决了触摸、点击以及滚动监听失效等问题 -- 新增setTargetView()方法,可设置滚动事件的作用对象 -- 添加了CoordinateLayout demo(暂未在RefreshLayout中添加相关逻辑) -- 修复三星、酷派手机出现的兼容问题 -- 修复禁用refresh、loadmore后overscroll不可用的问题 -- 修复在顶部、底部fling时页面闪烁问题 -- 修复IBottomView中的参数错误,新增max_head_height,max_bottom_height属性,setWaveHeight方法为setMaxHeadHeight - -#### v1.05紧急修复版 -- 修复底部自动加载更多问题 -- 修复FixedHeader遮挡item问题 -- RefreshListenerAdapter添加接口onRefreshCanceled()/onLoadmoreCanceled() 回调刷新被取消的状态 -- 修复刷新状态重复回调问题 -- 添加Apache License 2.0开源协议 - -#### v1.04 -##### 新增功能 -- **第二次重构完成**,将核心逻辑拆分为RefreshProcessor、AnimProcessor、OverScrollProcessor、CoProcessor -- **优化越界策越,手势决定越界高度** -- **优化界面流畅度** -- 添加类似SwipeRefreshLayout的**悬浮刷新**功能(ProgressLayout) -- 滑到底部**自动加载更多**or回弹可选,默认为回弹 -- 允许在结束刷新之前执行一个动效:IHeadView.onFinish(animEndListener) -- 新增支持Header(Beta) -- 优化BezierLayout、SinaRefreshLayout等的显示并增加调节属性 -- 新增支持设置是否允许OverScroll - -##### fixed bugs -- 修复刷新或加载更多时,列表item没有铺满列表控件,滑动无效的问题 -- 添加主动刷新/加载更多的方法:startRefresh(),startLoadMore() -- 修复顶部和底部越界高度不一致的问题 -- 修复WebView在底部fling时不能越界的问题 -- 动画执行时间与高度相关,动效更加柔和 - - -#### v1.03 -- 扩展了更多的属性 -- 修复Fragment回收导致的空指针异常问题 -- 加入x方向判断,减小了滑动冲突 -- 优化加载更多列表显示问题 -- 可以灵活的设置是否禁用上下拉 -- 修复GridView滑动过程中出现的白条问题 -- Demo中添加轮播条展示 - -#### v1.02 -- 修复加载更多列表控件的显示问题 - -#### v1.01 -- 支持了RecyclerView、ScrollView、AbsListView、WebView -- 支持越界回弹 -- 支持个性化Header、Footer - - -License -------- - - Copyright 2016 lcodecorex - - 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. diff --git a/TODO_list.md b/TODO_list.md deleted file mode 100644 index 60426e0f0662c0c5f03877cbf77c311adb46126b..0000000000000000000000000000000000000000 --- a/TODO_list.md +++ /dev/null @@ -1,46 +0,0 @@ -# v1.07开发计划 -- 华为7.0 P9奔溃问题 -- setFloatRefresh(true)下拉刷新不可见问题 --View添加顺序的问题 **done** -- 确认item点击失效问题是否解决 -- header添加时机的空指针和不显示问题 --去掉post **done** -- 提供设置默认header、footer的方法 **done** -- 频繁设置禁止下拉和加载失效问题?(增加RefreshMode类) -- fixedHeader ontouch事件无响应,需手动设置clickable=true -- setOverScrollTopShow(false)/setOverScrollBottomShow(false)/setOverScrollRefreshShow(false) 设置无效 **done** -- 兼容nestedscroll -- 状态保持问题 -- onFinishRefresh不回调问题 -- 刷新时禁止加载更多,去加载更多底部空白没回去 -- 空白View下拉无效 -- 不停下拉导致head悬浮 -- 测试autoLoadMore - - -# v1.06开发计划 -## 存在的问题 -1. 三星、酷派手机的兼容问题 -2. 依赖太旧的问题->选择去除依赖还是更新依赖 **done** 已去除依赖 -3. 自动刷新动画生硬 todo 问题待验证 -4. 加载更多闪烁问题 **done** 做了优化 -5. layout_behavior支持问题 添加了Demo但未完成任何逻辑处理 -6. 是否要支持ViewPager回弹问题 TODO -7. 是否要支持所有的View TODO 不能滑动NormalView是因为没有焦点的原因(需手动设置),暂时不考虑支持 -8. 测试事件监听冲突问题 理论上修改后已经不存在这个问题 **done** -9. 内存泄漏问题 -> 解决ValueAnimator潜在的内存泄漏问题;WebView内存泄漏问题;**done** -10. 仿QQ视差效果 -11. 测试加载更多后不添加数据 **done** -12. 考虑是否要给Loadmore添加完成延时 -13. FixedHeader问题 -14. 多点触摸处理 -15. 控制底部下拉后或者顶部上拉后再次进入动画可以保持! -16. Refresh和OverScroll的开关耦合问题,即禁用loadmore后OverScroll不可用问题 **done** -17. 测试自动加载更多功能是否正常 **done**正常 - -## 新发现的问题 -1. beizierlayout主动调用刷新时会一片白 todo -2. BallPulseView引入了内存泄漏 **done** -3. 新的方案,怎么让scroll更平滑;计算Footer降低与TargetView显示距离是否一致:结论,一致,问题在每次滚动的距离上 **done** -4. requestLayout时提示 **improperly called by android.support.v7.widget.AppCompatTextView** -5. WebView上拉不起作用 **done** -6. 修改IBottomView中的参数错误,增加max_head_height,max_bottom_height属性;修改setWaveHeight方法为setMaxHeadHeight,增加setMaxBottomHeight方法 **done** -7. 在最顶部或最底部时fling会多次反弹 **done**(解决办法,在最顶端fling时不响应动作) diff --git a/app/build.gradle b/app/build.gradle deleted file mode 100644 index 9b0ae19ee591a257828fedaab99f9771157c198e..0000000000000000000000000000000000000000 --- a/app/build.gradle +++ /dev/null @@ -1,35 +0,0 @@ -apply plugin: 'com.android.application' - -android { - compileSdkVersion 25 - buildToolsVersion '25.0.1' - defaultConfig { - applicationId 'com.lcodecore.twinklingrefreshlayout' - minSdkVersion 14 - targetSdkVersion 22 - versionCode 1 - versionName "1.0" - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } - productFlavors { - } - lintOptions { - abortOnError false - } -} - -dependencies { - compile fileTree(include: ['*.jar'], dir: 'libs') - compile 'com.android.support:design:25.2.0' - compile project(':library') - compile 'com.android.support:appcompat-v7:25.2.0' - compile 'com.android.support:cardview-v7:25.2.0' - compile 'com.jakewharton:butterknife:7.0.1' - compile 'com.squareup.leakcanary:leakcanary-android:1.5' - compile 'com.github.moduth:blockcanary-android:1.2.1' -} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro deleted file mode 100644 index aaf9d0a0a103563d2430a854fa6719ef034f5046..0000000000000000000000000000000000000000 --- a/app/proguard-rules.pro +++ /dev/null @@ -1,17 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /Users/lcodecore/Documents/android_sdk_macosx/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml deleted file mode 100644 index 4f46c6d5d43e9d973a4ec8c89fbf42d9086de0d7..0000000000000000000000000000000000000000 --- a/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/BaseActivity.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/BaseActivity.java deleted file mode 100644 index 1334114ee63ba2d15ed01fbb21a67eafe9c8316e..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/BaseActivity.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout; - -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; -import android.view.View; - -/** - * Created by lcodecore on 16/3/2. - */ -public abstract class BaseActivity extends AppCompatActivity { - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(setInflateId()); - init(); - initAcition(); - } - - //设置布局id - public abstract int setInflateId(); - - //视图,组件,数据的初始化 - public abstract void init(); - - //事件监听 - public void initAcition(){} - - //Activity设置带返回按钮的Toolbar - public void setupBackToolbar(String title){ - setupBackToolbar(R.id.toolbar,title); - } - - public void setupBackToolbar(int toolbarId,String title){ - Toolbar mToolbar = (Toolbar) findViewById(toolbarId); - setSupportActionBar(mToolbar); - getSupportActionBar().setHomeButtonEnabled(true); //显示小箭头 - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - mToolbar.setNavigationOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - onBackPressed(); - } - }); - setTitle(title); - } -} diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/CoordinateActivity.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/CoordinateActivity.java deleted file mode 100644 index a8695951bdb48bb6b946b52788ff0bb627803810..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/CoordinateActivity.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout; - -import android.os.Bundle; -import android.os.Handler; -import android.support.design.widget.AppBarLayout; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.StaggeredGridLayoutManager; -import android.view.WindowManager; - -import com.lcodecore.tkrefreshlayout.RefreshListenerAdapter; -import com.lcodecore.tkrefreshlayout.TwinklingRefreshLayout; -import com.lcodecore.tkrefreshlayout.header.progresslayout.ProgressLayout; -import com.lcodecore.twinklingrefreshlayout.adapter.PhotoAdapter; -import com.lcodecore.twinklingrefreshlayout.beans.Photo; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by lcodecore on 2017/3/8. - */ - -public class CoordinateActivity extends AppCompatActivity { - private PhotoAdapter photoAdapter; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_coordinate); - - setupRecyclerView((RecyclerView) findViewById(R.id.recyclerview)); - - getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); - } - - private void setupRecyclerView(RecyclerView rv) { - rv.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)); - photoAdapter = new PhotoAdapter(); - rv.setAdapter(photoAdapter); - - final TwinklingRefreshLayout refreshLayout = (TwinklingRefreshLayout) findViewById(R.id.refresh); - ProgressLayout header = new ProgressLayout(this); - refreshLayout.setHeaderView(header); - refreshLayout.setFloatRefresh(true); - refreshLayout.setEnableOverScroll(false); - refreshLayout.setHeaderHeight(140); - refreshLayout.setMaxHeadHeight(240); - refreshLayout.setTargetView(rv); - - refreshCard(); - - refreshLayout.setOnRefreshListener(new RefreshListenerAdapter() { - @Override - public void onRefresh(final TwinklingRefreshLayout refreshLayout) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - refreshCard(); - refreshLayout.finishRefreshing(); - } - }, 2000); - } - - @Override - public void onLoadMore(final TwinklingRefreshLayout refreshLayout) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - loadMoreCard(); - refreshLayout.finishLoadmore(); - } - }, 2000); - } - }); - - AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.appbar_layout); - appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { - @Override - public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { - if (verticalOffset >= 0) { - refreshLayout.setEnableRefresh(true); - refreshLayout.setEnableOverScroll(false); - } else { - refreshLayout.setEnableRefresh(false); - refreshLayout.setEnableOverScroll(false); - } - } - }); - } - - void refreshCard() { - List photos = new ArrayList<>(); - photos.add(new Photo("chest nut", R.drawable.photo1)); - photos.add(new Photo("fish", R.drawable.photo2)); - photos.add(new Photo("cat", R.drawable.photo10)); - photos.add(new Photo("guitar", R.drawable.photo3)); - photos.add(new Photo("common-hazel", R.drawable.photo4)); - photos.add(new Photo("cherry", R.drawable.photo5)); - photos.add(new Photo("flower details", R.drawable.photo6)); - photos.add(new Photo("tree", R.drawable.photo7)); - photos.add(new Photo("blue berries", R.drawable.photo8)); - photos.add(new Photo("snow man", R.drawable.photo9)); - photoAdapter.setDataList(photos); - } - - void loadMoreCard() { - List photos = new ArrayList<>(); - photos.add(new Photo("chest nut", R.drawable.photo1)); - photos.add(new Photo("fish", R.drawable.photo2)); - photos.add(new Photo("cat", R.drawable.photo10)); - photos.add(new Photo("guitar", R.drawable.photo3)); - photos.add(new Photo("common-hazel", R.drawable.photo4)); - photos.add(new Photo("cherry", R.drawable.photo5)); - photos.add(new Photo("flower details", R.drawable.photo6)); - photos.add(new Photo("tree", R.drawable.photo7)); - photos.add(new Photo("blue berries", R.drawable.photo8)); - photos.add(new Photo("snow man", R.drawable.photo9)); - photoAdapter.addItems(photos); - } -} diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/FoodActivity.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/FoodActivity.java deleted file mode 100644 index dc1725ecdb0af25cf5339821d9ccb570d47eb3ac..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/FoodActivity.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout; - -import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.view.View; -import android.view.WindowManager; - -import com.lcodecore.tkrefreshlayout.header.bezierlayout.BezierLayout; -import com.lcodecore.tkrefreshlayout.TwinklingRefreshLayout; -import com.lcodecore.twinklingrefreshlayout.adapter.FoodAdapter; -import com.lcodecore.twinklingrefreshlayout.beans.Food; - -import java.util.ArrayList; -import java.util.List; - -public class FoodActivity extends AppCompatActivity { - - private FoodAdapter foodAdapter; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_food); - setupRecyclerView((RecyclerView) findViewById(R.id.recyclerview)); - - findViewById(R.id.bt_back).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - finish(); - } - }); - - getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); - } - - private void setupRecyclerView(RecyclerView rv) { - rv.setLayoutManager(new LinearLayoutManager(rv.getContext())); - foodAdapter = new FoodAdapter(); - rv.setAdapter(foodAdapter); - - final TwinklingRefreshLayout refreshLayout = (TwinklingRefreshLayout) findViewById(R.id.refresh); -// ProgressLayout headerView = new ProgressLayout(getContext()); - BezierLayout headerView = new BezierLayout(this); - refreshLayout.setHeaderView(headerView); -// refreshLayout.setFloatRefresh(false); - refreshLayout.setPureScrollModeOn(); -// refreshLayout.setEnableOverlayRefreshView(false); -// refreshLayout.setAutoLoadMore(true); - - refreshCard(); - - } - - void refreshCard() { - List foods = new ArrayList<>(); - foods.add(new Food("Preparing Salmon Steak Close Up", "BY VIKTOR HANACEK", R.drawable.food1, R.drawable.avatar0)); - foods.add(new Food("Fresh & Healthy Fitness Broccoli Pie with Basil", "BY VIKTOR HANACEK", R.drawable.food2, R.drawable.avatar1)); - foods.add(new Food("Enjoying a Tasty Burger", "BY VIKTOR HANACEK", R.drawable.food3, R.drawable.avatar2)); - foods.add(new Food("Fresh Strawberries and Blackberries in Little Bowl", "BY VIKTOR HANACEK", R.drawable.food4, R.drawable.avatar3)); - foods.add(new Food("Baked Healthy Fitness Broccoli Pie with Basil", "BY VIKTOR HANACEK", R.drawable.food5, R.drawable.avatar4)); - foodAdapter.setDataList(foods); - } - - void loadMoreCard() { - List foods = new ArrayList<>(); -// foods.add(new Food(R.drawable.food3)); -// foods.add(new Food(R.drawable.food2)); -// foods.add(new Food(R.drawable.food1)); - foodAdapter.addItems(foods); - } -} diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/MainActivity.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/MainActivity.java deleted file mode 100644 index c5f077fac221524ebbb749005065d6c3f5f53a96..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/MainActivity.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout; - -import android.content.Intent; -import android.support.v7.widget.Toolbar; -import android.view.View; - -public class MainActivity extends BaseActivity implements View.OnClickListener { - - @Override - public int setInflateId() { - return R.layout.activity_main; - } - - @Override - public void init() { - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - findViewById(R.id.bt_music).setOnClickListener(this); - findViewById(R.id.bt_food).setOnClickListener(this); - findViewById(R.id.bt_science).setOnClickListener(this); - findViewById(R.id.bt_photo).setOnClickListener(this); - findViewById(R.id.bt_story).setOnClickListener(this); - findViewById(R.id.bt_enjoy).setOnClickListener(this); - findViewById(R.id.bt_coordinate).setOnClickListener(this); - findViewById(R.id.bt_test).setOnClickListener(this); - findViewById(R.id.bt_normalView).setOnClickListener(this); - } - - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.bt_music: - startActivity(new Intent(MainActivity.this, MusicActivity.class)); - break; - case R.id.bt_food: - startActivity(new Intent(MainActivity.this, FoodActivity.class)); - break; - case R.id.bt_science: - startActivity(new Intent(MainActivity.this, ScienceActivity.class)); - break; - case R.id.bt_photo: - startActivity(new Intent(MainActivity.this, PhotoActivity.class)); - break; - case R.id.bt_story: - startActivity(new Intent(MainActivity.this, StoryActivity.class)); - break; - case R.id.bt_enjoy: - startActivity(new Intent(MainActivity.this, WebActivity.class)); - break; - case R.id.bt_coordinate: - startActivity(new Intent(MainActivity.this,CoordinateActivity.class)); - break; - case R.id.bt_normalView: - startActivity(new Intent(MainActivity.this,NormalViewActivity.class)); - break; - case R.id.bt_test: - startActivity(new Intent(MainActivity.this,TestActivity.class)); - break; - } - } -} diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/MusicActivity.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/MusicActivity.java deleted file mode 100644 index 474ad521972601218fc29c005b9c6761898f65f9..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/MusicActivity.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout; - -import android.os.Bundle; -import android.os.Handler; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; -import android.view.View; -import android.widget.AdapterView; -import android.widget.ListView; - -import com.lcodecore.tkrefreshlayout.RefreshListenerAdapter; -import com.lcodecore.tkrefreshlayout.TwinklingRefreshLayout; -import com.lcodecore.tkrefreshlayout.header.progresslayout.ProgressLayout; -import com.lcodecore.twinklingrefreshlayout.adapter.MusicAdapter; -import com.lcodecore.twinklingrefreshlayout.utils.ToastUtil; - -//TODO 有FixedHeader的界面fling有问题 -public class MusicActivity extends AppCompatActivity { - - private MusicAdapter adapter; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_music); - - Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar); - mToolbar.setNavigationIcon(R.drawable.back); - mToolbar.setNavigationOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - finish(); - } - }); - - setupListView((ListView) findViewById(R.id.listView)); - } - - private void setupListView(ListView listView) { - TwinklingRefreshLayout refreshLayout = (TwinklingRefreshLayout) findViewById(R.id.refresh); - ProgressLayout headerView = new ProgressLayout(this); - refreshLayout.setHeaderView(headerView); - View exHeader = View.inflate(this, R.layout.header_music, null); - refreshLayout.addFixedExHeader(exHeader); - refreshLayout.setOverScrollRefreshShow(false); -// refreshLayout.setFloatRefresh(true); - adapter = new MusicAdapter(); - listView.setAdapter(adapter); - adapter.refreshCard(); - - exHeader.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - ToastUtil.show("fixed header clicked!"); - } - }); - - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, int i, long l) { - ToastUtil.show("item clicked!"); - } - }); - - refreshLayout.setOnRefreshListener(new RefreshListenerAdapter() { - @Override - public void onRefresh(final TwinklingRefreshLayout refreshLayout) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - adapter.refreshCard(); - refreshLayout.finishRefreshing(); - } - }, 2000); - } - - @Override - public void onLoadMore(final TwinklingRefreshLayout refreshLayout) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - adapter.loadMoreCard(); - refreshLayout.finishLoadmore(); - } - }, 2000); - } - }); - } -} diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/NestedLayoutActivity.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/NestedLayoutActivity.java deleted file mode 100644 index 9fe866865cc686f1801c8a524b47b4634a41395e..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/NestedLayoutActivity.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout; - -import android.os.Bundle; -import android.os.Handler; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.StaggeredGridLayoutManager; -import android.view.View; -import android.view.WindowManager; - -import com.lcodecore.tkrefreshlayout.RefreshListenerAdapter; -import com.lcodecore.tkrefreshlayout.TwinklingRefreshLayout; -import com.lcodecore.tkrefreshlayout.header.bezierlayout.BezierLayout; -import com.lcodecore.twinklingrefreshlayout.adapter.PhotoAdapter; -import com.lcodecore.twinklingrefreshlayout.beans.Photo; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by lcodecore on 2017/3/4. - */ - -public class NestedLayoutActivity extends AppCompatActivity { - private PhotoAdapter photoAdapter; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_nested_layout); - - setupRecyclerView((RecyclerView) findViewById(R.id.recyclerview)); - - findViewById(R.id.bt_back).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - finish(); - } - }); - - getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); - } - - private void setupRecyclerView(RecyclerView rv) { - rv.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)); - photoAdapter = new PhotoAdapter(); - rv.setAdapter(photoAdapter); - - final TwinklingRefreshLayout refreshLayout = (TwinklingRefreshLayout) findViewById(R.id.refresh); -// ProgressLayout headerView = new ProgressLayout(this); - BezierLayout headerView = new BezierLayout(this); - refreshLayout.setHeaderView(headerView); - refreshLayout.setMaxHeadHeight(140); -// refreshLayout.setFloatRefresh(true); -// refreshLayout.setPureScrollModeOn(true); - refreshLayout.setOverScrollBottomShow(false); - refreshLayout.setTargetView(rv); -// refreshLayout.setAutoLoadMore(true); - -// addHeader(); - refreshCard(); - - - refreshLayout.setOnRefreshListener(new RefreshListenerAdapter() { - @Override - public void onRefresh(final TwinklingRefreshLayout refreshLayout) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - refreshCard(); - refreshLayout.finishRefreshing(); - } - }, 2000); - } - - @Override - public void onLoadMore(final TwinklingRefreshLayout refreshLayout) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - loadMoreCard(); - refreshLayout.finishLoadmore(); - } - }, 2000); - } - }); - -// refreshLayout.startRefresh(); - } - - void refreshCard() { - List photos = new ArrayList<>(); -// foods.add(new Food("Preparing Salmon Steak Close Up","BY VIKTOR HANACEK",R.drawable.food1,R.drawable.avatar0)); -// foods.add(new Food("Fresh & Healthy Fitness Broccoli Pie with Basil","BY VIKTOR HANACEK",R.drawable.food2,R.drawable.avatar1)); -// foods.add(new Food("Enjoying a Tasty Burger","BY VIKTOR HANACEK",R.drawable.food3,R.drawable.avatar2)); -// foods.add(new Food("Fresh Strawberries and Blackberries in Little Bowl","BY VIKTOR HANACEK",R.drawable.food4,R.drawable.avatar3)); -// foods.add(new Food("Baked Healthy Fitness Broccoli Pie with Basil","BY VIKTOR HANACEK",R.drawable.food5,R.drawable.avatar4)); - photos.add(new Photo("chest nut", R.drawable.photo1)); - photos.add(new Photo("fish", R.drawable.photo2)); - photos.add(new Photo("cat", R.drawable.photo10)); - photos.add(new Photo("guitar", R.drawable.photo3)); - photos.add(new Photo("common-hazel", R.drawable.photo4)); - photos.add(new Photo("cherry", R.drawable.photo5)); - photos.add(new Photo("flower details", R.drawable.photo6)); - photos.add(new Photo("tree", R.drawable.photo7)); - photos.add(new Photo("blue berries", R.drawable.photo8)); - photos.add(new Photo("snow man", R.drawable.photo9)); - photoAdapter.setDataList(photos); - } - - void loadMoreCard() { - List photos = new ArrayList<>(); - photos.add(new Photo("chest nut", R.drawable.photo1)); - photos.add(new Photo("fish", R.drawable.photo2)); - photos.add(new Photo("cat", R.drawable.photo10)); - photos.add(new Photo("guitar", R.drawable.photo3)); - photos.add(new Photo("common-hazel", R.drawable.photo4)); - photos.add(new Photo("cherry", R.drawable.photo5)); - photos.add(new Photo("flower details", R.drawable.photo6)); - photos.add(new Photo("tree", R.drawable.photo7)); - photos.add(new Photo("blue berries", R.drawable.photo8)); - photos.add(new Photo("snow man", R.drawable.photo9)); - //chest nut cat and fish guitar common-hazel cherry flower details tree - //blue berries snow man -// foods.add(new Food(R.drawable.food3)); -// foods.add(new Food(R.drawable.food2)); -// foods.add(new Food(R.drawable.food1)); - photoAdapter.addItems(photos); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/NormalViewActivity.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/NormalViewActivity.java deleted file mode 100644 index 7c5ea4d7aca9f2ce71f975bc0f0403d8e8fc3bb3..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/NormalViewActivity.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout; - -import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; - -/** - * Created by lcodecore on 2017/4/6. - */ - -public class NormalViewActivity extends AppCompatActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_normalview); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/PhotoActivity.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/PhotoActivity.java deleted file mode 100644 index 75c465324af0e98b0aa992e410a77dab195b3ec1..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/PhotoActivity.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout; - -import android.os.Handler; -import android.support.v7.app.AppCompatActivity; -import android.os.Bundle; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.StaggeredGridLayoutManager; -import android.view.View; -import android.view.WindowManager; - -import com.lcodecore.tkrefreshlayout.header.bezierlayout.BezierLayout; -import com.lcodecore.tkrefreshlayout.RefreshListenerAdapter; -import com.lcodecore.tkrefreshlayout.TwinklingRefreshLayout; -import com.lcodecore.twinklingrefreshlayout.adapter.PhotoAdapter; -import com.lcodecore.twinklingrefreshlayout.beans.Photo; - -import java.util.ArrayList; -import java.util.List; - -public class PhotoActivity extends AppCompatActivity { - private PhotoAdapter photoAdapter; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_photo); - - setupRecyclerView((RecyclerView) findViewById(R.id.recyclerview)); - - findViewById(R.id.bt_back).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - finish(); - } - }); - - getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); - } - - private void setupRecyclerView(RecyclerView rv) { - rv.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)); - photoAdapter = new PhotoAdapter(); - rv.setAdapter(photoAdapter); - - final TwinklingRefreshLayout refreshLayout = (TwinklingRefreshLayout) findViewById(R.id.refresh); -// ProgressLayout headerView = new ProgressLayout(this); - BezierLayout headerView = new BezierLayout(this); - refreshLayout.setHeaderView(headerView); - refreshLayout.setMaxHeadHeight(140); -// refreshLayout.setFloatRefresh(true); -// refreshLayout.setPureScrollModeOn(true); - refreshLayout.setOverScrollBottomShow(false); -// refreshLayout.setAutoLoadMore(true); - -// addHeader(); - refreshCard(); - findViewById(R.id.ib_refresh).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - refreshLayout.startRefresh(); - } - }); - - refreshLayout.setOnRefreshListener(new RefreshListenerAdapter() { - @Override - public void onRefresh(final TwinklingRefreshLayout refreshLayout) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - refreshCard(); - refreshLayout.finishRefreshing(); - } - }, 2000); - } - - @Override - public void onLoadMore(final TwinklingRefreshLayout refreshLayout) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - loadMoreCard(); - refreshLayout.finishLoadmore(); - } - }, 2000); - } - }); - -// refreshLayout.startRefresh(); - } - - void refreshCard() { - List photos = new ArrayList<>(); -// foods.add(new Food("Preparing Salmon Steak Close Up","BY VIKTOR HANACEK",R.drawable.food1,R.drawable.avatar0)); -// foods.add(new Food("Fresh & Healthy Fitness Broccoli Pie with Basil","BY VIKTOR HANACEK",R.drawable.food2,R.drawable.avatar1)); -// foods.add(new Food("Enjoying a Tasty Burger","BY VIKTOR HANACEK",R.drawable.food3,R.drawable.avatar2)); -// foods.add(new Food("Fresh Strawberries and Blackberries in Little Bowl","BY VIKTOR HANACEK",R.drawable.food4,R.drawable.avatar3)); -// foods.add(new Food("Baked Healthy Fitness Broccoli Pie with Basil","BY VIKTOR HANACEK",R.drawable.food5,R.drawable.avatar4)); - photos.add(new Photo("chest nut", R.drawable.photo1)); - photos.add(new Photo("fish", R.drawable.photo2)); - photos.add(new Photo("cat", R.drawable.photo10)); - photos.add(new Photo("guitar", R.drawable.photo3)); - photos.add(new Photo("common-hazel", R.drawable.photo4)); - photos.add(new Photo("cherry", R.drawable.photo5)); - photos.add(new Photo("flower details", R.drawable.photo6)); - photos.add(new Photo("tree", R.drawable.photo7)); - photos.add(new Photo("blue berries", R.drawable.photo8)); - photos.add(new Photo("snow man", R.drawable.photo9)); - photoAdapter.setDataList(photos); - } - - void loadMoreCard() { - List photos = new ArrayList<>(); - photos.add(new Photo("chest nut", R.drawable.photo1)); - photos.add(new Photo("fish", R.drawable.photo2)); - photos.add(new Photo("cat", R.drawable.photo10)); - photos.add(new Photo("guitar", R.drawable.photo3)); - photos.add(new Photo("common-hazel", R.drawable.photo4)); - photos.add(new Photo("cherry", R.drawable.photo5)); - photos.add(new Photo("flower details", R.drawable.photo6)); - photos.add(new Photo("tree", R.drawable.photo7)); - photos.add(new Photo("blue berries", R.drawable.photo8)); - photos.add(new Photo("snow man", R.drawable.photo9)); - //chest nut cat and fish guitar common-hazel cherry flower details tree - //blue berries snow man -// foods.add(new Food(R.drawable.food3)); -// foods.add(new Food(R.drawable.food2)); -// foods.add(new Food(R.drawable.food1)); - photoAdapter.addItems(photos); - } -} diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/ScienceActivity.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/ScienceActivity.java deleted file mode 100644 index 447a63e9d9d2b54679181c603516e99067844d37..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/ScienceActivity.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout; - -import android.os.Bundle; -import android.os.Handler; -import android.support.v7.app.AppCompatActivity; -import android.view.View; -import android.widget.AdapterView; -import android.widget.GridView; - -import com.lcodecore.tkrefreshlayout.footer.LoadingView; -import com.lcodecore.tkrefreshlayout.RefreshListenerAdapter; -import com.lcodecore.tkrefreshlayout.TwinklingRefreshLayout; -import com.lcodecore.tkrefreshlayout.header.SinaRefreshView; -import com.lcodecore.twinklingrefreshlayout.adapter.ScienceAdapter; -import com.lcodecore.twinklingrefreshlayout.utils.ToastUtil; - -public class ScienceActivity extends AppCompatActivity { - - private ScienceAdapter adapter; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_science); - setupGridView((GridView) findViewById(R.id.gridView)); - - findViewById(R.id.bt_back).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - finish(); - } - }); - } - - private void setupGridView(GridView gridView) { - final TwinklingRefreshLayout refreshLayout = (TwinklingRefreshLayout) findViewById(R.id.refresh); - SinaRefreshView headerView = new SinaRefreshView(this); - headerView.setArrowResource(R.drawable.arrow); - headerView.setTextColor(0xff745D5C); -// TextHeaderView headerView = (TextHeaderView) View.inflate(this,R.layout.header_tv,null); - refreshLayout.setHeaderView(headerView); - - LoadingView loadingView = new LoadingView(this); - refreshLayout.setBottomView(loadingView); - - adapter = new ScienceAdapter(); - gridView.setAdapter(adapter); - adapter.refreshCard(); - - gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, int i, long l) { - ToastUtil.show("item clicked!"); - } - }); - - refreshLayout.setOnRefreshListener(new RefreshListenerAdapter() { - @Override - public void onRefresh(final TwinklingRefreshLayout refreshLayout) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - adapter.refreshCard(); - refreshLayout.finishRefreshing(); - } - }, 2000); - } - - @Override - public void onLoadMore(final TwinklingRefreshLayout refreshLayout) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - adapter.loadMoreCard(); - refreshLayout.finishLoadmore(); - } - }, 2000); - } - }); - } -} diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/StoryActivity.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/StoryActivity.java deleted file mode 100644 index c29227d415984e6403fa3c9db3cf41ed69624767..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/StoryActivity.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout; - -import android.os.Handler; -import android.support.v7.app.AppCompatActivity; -import android.os.Bundle; - -import com.lcodecore.tkrefreshlayout.RefreshListenerAdapter; -import com.lcodecore.tkrefreshlayout.TwinklingRefreshLayout; -import com.lcodecore.tkrefreshlayout.footer.LoadingView; -import com.lcodecore.tkrefreshlayout.header.progresslayout.ProgressLayout; - -public class StoryActivity extends AppCompatActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_story); - - final TwinklingRefreshLayout refreshLayout = (TwinklingRefreshLayout) findViewById(R.id.refresh); -// ProgressLayout header = new ProgressLayout(this); -// refreshLayout.setHeaderView(header); -// refreshLayout.setFloatRefresh(true); - refreshLayout.setOverScrollRefreshShow(false); - refreshLayout.setOnRefreshListener(new RefreshListenerAdapter() { - @Override - public void onRefresh(TwinklingRefreshLayout refreshLayout1) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - refreshLayout.finishRefreshing(); - } - }, 4000); - } - - @Override - public void onLoadMore(final TwinklingRefreshLayout refreshLayout1) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - refreshLayout.finishLoadmore(); - } - }, 4000); - } - }); - } -} diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/TestActivity.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/TestActivity.java deleted file mode 100644 index e31fdffe8d2ff82b82643aa0777cc39a5523531f..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/TestActivity.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout; - -import android.os.Bundle; -import android.os.Handler; -import android.support.v7.app.AppCompatActivity; -import android.view.View; -import android.widget.AdapterView; -import android.widget.Button; -import android.widget.GridView; - -import com.lcodecore.tkrefreshlayout.RefreshListenerAdapter; -import com.lcodecore.tkrefreshlayout.TwinklingRefreshLayout; -import com.lcodecore.tkrefreshlayout.footer.LoadingView; -import com.lcodecore.tkrefreshlayout.header.SinaRefreshView; -import com.lcodecore.twinklingrefreshlayout.adapter.ScienceAdapter; -import com.lcodecore.twinklingrefreshlayout.utils.ToastUtil; - -/** - * Created by lcodecore on 2017/3/27. - */ - -public class TestActivity extends AppCompatActivity implements View.OnClickListener { - - private ScienceAdapter adapter; - private TwinklingRefreshLayout refreshLayout; - - private TestButton toggle_enableLoadmore, toggle_pureScrollMode_on, toggle_overScrollTopShow, toggle_osFooterShow, toggle_enableOverScroll, toggle_enableKeepIView, - toggle_showRefreshingWhenOverScroll, toggle_showLoadingWhenOverScroll, toggle_floatRefresh, toggle_autoLoadMore,toggle_enableRefresh; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_test); - setupGridView((GridView) findViewById(R.id.gridView)); - - findViewById(R.id.bt_back).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - finish(); - } - }); - - toggle_enableLoadmore = new TestButton(R.id.toggle_enableLoadmore, "enableLoadmore", true); - toggle_pureScrollMode_on = new TestButton(R.id.toggle_pureScrollMode_on, "pureScrollMode_on", false); - toggle_overScrollTopShow = new TestButton(R.id.toggle_overScrollTopShow, "overScrollTopShow", true); - toggle_osFooterShow = new TestButton(R.id.toggle_osFooterShow, "osFooterShow", true); - toggle_enableOverScroll = new TestButton(R.id.toggle_enableOverScroll, "enableOverScroll", true); - toggle_enableKeepIView = new TestButton(R.id.toggle_enableKeepIView, "enableKeepIView", true); - toggle_showRefreshingWhenOverScroll = new TestButton(R.id.toggle_showRefreshingWhenOverScroll, "showRefreshingWhenOS", true); - toggle_showLoadingWhenOverScroll = new TestButton(R.id.toggle_showLoadingWhenOverScroll, "showLoadingWhenOS", true); - toggle_floatRefresh = new TestButton(R.id.toggle_floatRefresh, "floatRefresh", false); - toggle_autoLoadMore = new TestButton(R.id.toggle_autoLoadMore, "autoLoadMore", false); - toggle_enableRefresh = new TestButton(R.id.toggle_enableRefresh,"enableRefresh",true); - } - - private void setupGridView(GridView gridView) { - refreshLayout = (TwinklingRefreshLayout) findViewById(R.id.refresh); - SinaRefreshView headerView = new SinaRefreshView(this); - headerView.setArrowResource(R.drawable.arrow); - headerView.setTextColor(0xff745D5C); -// TextHeaderView headerView = (TextHeaderView) View.inflate(this,R.layout.header_tv,null); - refreshLayout.setHeaderView(headerView); - - LoadingView loadingView = new LoadingView(this); - refreshLayout.setBottomView(loadingView); - - adapter = new ScienceAdapter(); - gridView.setAdapter(adapter); - adapter.refreshCard(); - - gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, int i, long l) { - ToastUtil.show("item clicked!"); - } - }); - - refreshLayout.setOnRefreshListener(new RefreshListenerAdapter() { - @Override - public void onRefresh(final TwinklingRefreshLayout refreshLayout) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - adapter.refreshCard(); - refreshLayout.finishRefreshing(); - } - }, 2000); - } - - @Override - public void onLoadMore(final TwinklingRefreshLayout refreshLayout) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - adapter.loadMoreCard(); - refreshLayout.finishLoadmore(); - } - }, 2000); - } - }); - } - - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.toggle_enableLoadmore: - toggle_enableLoadmore.toggle(); - refreshLayout.setEnableLoadmore(toggle_enableLoadmore.flag); - break; - case R.id.toggle_pureScrollMode_on: - toggle_pureScrollMode_on.toggle(); - refreshLayout.setPureScrollModeOn(); - break; - case R.id.toggle_overScrollTopShow: - toggle_overScrollTopShow.toggle(); - refreshLayout.setOverScrollTopShow(toggle_overScrollTopShow.flag); - break; - case R.id.toggle_osFooterShow: - toggle_osFooterShow.toggle(); - refreshLayout.setOverScrollBottomShow(toggle_osFooterShow.flag); - break; - case R.id.toggle_enableOverScroll: - toggle_enableOverScroll.toggle(); - refreshLayout.setEnableOverScroll(toggle_enableOverScroll.flag); - break; - case R.id.toggle_enableKeepIView: - toggle_enableKeepIView.toggle(); - refreshLayout.setEnableKeepIView(toggle_enableKeepIView.flag); - break; - case R.id.toggle_showRefreshingWhenOverScroll: - toggle_showRefreshingWhenOverScroll.toggle(); - refreshLayout.showRefreshingWhenOverScroll(toggle_showRefreshingWhenOverScroll.flag); - break; - case R.id.toggle_showLoadingWhenOverScroll: - toggle_showLoadingWhenOverScroll.toggle(); - refreshLayout.showLoadingWhenOverScroll(toggle_showLoadingWhenOverScroll.flag); - break; - case R.id.toggle_floatRefresh: - toggle_floatRefresh.toggle(); - refreshLayout.setFloatRefresh(toggle_floatRefresh.flag); - break; - case R.id.toggle_autoLoadMore: - toggle_autoLoadMore.toggle(); - refreshLayout.setAutoLoadMore(toggle_autoLoadMore.flag); - break; - case R.id.toggle_enableRefresh: - toggle_enableRefresh.toggle(); - refreshLayout.setEnableRefresh(toggle_enableRefresh.flag); - } - } - - class TestButton { - private Button button; - private boolean flag; - private String text; - - public TestButton(int id, String text, boolean flag) { - button = (Button) findViewById(id); - this.text = text; - this.flag = flag; - button.setOnClickListener(TestActivity.this); - button.setText(text + "->" + flag); - } - - public void toggle() { - flag = !flag; - button.setText(text + "->" + flag); - } - } -} diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/TextHeaderView.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/TextHeaderView.java deleted file mode 100644 index 7632931563b50eea6307b5564d2183946bba30ef..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/TextHeaderView.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.View; -import android.widget.TextView; - -import com.lcodecore.tkrefreshlayout.IHeaderView; -import com.lcodecore.tkrefreshlayout.OnAnimEndListener; - -/** - * Created by lcodecore on 2016/10/1. - */ - -public class TextHeaderView extends TextView implements IHeaderView { - - - public TextHeaderView(Context context) { - super(context); - } - - public TextHeaderView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public TextHeaderView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - @Override - public View getView() { - return this; - } - - @Override - public void onPullingDown(float fraction, float maxHeadHeight, float headHeight) { - if (fraction < 1f) setText("下拉刷新"); - if (fraction > 1f) setText("释放刷新"); - } - - @Override - public void onPullReleasing(float fraction, float maxHeadHeight, float headHeight) { - if (fraction < 1f) setText("下拉刷新"); - } - - @Override - public void startAnim(float maxHeadHeight, float headHeight) { - setText("正在刷新"); - } - - @Override - public void onFinish(OnAnimEndListener listener) { - listener.onAnimEnd(); - } - - @Override - public void reset() { - setText("下拉刷新"); - } -} diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/TkApplication.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/TkApplication.java deleted file mode 100644 index 0f81ebfc1fa305b8f341d2fbda806ccec83f79c8..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/TkApplication.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout; - -import android.app.Application; -import android.content.Context; -import android.os.StrictMode; - -import com.github.moduth.blockcanary.BlockCanary; -import com.github.moduth.blockcanary.BlockCanaryContext; -import com.lcodecore.tkrefreshlayout.TwinklingRefreshLayout; -import com.lcodecore.tkrefreshlayout.footer.BallPulseView; -import com.lcodecore.tkrefreshlayout.header.SinaRefreshView; -import com.squareup.leakcanary.LeakCanary; - -import static android.os.Build.VERSION.SDK_INT; -import static android.os.Build.VERSION_CODES.GINGERBREAD; - -/** - * Created by lcodecore on 2016/12/4. - */ - -public class TkApplication extends Application { - - public static Context appContext; - - @Override - public void onCreate() { - super.onCreate(); - - appContext = this; - - if (LeakCanary.isInAnalyzerProcess(this)) { - return; - } - enabledStrictMode(); - LeakCanary.install(this); - - StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectAll().penaltyDeath().build()); - StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyDeath().build()); - - BlockCanary.install(this,new AppBlockCanaryContext()).start(); - -// TwinklingRefreshLayout.setDefaultHeader(SinaRefreshView.class.getName()); -// TwinklingRefreshLayout.setDefaultFooter(BallPulseView.class.getName()); - } - - private class AppBlockCanaryContext extends BlockCanaryContext{} - - private void enabledStrictMode() { - if (SDK_INT >= GINGERBREAD) { - StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() // - .detectAll() // - .penaltyLog() // - .penaltyDeath() // - .build()); - } - } -} diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/WebActivity.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/WebActivity.java deleted file mode 100644 index 293caa871df54854af47f49d63100a9e67e168fa..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/WebActivity.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout; - -import android.annotation.SuppressLint; -import android.os.Handler; -import android.support.v7.app.AppCompatActivity; -import android.os.Bundle; -import android.view.ViewGroup; -import android.view.ViewParent; -import android.webkit.WebView; - -import com.lcodecore.tkrefreshlayout.header.progresslayout.ProgressLayout; -import com.lcodecore.tkrefreshlayout.RefreshListenerAdapter; -import com.lcodecore.tkrefreshlayout.TwinklingRefreshLayout; - -public class WebActivity extends AppCompatActivity { - - private WebView mWebView; - - @SuppressLint("SetJavaScriptEnabled") - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_web); - - TwinklingRefreshLayout refreshLayout = (TwinklingRefreshLayout) findViewById(R.id.refreshLayout); - ProgressLayout header = new ProgressLayout(this); - refreshLayout.setHeaderView(header); - refreshLayout.setFloatRefresh(true); - refreshLayout.setOverScrollRefreshShow(false); - refreshLayout.setHeaderHeight(140); - refreshLayout.setMaxHeadHeight(240); - refreshLayout.setOverScrollHeight(200); - refreshLayout.setEnableLoadmore(false); - header.setColorSchemeResources(R.color.Blue, R.color.Orange, R.color.Yellow, R.color.Green); -// header.setColorSchemeColors(0xff4674e7,0xff0ba62c); - - mWebView = (WebView) findViewById(R.id.webView); - mWebView.getSettings().setJavaScriptEnabled(true); - mWebView.loadUrl("https://dribbble.com/shots"); - - refreshLayout.startRefresh(); - refreshLayout.setOnRefreshListener(new RefreshListenerAdapter() { - @Override - public void onRefresh(final TwinklingRefreshLayout refreshLayout) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - refreshLayout.finishRefreshing(); - } - }, 4000); - } - }); - } - - @Override - protected void onDestroy() { - destroyWebView(); - super.onDestroy(); - } - - /** - * 解决WebView持有mContext导致的内存泄漏问题 - */ - private void destroyWebView() { - if (mWebView != null) { - ViewParent parent = mWebView.getParent(); - if (parent != null) ((ViewGroup) parent).removeView(mWebView); - mWebView.stopLoading(); - mWebView.getSettings().setJavaScriptEnabled(false); - mWebView.clearHistory(); - mWebView.clearView(); - mWebView.removeAllViews(); - try { - mWebView.destroy(); - } catch (Throwable e) { - } - } - } -} diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/FoodAdapter.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/FoodAdapter.java deleted file mode 100644 index 5d071613abc23a4d5c23a7d62fb6d476976f6f46..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/FoodAdapter.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout.adapter; - -import android.content.Context; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import com.lcodecore.twinklingrefreshlayout.R; -import com.lcodecore.twinklingrefreshlayout.adapter.base.BaseRecyclerAdapter; -import com.lcodecore.twinklingrefreshlayout.adapter.base.CommonHolder; -import com.lcodecore.twinklingrefreshlayout.beans.Food; -import com.lcodecore.twinklingrefreshlayout.utils.ToastUtil; -import com.lcodecore.twinklingrefreshlayout.views.CircleImageView; - -import butterknife.Bind; - -/** - * Created by lcodecore on 2016/12/6. - */ - -public class FoodAdapter extends BaseRecyclerAdapter { - @Override - public CommonHolder setViewHolder(ViewGroup parent) { - return new CardHolder(parent.getContext(), parent); - } - - class CardHolder extends CommonHolder { - - @Bind(R.id.avatar) - CircleImageView avatar; - - @Bind(R.id.tv_food) - TextView tv_food; - - @Bind(R.id.tv_info) - TextView tv_info; - - @Bind(R.id.iv_food) - ImageView iv_food; - - public CardHolder(Context context, ViewGroup root) { - super(context, root, R.layout.item_food); - } - - @Override - public void bindData(Food food) { - avatar.setImageResource(food.avatar_id); - iv_food.setImageResource(food.imageSrc); - tv_food.setText(food.title); - tv_info.setText(food.info); - - itemView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - ToastUtil.show("item clicked!"); - } - }); - } - } -} diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/LoopViewPagerAdapter.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/LoopViewPagerAdapter.java deleted file mode 100644 index a92a57e3bdacfc94a9377fbe1c222d0c3ebfffa3..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/LoopViewPagerAdapter.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout.adapter; - -import android.content.res.Resources; -import android.graphics.drawable.Drawable; -import android.os.Build; -import android.support.v4.view.ViewPager; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.TextView; - -import com.lcodecore.twinklingrefreshlayout.R; -import com.lcodecore.twinklingrefreshlayout.adapter.base.BaseLoopPagerAdapter; -import com.lcodecore.twinklingrefreshlayout.beans.Card; - -import java.util.ArrayList; -import java.util.List; - -public class LoopViewPagerAdapter extends BaseLoopPagerAdapter { - - private final List mHeroes; - - private final ViewGroup mIndicators; - - private int mLastPosition; - - public LoopViewPagerAdapter(ViewPager viewPager, ViewGroup indicators) { - super(viewPager); - mIndicators = indicators; - mHeroes = new ArrayList<>(); - } - - public void setList(List heroes) { - mHeroes.clear(); - mHeroes.addAll(heroes); - initIndicators(); - notifyDataSetChanged(); - } - - /** - * oh shit! An indicator view is badly needed! - * this shit have no animation at all. - */ - private void initIndicators() { - if (mIndicators.getChildCount() != mHeroes.size() && mHeroes.size() > 1) { - mIndicators.removeAllViews(); - Resources res = mIndicators.getResources(); - int size = res.getDimensionPixelOffset(R.dimen.indicator_size); - int margin = res.getDimensionPixelOffset(R.dimen.indicator_margin); - for (int i = 0; i < getPagerCount(); i++) { - ImageView indicator = new ImageView(mIndicators.getContext()); - indicator.setAlpha(180); - LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(size, size); - lp.setMargins(margin, 0, 0, 0); - lp.gravity = Gravity.CENTER; - indicator.setLayoutParams(lp); - Drawable drawable = res.getDrawable(R.drawable.selector_indicator); - indicator.setImageDrawable(drawable); - mIndicators.addView(indicator); - } - } - } - - @Override - public int getPagerCount() { - return mHeroes.size(); - } - - @Override - public Card getItem(int position) { - return mHeroes.get(position); - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - ViewHolder holder = null; - if (convertView == null) { - convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_viewpager, parent, false); - holder = new ViewHolder(); - holder.ivBanner = (ImageView) convertView.findViewById(R.id.ivBanner); - holder.tvName = (TextView) convertView.findViewById(R.id.tvName); - convertView.setTag(holder); - } else { - holder = (ViewHolder) convertView.getTag(); - } - int picSrcId = mHeroes.get(position).imageSrc; - holder.tvName.setText(mHeroes.get(position).info); - holder.ivBanner.setImageResource(picSrcId); - return convertView; - } - - @Override - public void onPageItemSelected(int position) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - mIndicators.getChildAt(mLastPosition).setActivated(false); - mIndicators.getChildAt(position).setActivated(true); - } - mLastPosition = position; - } - - public static class ViewHolder { - ImageView ivBanner; - TextView tvName; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/MusicAdapter.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/MusicAdapter.java deleted file mode 100644 index dae6bb54c1e09d3fc0eea0171ca6e26745369ee2..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/MusicAdapter.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout.adapter; - -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.ImageView; -import android.widget.TextView; - -import com.lcodecore.twinklingrefreshlayout.R; -import com.lcodecore.twinklingrefreshlayout.beans.Card; -import com.lcodecore.twinklingrefreshlayout.views.CircleImageView; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by lcodecore on 2016/12/6. - */ - -public class MusicAdapter extends BaseAdapter { - - private List cards = new ArrayList<>(); - - @Override - public int getCount() { - return cards.size(); - } - - @Override - public Card getItem(int position) { - return cards.get(position); - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - final MusicAdapter.ViewHolder holder; - if (convertView == null) { - convertView = View.inflate(parent.getContext(), R.layout.item_music, null); - holder = new MusicAdapter.ViewHolder(convertView); - convertView.setTag(holder); - } else { - holder = (MusicAdapter.ViewHolder) convertView.getTag(); - } - - holder.tv_title.setText(cards.get(position).title); - holder.tv_subTitle.setText(cards.get(position).info); - holder.mImageView.setImageResource(cards.get(position).imageSrc); - - return convertView; - } - - class ViewHolder { - final CircleImageView mImageView; - final TextView tv_title; - final TextView tv_subTitle; - - ViewHolder(View view) { - mImageView = (CircleImageView) view.findViewById(R.id.avatar); - tv_title = (TextView) view.findViewById(R.id.tv_song); - tv_subTitle = (TextView) view.findViewById(R.id.tv_singer); - } - } - - public void refreshCard(){ - cards.clear(); - cards.add(new Card("What Do You Mean?", "Justin Bieber", R.drawable.avatar1)); - cards.add(new Card("Secret Garden", "Song From A Secret Garden", R.drawable.avatar2)); - cards.add(new Card("Moves Like Jagger","Maroon 5",R.drawable.avatar3)); - cards.add(new Card("Work Hard, Play Hard","Wiz Khalifa",R.drawable.avatar4)); - cards.add(new Card("See You Again","Charlie Puth",R.drawable.avatar7)); - cards.add(new Card("Love The Way You Lie (Part Ii)","Rihanna",R.drawable.avatar5)); - cards.add(new Card("Call Me Maybe","Carly Rae Jepsen",R.drawable.avatar9)); - cards.add(new Card("Let It Go","Demi Lovato",R.drawable.avatar8)); - notifyDataSetChanged(); - } - - public void loadMoreCard(){ - cards.add(new Card("You Raise Me Up","Westlife",R.drawable.avatar6)); - cards.add(new Card("See You Again","Charlie Puth",R.drawable.avatar7)); - cards.add(new Card("Love Story","Taylor Swift",R.drawable.avatar0)); - cards.add(new Card("Let It Go","Demi Lovato",R.drawable.avatar8)); - cards.add(new Card("Secret Garden", "Song From A Secret Garden", R.drawable.avatar2)); - cards.add(new Card("Call Me Maybe","Carly Rae Jepsen",R.drawable.avatar9)); - notifyDataSetChanged(); - } - - public void addCard() { - cards.add(new Card("What Do You Mean?", "Justin Bieber", R.drawable.avatar1)); - cards.add(new Card("Secret Garden", "Song From A Secret Garden", R.drawable.avatar2)); - cards.add(new Card("Moves Like Jagger","Maroon 5",R.drawable.avatar3)); - cards.add(new Card("Work Hard, Play Hard","Wiz Khalifa",R.drawable.avatar4)); - cards.add(new Card("Love The Way You Lie (Part Ii)","Rihanna",R.drawable.avatar5)); - cards.add(new Card("You Raise Me Up","Westlife",R.drawable.avatar6)); - cards.add(new Card("See You Again","Charlie Puth",R.drawable.avatar7)); - cards.add(new Card("Let It Go","Demi Lovato",R.drawable.avatar8)); - cards.add(new Card("Call Me Maybe","Carly Rae Jepsen",R.drawable.avatar9)); - //Love Story Taylor Swift - } -} \ No newline at end of file diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/PhotoAdapter.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/PhotoAdapter.java deleted file mode 100644 index 48129a28d9aa5a5497bcb779af0457ca432ca9a0..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/PhotoAdapter.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout.adapter; - -import android.content.Context; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import com.lcodecore.twinklingrefreshlayout.R; -import com.lcodecore.twinklingrefreshlayout.adapter.base.BaseRecyclerAdapter; -import com.lcodecore.twinklingrefreshlayout.adapter.base.CommonHolder; -import com.lcodecore.twinklingrefreshlayout.beans.Photo; -import com.lcodecore.twinklingrefreshlayout.utils.ToastUtil; - -import butterknife.Bind; - -/** - * Created by lcodecore on 2016/12/7. - */ - -public class PhotoAdapter extends BaseRecyclerAdapter { - @Override - public CommonHolder setViewHolder(ViewGroup parent) { - return new CardHolder(parent.getContext(), parent); - } - - class CardHolder extends CommonHolder { - - @Bind(R.id.tv_info) - TextView tv_info; - - @Bind(R.id.iv_pic) - ImageView iv_pic; - - public CardHolder(Context context, ViewGroup root) { - super(context, root, R.layout.item_photo); - } - - @Override - public void bindData(Photo photo) { - iv_pic.setImageResource(photo.imgSrc); - tv_info.setText(photo.name); - - itemView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - ToastUtil.show("item clicked!"); - } - }); - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/ScienceAdapter.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/ScienceAdapter.java deleted file mode 100644 index e5c30e4b6b16bdce5409396b08d1397c3de1c031..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/ScienceAdapter.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout.adapter; - -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.ImageView; -import android.widget.TextView; - -import com.lcodecore.twinklingrefreshlayout.R; -import com.lcodecore.twinklingrefreshlayout.beans.Card; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by lcodecore on 2016/12/7. - */ - -public class ScienceAdapter extends BaseAdapter { - - private List cards = new ArrayList<>(); - - @Override - public int getCount() { - return cards.size(); - } - - @Override - public Card getItem(int position) { - return cards.get(position); - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - final ViewHolder holder; - if (convertView == null) { - convertView = View.inflate(parent.getContext(), R.layout.item_science, null); - holder = new ViewHolder(convertView); - convertView.setTag(holder); - } else { - holder = (ViewHolder) convertView.getTag(); - } - - holder.tv_name.setText(cards.get(position).title); - holder.iv_cover.setImageResource(cards.get(position).imageSrc); - - return convertView; - } - - class ViewHolder { - final ImageView iv_cover; - final TextView tv_name; - - ViewHolder(View view) { - iv_cover = (ImageView) view.findViewById(R.id.iv_cover); - tv_name = (TextView) view.findViewById(R.id.tv_name); - } - } - - public void refreshCard() { - cards.clear(); - cards.add(new Card("genetics", "", R.drawable.science1)); - cards.add(new Card("globe", "", R.drawable.science2)); - cards.add(new Card("lab-flask-leaf", "", R.drawable.science3)); - cards.add(new Card("magnet", "", R.drawable.science4)); - cards.add(new Card("microscope", "", R.drawable.science5)); - cards.add(new Card("moon", "", R.drawable.science6)); - cards.add(new Card("telescope", "", R.drawable.science7)); - cards.add(new Card("satellite", "", R.drawable.science8)); - cards.add(new Card("Newtons-cradle", "", R.drawable.science9)); - cards.add(new Card("nuclear-symbol", "", R.drawable.science10)); - notifyDataSetChanged(); - } - - public void loadMoreCard() { - cards.add(new Card("genetics", "", R.drawable.science1)); - cards.add(new Card("globe", "", R.drawable.science2)); - cards.add(new Card("lab-flask-leaf", "", R.drawable.science3)); - cards.add(new Card("magnet", "", R.drawable.science4)); - cards.add(new Card("microscope", "", R.drawable.science5)); - cards.add(new Card("moon", "", R.drawable.science6)); - cards.add(new Card("telescope", "", R.drawable.science7)); - cards.add(new Card("satellite", "", R.drawable.science8)); - cards.add(new Card("Newtons-cradle", "", R.drawable.science9)); - cards.add(new Card("nuclear-symbol", "", R.drawable.science10)); - notifyDataSetChanged(); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/ViewPagerHolder.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/ViewPagerHolder.java deleted file mode 100644 index 05130977d0f76c8be787a496fedeab727827c1c0..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/ViewPagerHolder.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout.adapter; - -import android.content.Context; -import android.support.v4.view.ViewPager; -import android.view.View; -import android.view.ViewGroup; -import android.widget.LinearLayout; - -import com.lcodecore.twinklingrefreshlayout.R; -import com.lcodecore.twinklingrefreshlayout.adapter.base.CommonHolder; -import com.lcodecore.twinklingrefreshlayout.beans.Card; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import butterknife.Bind; - -public class ViewPagerHolder extends CommonHolder { - private LoopViewPagerAdapter viewPagerAdapter; - private List cards = new ArrayList<>(); - - @Bind(R.id.viewPager) - ViewPager viewPager; - - @Bind(R.id.indicators) - LinearLayout indicators; - - public ViewPagerHolder(Context context, ViewGroup root) { - super(context, root, R.layout.layout_viewpager); - -// cards.add(new Card("二次元专题", "啊喂,别总想去四维空间啦",R.drawable.card_cover6)); -// cards.add(new Card("Music Player", "闻其名,余音绕梁",R.drawable.card_cover7)); -// cards.add(new Card("el", "剪纸人の唯美旅程",R.drawable.card_cover8)); -// cards.add(new Card("God of Light", "点亮世界之光",R.drawable.card_cover1)); -// cards.add(new Card("BlackLight", "做最纯粹的微博客户端",R.drawable.card_cover3)); - } - - @Override - public void bindData(Void aVoid) { - - } - - @Override - public void bindHeadData() { - if(viewPager.getAdapter() == null){ - viewPagerAdapter = new LoopViewPagerAdapter(viewPager, indicators); - viewPager.setAdapter(viewPagerAdapter); - viewPager.addOnPageChangeListener(viewPagerAdapter); - viewPagerAdapter.setList(cards); - }/*else{ - viewPagerAdapter.setList(pics); - }*/ - } -} \ No newline at end of file diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/base/BaseLoopPagerAdapter.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/base/BaseLoopPagerAdapter.java deleted file mode 100644 index 1922f8624bd26c690447ccdacd8ed89914e7e92b..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/base/BaseLoopPagerAdapter.java +++ /dev/null @@ -1,240 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout.adapter.base; - -import android.os.Handler; -import android.os.Looper; -import android.support.v4.view.PagerAdapter; -import android.support.v4.view.ViewPager; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; - -public abstract class BaseLoopPagerAdapter extends PagerAdapter implements ViewPager.OnPageChangeListener, View.OnTouchListener, Runnable { - - private static final int DEFAULT_DELAY_MILLIS = 5000; - - private final ViewPager mViewPager; - - private final Handler mHandler; - - private final List mViews; - - private final List mList; - - private int mChildCount; - - private int mDelayMillis = DEFAULT_DELAY_MILLIS; - - private boolean mRunning; - - public BaseLoopPagerAdapter(ViewPager viewPager) { - mHandler = new Handler(Looper.getMainLooper()); - mList = new ArrayList<>(); - mViews = new LinkedList<>(); - - mViewPager = viewPager; - mViewPager.setOnTouchListener(this); - } - - /** - * get the item count or pager count - * - * @return - * @see #notifyDataSetChanged() - */ - public abstract int getPagerCount(); - - /** - * get the item - * - * @param position - * @return - * @see #notifyDataSetChanged() - */ - public abstract Object getItem(int position); - - /** - * get the viewpager item view - * - * @param position - * @param convertView - * @param parent - * @return - * @see #instantiateItem(ViewGroup, int) - */ - public abstract View getView(int position, View convertView, ViewGroup parent); - - /** - * @see #onPageSelected(int) - */ - public abstract void onPageItemSelected(int position); - - @Override - public void notifyDataSetChanged() { - int fixedCount = getPagerCount(); - if (fixedCount <= 0) { - return; - } else if (fixedCount == 1) { - if (fixedCount != mList.size()) { - mList.clear(); - mList.add(getItem(0)); - } - if (fixedCount != mViews.size()) { - mViews.clear(); - mViews.add(null); - } - } else if (fixedCount > 1) { - if (fixedCount + 2 != mList.size()) { - mList.clear(); - // add last element in position 0, add all, add first element in last position - mList.add(getItem(fixedCount - 1)); - for (int i = 0; i < fixedCount; i++) { - mList.add(getItem(i)); - } - mList.add(getItem(0)); - } - - if (fixedCount + 2 != mViews.size()) { - mViews.clear(); - for (int i = 0; i < mList.size(); i++) { - mViews.add(null); - } - } - } - super.notifyDataSetChanged(); - - // this is very important - mChildCount = getCount(); - - if (mViewPager.getCurrentItem() == 0 && mChildCount != 1) { - mViewPager.setCurrentItem(1, false); - } - - stop(); - start(); - } - - public void setDelayMillis(int delayMillis) { - this.mDelayMillis = delayMillis; - if (delayMillis <= 0) { - mDelayMillis = DEFAULT_DELAY_MILLIS; - } - } - - /** - * start loop - */ - public void start() { - if (!mRunning) { - post(); - mRunning = true; - } - } - - /** - * stop loop - */ - public void stop() { - if (mRunning) { - mHandler.removeCallbacks(this); - mRunning = false; - } - } - - @Override - public final boolean onTouch(View v, MotionEvent event) { - if (event.getAction() == MotionEvent.ACTION_DOWN) { - stop(); - } else if (event.getAction() == MotionEvent.ACTION_UP) { - start(); - } - return false; - } - - @Override - public final void run() { - int currentPosition = mViewPager.getCurrentItem(); - if (0 < currentPosition && currentPosition < mList.size() - 1) { - - if (currentPosition + 1 == mList.size() - 1) { - currentPosition = 1; - } else { - currentPosition++; - } - mViewPager.setCurrentItem(currentPosition, true); - - post(); - } - } - - private void post() { - mHandler.postDelayed(this, mDelayMillis); - } - - @Override - public final Object instantiateItem(ViewGroup container, int position) { - int fixedPosition = 0; - if (position == 0) { - fixedPosition = getPagerCount() - 1; - } else if (position == mList.size() - 1) { - fixedPosition = 0; - } else if (0 < position && position < mList.size() - 1) { - fixedPosition = position - 1; - } - if (mViews.get(position) == null) { - mViews.set(position, getView(fixedPosition, mViews.get(position), container)); - } - container.addView(mViews.get(position)); - return mViews.get(position); - } - - @Override - public final int getItemPosition(Object object) { - if (mChildCount > 0) { - mChildCount--; - return POSITION_NONE; - } - return super.getItemPosition(object); - } - - @Override - public final void destroyItem(ViewGroup container, int position, Object object) { - container.removeView((View) object); - } - - @Override - public final int getCount() { - return mList.size(); - } - - @Override - public final boolean isViewFromObject(View view, Object object) { - return view == object; - } - - @Override - public final void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - } - - @Override - public final void onPageSelected(int position) { - if (0 < position && position < mList.size() - 1) { - onPageItemSelected(position - 1); - } - } - - @Override - public final void onPageScrollStateChanged(int state) { - if (state == ViewPager.SCROLL_STATE_IDLE) { - if (mList.size() > 3) { - if (mViewPager.getCurrentItem() == 0) { - mViewPager.setCurrentItem(mList.size() - 2, false); - } else if (mViewPager.getCurrentItem() == mList.size() - 1) { - mViewPager.setCurrentItem(1, false); - } - } - } - } -} diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/base/BaseRecyclerAdapter.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/base/BaseRecyclerAdapter.java deleted file mode 100644 index 81d0ac953db51f1f87f2bde199e9f794781d130d..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/base/BaseRecyclerAdapter.java +++ /dev/null @@ -1,184 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout.adapter.base; - -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.content.Context; -import android.support.v7.widget.RecyclerView; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.animation.DecelerateInterpolator; - -import com.lcodecore.twinklingrefreshlayout.utils.DensityUtil; - -import java.util.ArrayList; -import java.util.List; -import butterknife.ButterKnife; -/** - * RecyclerView适配器基类 - */ -public abstract class BaseRecyclerAdapter extends RecyclerView.Adapter implements CommonHolder.OnNotifyChangeListener { - private List dataList = new ArrayList<>(); - private boolean enableHead = false; - CommonHolder headHolder; - ViewGroup rootView; - public final static int TYPE_HEAD = 0; - public static final int TYPE_CONTENT = 1; - @Override - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int position) { - rootView = parent; - //设置ViewHolder - int type = getItemViewType(position); - if (type == TYPE_HEAD) { - return headHolder; - } else { - return setViewHolder(parent); - } - } - @Override - public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { -// runEnterAnimation(holder.itemView, position); - //数据绑定 - if (enableHead) { - if (position == 0) { - ((CommonHolder) holder).bindHeadData(); - } else { - ((CommonHolder) holder).bindData(dataList.get(position - 1)); - } - } else { - ((CommonHolder) holder).bindData(dataList.get(position)); - } - ((CommonHolder) holder).setOnNotifyChangeListener(this); - } - public ViewGroup getRootView() { - return rootView; - } - @Override - public int getItemCount() { - if (enableHead) { - return dataList.size() + 1; - } - return dataList.size(); - } - @Override - public int getItemViewType(int position) { - if (enableHead) { - if (position == 0) { - return TYPE_HEAD; - } else { - return TYPE_CONTENT; - } - } else { - return TYPE_CONTENT; - } - } - private int lastAnimatedPosition = -1; - protected boolean animationsLocked = false; - private boolean delayEnterAnimation = true; - private void runEnterAnimation(View view, int position) { - if (animationsLocked) return; - if (position > lastAnimatedPosition) { - lastAnimatedPosition = position; - view.setTranslationY(DensityUtil.dip2px(view.getContext(), 100));//(position+1)*50f - view.setAlpha(0.f); - view.animate() - .translationY(0).alpha(1.f) - .setStartDelay(delayEnterAnimation ? 20 * (position) : 0) - .setInterpolator(new DecelerateInterpolator(2.f)) - .setDuration(500) - .setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - animationsLocked = true; - } - }).start(); - } - } - @Override - public void onNotify() { - //提供给CommonHolder方便刷新视图 - notifyDataSetChanged(); - } - public void setDataList(List datas) { - dataList.clear(); - if (null != datas) { - dataList.addAll(datas); - } - notifyDataSetChanged(); - } - public void clearDatas() { - dataList.clear(); - notifyDataSetChanged(); - } - /** - * 添加数据到前面 - */ - public void addItemsAtFront(List datas) { - if (null == datas) return; - dataList.addAll(0, datas); - notifyDataSetChanged(); - } - /** - * 添加数据到尾部 - */ - public void addItems(List datas) { - if (null == datas) return; - dataList.addAll(datas); - notifyDataSetChanged(); - } - /** - * 添加单条数据 - */ - public void addItem(T data) { - if (null == data) return; - dataList.add(data); - notifyDataSetChanged(); - } - /** - * 删除单条数据 - */ - public void deletItem(T data) { - dataList.remove(data); - Log.d("deletItem: ", dataList.remove(data) + ""); - notifyDataSetChanged(); - } - /** - * 设置是否显示head - * - * @param ifEnable 是否显示头部 - */ - public void setEnableHead(boolean ifEnable) { - enableHead = ifEnable; - } - public void setHeadHolder(CommonHolder headHolder1) { - enableHead = true; - headHolder = headHolder1; - } - public void setHeadHolder(View itemView) { - enableHead = true; - headHolder = new HeadHolder(itemView); - notifyItemInserted(0); - } - public CommonHolder getHeadHolder() { - return headHolder; - } - /** - * 子类重写实现自定义ViewHolder - */ - public abstract CommonHolder setViewHolder(ViewGroup parent); - - public class HeadHolder extends CommonHolder { - public HeadHolder(View itemView) { - super(itemView); - } - - public HeadHolder(Context context, ViewGroup root, int layoutRes) { - super(context,root,layoutRes); - } - - @Override - public void bindData(Void aVoid) {//不用实现 - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/base/CommonAdapter.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/base/CommonAdapter.java deleted file mode 100644 index 1284b99beed29aebdc861467d92a06786a4a6036..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/base/CommonAdapter.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout.adapter.base; - -import android.database.DataSetObservable; -import android.database.DataSetObserver; -import android.support.v7.widget.RecyclerView; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ListAdapter; - -/** - * Created by lcodecore on 2016/10/22. - */ - -public abstract class CommonAdapter implements ListAdapter { - private final DataSetObservable mDataSetObservable = new DataSetObservable(); - - public boolean hasStableIds() { - return false; - } - - public void registerDataSetObserver(DataSetObserver observer) { - mDataSetObservable.registerObserver(observer); - } - - public void unregisterDataSetObserver(DataSetObserver observer) { - mDataSetObservable.unregisterObserver(observer); - } - - /** - * Notifies the attached observers that the underlying data has been changed - * and any View reflecting the data set should refresh itself. - */ - public void notifyDataSetChanged() { - mDataSetObservable.notifyChanged(); - } - - /** - * Notifies the attached observers that the underlying data is no longer valid - * or available. Once invoked this adapter is no longer valid and should - * not report further data set changes. - */ - public void notifyDataSetInvalidated() { - mDataSetObservable.notifyInvalidated(); - } - - public boolean areAllItemsEnabled() { - return true; - } - - public boolean isEnabled(int position) { - return true; - } - - public View getDropDownView(int position, View convertView, ViewGroup parent) { - return getView(position, convertView, parent); - } - - public int getItemViewType(int position) { - return 0; - } - - public int getViewTypeCount() { - return 1; - } - - public boolean isEmpty() { - return getCount() == 0; - } -} diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/base/CommonHolder.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/base/CommonHolder.java deleted file mode 100644 index 1ba4d4263db221472fdadddf0880531040f772c9..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/adapter/base/CommonHolder.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout.adapter.base; - -import android.content.Context; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import butterknife.ButterKnife; -/** - * 聊天消息条目的基类 - * ViewHolder 与 Adapter 解耦 - */ -public abstract class CommonHolder extends RecyclerView.ViewHolder { - public CommonHolder(Context context, ViewGroup root, int layoutRes) { - super(LayoutInflater.from(context).inflate(layoutRes, root, false)); - ButterKnife.bind(this, itemView); - } - /** - * 此适配器是为了能让详情页共用列表页的ViewHolder,一般情况无需重写该构造器 - */ - public CommonHolder(View itemView) { - super(itemView); - ButterKnife.bind(this, itemView); - } - public Context getContext() { - return itemView.getContext(); - } - /** - * 用给定的 data 对 holder 的 view 进行赋值 - */ - public abstract void bindData(T t); - - public void bindHeadData(){} - /** - * 通知适配器更新布局 - */ - public interface OnNotifyChangeListener { - void onNotify(); - } - OnNotifyChangeListener listener; - public void setOnNotifyChangeListener(OnNotifyChangeListener listener) { - this.listener = listener; - } - public void notifyChange() { - listener.onNotify(); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/utils/DensityUtil.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/utils/DensityUtil.java deleted file mode 100644 index cc54dcdb753e99f7f0f941749beba2d303e09450..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/utils/DensityUtil.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout.utils; - -import android.content.Context; -import android.graphics.Point; -import android.view.Display; -import android.view.WindowManager; - -public class DensityUtil { - private static int screenWidth = 0; - private static int screenHeight = 0; - public static int dip2px(Context var0, float var1) { - float var2 = var0.getResources().getDisplayMetrics().density; - return (int)(var1 * var2 + 0.5F); - } - public static int px2dip(Context var0, float var1) { - float var2 = var0.getResources().getDisplayMetrics().density; - return (int)(var1 / var2 + 0.5F); - } - public static int sp2px(Context var0, float var1) { - float var2 = var0.getResources().getDisplayMetrics().scaledDensity; - return (int)(var1 * var2 + 0.5F); - } - public static int px2sp(Context var0, float var1) { - float var2 = var0.getResources().getDisplayMetrics().scaledDensity; - return (int)(var1 / var2 + 0.5F); - } - public static int getScreenWidth(Context c) { - if (screenWidth == 0) { - WindowManager wm = (WindowManager) c.getSystemService(Context.WINDOW_SERVICE); - Display display = wm.getDefaultDisplay(); - Point size = new Point(); - display.getSize(size); - screenWidth = size.x; - } - return screenWidth; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/utils/ToastUtil.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/utils/ToastUtil.java deleted file mode 100644 index 2c18988567741db47637d168238559b5476a4272..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/utils/ToastUtil.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout.utils; - -import android.widget.Toast; - -import com.lcodecore.twinklingrefreshlayout.TkApplication; - -/** - * Created by lcodecore on 2017/2/28. - */ - -public class ToastUtil { - public static void show(String msg){ - Toast.makeText(TkApplication.appContext, msg, Toast.LENGTH_SHORT).show(); - } -} diff --git a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/views/CircleImageView.java b/app/src/main/java/com/lcodecore/twinklingrefreshlayout/views/CircleImageView.java deleted file mode 100644 index f14d43caf4e784f6b180a7f536564d4e59c40ab7..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/lcodecore/twinklingrefreshlayout/views/CircleImageView.java +++ /dev/null @@ -1,307 +0,0 @@ -package com.lcodecore.twinklingrefreshlayout.views; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Bitmap; -import android.graphics.BitmapShader; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.ColorFilter; -import android.graphics.Matrix; -import android.graphics.Paint; -import android.graphics.RectF; -import android.graphics.Shader; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.ColorDrawable; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.support.annotation.ColorRes; -import android.support.annotation.DrawableRes; -import android.util.AttributeSet; -import android.widget.ImageView; - -import com.lcodecore.twinklingrefreshlayout.R; -import com.lcodecore.twinklingrefreshlayout.utils.DensityUtil; - -/** - * 头像的圆形处理工具 - **/ - -public class CircleImageView extends ImageView { - - private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP; - - private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888; - private static final int COLORDRAWABLE_DIMENSION = 2; - - private static final int DEFAULT_BORDER_WIDTH = 0; - private static final int DEFAULT_BORDER_COLOR = Color.BLACK; - private static final boolean DEFAULT_BORDER_OVERLAY = false; - - private final RectF mDrawableRect = new RectF(); - private final RectF mBorderRect = new RectF(); - - private final Matrix mShaderMatrix = new Matrix(); - private final Paint mBitmapPaint = new Paint(); - private final Paint mBorderPaint = new Paint(); - - private int mBorderColor = DEFAULT_BORDER_COLOR; - private int mBorderWidth = DEFAULT_BORDER_WIDTH; - - private Bitmap mBitmap; - private BitmapShader mBitmapShader; - private int mBitmapWidth; - private int mBitmapHeight; - - private float mDrawableRadius; - private float mBorderRadius; - - private ColorFilter mColorFilter; - - private boolean mReady; - private boolean mSetupPending; - private boolean mBorderOverlay; - - public CircleImageView(Context context) { - super(context); - - init(); - } - - public CircleImageView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public CircleImageView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView, defStyle, 0); - - mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_border_width, DEFAULT_BORDER_WIDTH); - mBorderColor = a.getColor(R.styleable.CircleImageView_border_color, DEFAULT_BORDER_COLOR); - mBorderOverlay = a.getBoolean(R.styleable.CircleImageView_border_overlay, DEFAULT_BORDER_OVERLAY); - - a.recycle(); - - init(); - } - - private void init() { - super.setScaleType(SCALE_TYPE); - mReady = true; - - if (mSetupPending) { - setup(); - mSetupPending = false; - } - } - - @Override - public ScaleType getScaleType() { - return SCALE_TYPE; - } - - @Override - public void setScaleType(ScaleType scaleType) { - if (scaleType != SCALE_TYPE) { - throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType)); - } - } - - @Override - public void setAdjustViewBounds(boolean adjustViewBounds) { - if (adjustViewBounds) { - throw new IllegalArgumentException("adjustViewBounds not supported."); - } - } - - @Override - protected void onDraw(Canvas canvas) { - if (getDrawable() == null) { - return; - } - - canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius, mBitmapPaint); - if (mBorderWidth != 0) { - canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius, mBorderPaint); - } - } - - @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) { - super.onSizeChanged(w, h, oldw, oldh); - setup(); - } - - public int getBorderColor() { - return mBorderColor; - } - - public void setBorderColor(int borderColor) { - if (borderColor == mBorderColor) { - return; - } - - mBorderColor = borderColor; - mBorderPaint.setColor(mBorderColor); - invalidate(); - } - - public void setBorderColorResource(@ColorRes int borderColorRes) { - setBorderColor(getContext().getResources().getColor(borderColorRes)); - } - - public int getBorderWidth() { - return mBorderWidth; - } - - public void setBorderWidth(int borderWidth) { - if (borderWidth == mBorderWidth) { - return; - } - - mBorderWidth = borderWidth; - setup(); - } - - public boolean isBorderOverlay() { - return mBorderOverlay; - } - - public void setBorderOverlay(boolean borderOverlay) { - if (borderOverlay == mBorderOverlay) { - return; - } - - mBorderOverlay = borderOverlay; - setup(); - } - - @Override - public void setImageBitmap(Bitmap bm) { - super.setImageBitmap(bm); - mBitmap = bm; - setup(); - } - - @Override - public void setImageDrawable(Drawable drawable) { - super.setImageDrawable(drawable); - mBitmap = getBitmapFromDrawable(drawable); - setup(); - } - - @Override - public void setImageResource(@DrawableRes int resId) { - super.setImageResource(resId); - mBitmap = getBitmapFromDrawable(getDrawable()); - setup(); - } - - @Override - public void setImageURI(Uri uri) { - super.setImageURI(uri); - mBitmap = getBitmapFromDrawable(getDrawable()); - setup(); - } - - @Override - public void setColorFilter(ColorFilter cf) { - if (cf == mColorFilter) { - return; - } - - mColorFilter = cf; - mBitmapPaint.setColorFilter(mColorFilter); - invalidate(); - } - - private Bitmap getBitmapFromDrawable(Drawable drawable) { - if (drawable == null) { - return null; - } - - if (drawable instanceof BitmapDrawable) { - return ((BitmapDrawable) drawable).getBitmap(); - } - - try { - Bitmap bitmap; - - if (drawable instanceof ColorDrawable) { - bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG); - } else { - if (!(drawable.getIntrinsicWidth() > 0) || !(drawable.getIntrinsicHeight() > 0)) { - bitmap = Bitmap.createBitmap(DensityUtil.dip2px(getContext(), 40), DensityUtil.dip2px(getContext(),40), BITMAP_CONFIG); - } else { - bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG); - } - } - - Canvas canvas = new Canvas(bitmap); - drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); - drawable.draw(canvas); - return bitmap; - } catch (OutOfMemoryError e) { - return null; - } - } - - private void setup() { - if (!mReady) { - mSetupPending = true; - return; - } - - if (mBitmap == null) { - return; - } - - mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); - - mBitmapPaint.setAntiAlias(true); - mBitmapPaint.setShader(mBitmapShader); - - mBorderPaint.setStyle(Paint.Style.STROKE); - mBorderPaint.setAntiAlias(true); - mBorderPaint.setColor(mBorderColor); - mBorderPaint.setStrokeWidth(mBorderWidth); - - mBitmapHeight = mBitmap.getHeight(); - mBitmapWidth = mBitmap.getWidth(); - - mBorderRect.set(0, 0, getWidth(), getHeight()); - mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2, (mBorderRect.width() - mBorderWidth) / 2); - - mDrawableRect.set(mBorderRect); - if (!mBorderOverlay) { - mDrawableRect.inset(mBorderWidth, mBorderWidth); - } - mDrawableRadius = Math.min(mDrawableRect.height() / 2, mDrawableRect.width() / 2); - - updateShaderMatrix(); - invalidate(); - } - - private void updateShaderMatrix() { - float scale; - float dx = 0; - float dy = 0; - - mShaderMatrix.set(null); - - if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) { - scale = mDrawableRect.height() / (float) mBitmapHeight; - dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f; - } else { - scale = mDrawableRect.width() / (float) mBitmapWidth; - dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f; - } - - mShaderMatrix.setScale(scale, scale); - mShaderMatrix.postTranslate((int) (dx + 0.5f) + mDrawableRect.left, (int) (dy + 0.5f) + mDrawableRect.top); - - mBitmapShader.setLocalMatrix(mShaderMatrix); - } - -} \ No newline at end of file diff --git a/app/src/main/res/drawable-xhdpi/arrow.png b/app/src/main/res/drawable-xhdpi/arrow.png deleted file mode 100644 index 3d7481c8f956895f6e832a2d0fe45f266bf34f56..0000000000000000000000000000000000000000 Binary files a/app/src/main/res/drawable-xhdpi/arrow.png and /dev/null differ diff --git a/app/src/main/res/drawable/selector_indicator.xml b/app/src/main/res/drawable/selector_indicator.xml deleted file mode 100644 index c349c20d933d68a137cf36830efd4209f631219e..0000000000000000000000000000000000000000 --- a/app/src/main/res/drawable/selector_indicator.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_coordinate.xml b/app/src/main/res/layout/activity_coordinate.xml deleted file mode 100644 index 3129dbb9fd6613b71199bb8a4f6121a472c2d0ff..0000000000000000000000000000000000000000 --- a/app/src/main/res/layout/activity_coordinate.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_food.xml b/app/src/main/res/layout/activity_food.xml deleted file mode 100644 index 67e143df44bdbe0d985b3df87e74dd20e6ffb888..0000000000000000000000000000000000000000 --- a/app/src/main/res/layout/activity_food.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index b44266c25b5751cbffbebd6da309e28a21d47fb4..0000000000000000000000000000000000000000 --- a/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/activity_music.xml b/app/src/main/res/layout/activity_music.xml deleted file mode 100644 index 65f68c7faab9c809727c99bdc8ca9318ac1669fe..0000000000000000000000000000000000000000 --- a/app/src/main/res/layout/activity_music.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - diff --git a/app/src/main/res/layout/activity_nested_layout.xml b/app/src/main/res/layout/activity_nested_layout.xml deleted file mode 100644 index 4182ee83447c23515a3a0db665e7fe7ec0b1ab93..0000000000000000000000000000000000000000 --- a/app/src/main/res/layout/activity_nested_layout.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/activity_normalview.xml b/app/src/main/res/layout/activity_normalview.xml deleted file mode 100644 index eb970649e3dac44fe7ab41be7cb7f68c23820c28..0000000000000000000000000000000000000000 --- a/app/src/main/res/layout/activity_normalview.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/activity_photo.xml b/app/src/main/res/layout/activity_photo.xml deleted file mode 100644 index 96ad0f0bb7b1a56196d3e7329748c697bcabd969..0000000000000000000000000000000000000000 --- a/app/src/main/res/layout/activity_photo.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/activity_science.xml b/app/src/main/res/layout/activity_science.xml deleted file mode 100644 index 7a4275d893c38a768984bf80237f0579b4665483..0000000000000000000000000000000000000000 --- a/app/src/main/res/layout/activity_science.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_story.xml b/app/src/main/res/layout/activity_story.xml deleted file mode 100644 index babd7666896075fc61b2f237c41fa5250935f2e1..0000000000000000000000000000000000000000 --- a/app/src/main/res/layout/activity_story.xml +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/activity_test.xml b/app/src/main/res/layout/activity_test.xml deleted file mode 100644 index 0945215667a2704f8815aaa72e7ad14a2b990e97..0000000000000000000000000000000000000000 --- a/app/src/main/res/layout/activity_test.xml +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - - - - - - - - - - - -