Showing preview only (386K chars total). Download the full file or copy to clipboard to get everything.
Repository: liaohuqiu/android-Ultra-Pull-To-Refresh
Branch: master
Commit: 46fdc861243a
Files: 124
Total size: 351.8 KB
Directory structure:
gitextract_757m5xqu/
├── .gitignore
├── .travis.yml
├── LICENSE
├── README-cn.md
├── README.md
├── build.gradle
├── buildSrc/
│ └── src/
│ └── main/
│ └── groovy/
│ └── copy-libs.gradle
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── pom.xml
├── proguard-project.txt
├── project.properties
├── ptr-demo/
│ ├── AndroidManifest.xml
│ ├── assets/
│ │ └── request_init/
│ │ └── demo/
│ │ └── image-list.json
│ ├── build.gradle
│ ├── libs/
│ │ ├── clog-1.0.2-sources.jar
│ │ ├── clog-1.0.2.jar
│ │ └── support-v4-r7.jar
│ ├── pom.xml
│ ├── proguard-project.txt
│ ├── proguard-rules.pro
│ ├── project.properties
│ ├── res/
│ │ ├── drawable/
│ │ │ ├── image_border.xml
│ │ │ ├── text_view_bg.xml
│ │ │ └── with_long_press_list_item_background.xml
│ │ ├── layout/
│ │ │ ├── activity_main.xml
│ │ │ ├── activity_view_pager.xml
│ │ │ ├── fragment_classic_header_with_gridview.xml
│ │ │ ├── fragment_classic_header_with_list_view.xml
│ │ │ ├── fragment_classic_header_with_list_view_and_empty_view.xml
│ │ │ ├── fragment_classic_header_with_scroll_view.xml
│ │ │ ├── fragment_classic_header_with_textview.xml
│ │ │ ├── fragment_classic_header_with_viewgroup.xml
│ │ │ ├── fragment_classic_header_with_webview.xml
│ │ │ ├── fragment_materail_style.xml
│ │ │ ├── fragment_ptr_home.xml
│ │ │ ├── fragment_storehouse_header.xml
│ │ │ ├── fragment_view_pager.xml
│ │ │ ├── fragment_with_long_press.xml
│ │ │ ├── list_view_item.xml
│ │ │ ├── view_pager_fragment_list_view_header.xml
│ │ │ ├── view_pager_indicator_item.xml
│ │ │ ├── with_grid_view_item_image_list_grid.xml
│ │ │ └── with_long_press_list_view_item.xml
│ │ ├── values/
│ │ │ ├── arrays.xml
│ │ │ ├── ptr_demo_colors.xml
│ │ │ └── strings.xml
│ │ └── values-zh/
│ │ └── strings.xml
│ └── src/
│ └── in/
│ └── srain/
│ └── cube/
│ └── views/
│ └── ptr/
│ └── demo/
│ ├── app/
│ │ └── PtrDemoApplication.java
│ ├── data/
│ │ └── DemoRequestData.java
│ ├── image/
│ │ ├── DemoDuiTangImageReSizer.java
│ │ ├── Images.java
│ │ └── PtrImageLoadHandler.java
│ └── ui/
│ ├── EnableNextPTRAtOnce.java
│ ├── MaterialStyleFragment.java
│ ├── MaterialStylePinContentFragment.java
│ ├── PtrDemoHomeFragment.java
│ ├── RentalsStyleFragment.java
│ ├── Utils.java
│ ├── WithLongPressFragment.java
│ ├── activity/
│ │ └── PtrDemoHomeActivity.java
│ ├── classic/
│ │ ├── AutoRefresh.java
│ │ ├── EvenOnlyATextView.java
│ │ ├── HideHeader.java
│ │ ├── KeepHeader.java
│ │ ├── PullToRefresh.java
│ │ ├── ReleaseToRefresh.java
│ │ ├── WithGridView.java
│ │ ├── WithListView.java
│ │ ├── WithListViewAndEmptyView.java
│ │ ├── WithScrollView.java
│ │ ├── WithTextViewInFrameLayoutFragment.java
│ │ └── WithWebView.java
│ ├── header/
│ │ ├── RentalsSunDrawable.java
│ │ └── RentalsSunHeaderView.java
│ ├── storehouse/
│ │ ├── StoreHouseUsingPointList.java
│ │ ├── StoreHouseUsingString.java
│ │ └── StoreHouseUsingStringArray.java
│ └── viewpager/
│ ├── ImageListViewHolder.java
│ ├── ViewPagerActivity.java
│ └── ViewPagerFragment.java
├── ptr-demo.apk
├── ptr-lib/
│ ├── AndroidManifest.xml
│ ├── build.gradle
│ ├── checkstyle.xml
│ ├── gradle-mvn-push.gradle
│ ├── gradle.properties
│ ├── libs/
│ │ ├── clog-1.0.2-sources.jar
│ │ └── clog-1.0.2.jar
│ ├── pom.xml
│ ├── res/
│ │ ├── layout/
│ │ │ ├── cube_ptr_classic_default_header.xml
│ │ │ └── cube_ptr_simple_loading.xml
│ │ ├── values/
│ │ │ ├── cube_ptr_attrs.xml
│ │ │ └── cube_ptr_string.xml
│ │ └── values-zh/
│ │ └── cube_ptr_string.xml
│ └── src/
│ └── in/
│ └── srain/
│ └── cube/
│ └── views/
│ └── ptr/
│ ├── PtrClassicDefaultHeader.java
│ ├── PtrClassicFrameLayout.java
│ ├── PtrDefaultHandler.java
│ ├── PtrFrameLayout.java
│ ├── PtrHandler.java
│ ├── PtrUIHandler.java
│ ├── PtrUIHandlerHolder.java
│ ├── PtrUIHandlerHook.java
│ ├── header/
│ │ ├── MaterialHeader.java
│ │ ├── MaterialProgressDrawable.java
│ │ ├── StoreHouseBarItem.java
│ │ ├── StoreHouseHeader.java
│ │ └── StoreHousePath.java
│ ├── indicator/
│ │ ├── PtrIndicator.java
│ │ └── PtrTensionIndicator.java
│ └── util/
│ ├── PtrCLog.java
│ └── PtrLocalDisplay.java
├── publish-to-maven.sh
├── settings.gradle
├── template/
│ ├── README-cn.md
│ ├── README.md
│ ├── ptr-demo/
│ │ ├── build.gradle
│ │ └── pom.xml
│ └── ptr-lib/
│ ├── gradle.properties
│ └── pom.xml
└── update-project.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# built application files
*.ap_
# files for the dex VM
*.dex
*.iml
# Java class files
*.class
# generated files
bin/
gen/
*target/
*build/
.gradle/
.idea/
gen-external-apklibs/
# Local configuration file (sdk path, etc)
local.properties
# Eclipse project files
.classpath
.project
# Mac os
.DS_Store
================================================
FILE: .travis.yml
================================================
language: android
android:
components:
- build-tools-20.0.0
- android-16
jdk: oraclejdk7
script:
- ./gradlew check --refresh-dependencies
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright (c) <2015> <liaohuqiu.net>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
================================================
FILE: README-cn.md
================================================
###### 欢迎关注我
GitHub: https://github.com/liaohuqiu
微博: http://weibo.com/liaohuqiu
知乎: http://www.zhihu.com/people/liao-hu-qiu
---
# Ultra Pull To Refresh
这是现在已经停止维护的下拉刷新项目的替代方案。继承于ViewGroup可以包含任何View。功能比SwipeRefreshLayout强大。
使用起来非常简单。良好的设计,如果你想定制自己的UI样式,非常简单,就像给ListView加一个Header View那么简单。
支持 `API LEVEL >= 8`。
[APK下载](https://raw.githubusercontent.com/liaohuqiu/android-Ultra-Pull-To-Refresh/master/ptr-demo.apk)
#### 下拉刷新 + 加载更多?
本类库是单纯的下拉刷新。如果你需要用到`加载更多`,看这个项目: https://github.com/liaohuqiu/android-cube-app
#### 使用eclipse的同学请注意, Intellij IDEA / Android Studio 请忽略
**demo可以直接在eclipse中运行, 编译demo项目的同学看这里: http://www.liaohuqiu.net/cn/posts/compile-ultra-ptr-in-eclipse/**
* 先上两张StoreHouse风格的截图! 感谢 [CBStoreHouseRefreshControl](https://github.com/coolbeet/CBStoreHouseRefreshControl).
<div class='row'>
<img src='http://srain-github.qiniudn.com/ultra-ptr/store-house-string-array.gif' width="300px" style='border: #f1f1f1 solid 1px'/>
<img src='http://srain-github.qiniudn.com/ultra-ptr/store-house-string.gif' width="300px" style='border: #f1f1f1 solid 1px'/>
</div>
* 5.0 Material 风格 2014-12-09 新增。**阴影效果,gif图看起来有些失真,看demo吧!**
<div class='row'>
<img src='http://srain-github.qiniudn.com/ultra-ptr/material-style.gif' width="300px"/>
</div>
* **支持所有的View**:
ListView, GridView, ScrollView, FrameLayout, 甚至 TextView.
<div><img src='http://srain-github.qiniudn.com/ultra-ptr/contains-all-of-views.gif' width="300px" style='border: #f1f1f1 solid 1px'/></div>
* 支持各种下拉刷新交互.
* 下拉刷新(iOS风格)
<div><img src='http://srain-github.qiniudn.com/ultra-ptr/pull-to-refresh.gif' width="300px" style='border: #f1f1f1 solid 1px'/></div>
* 释放刷新(经典风格)
<div><img src='http://srain-github.qiniudn.com/ultra-ptr/release-to-refresh.gif' width="300px" style='border: #f1f1f1 solid 1px'/></div>
* 刷新时,头部保持(新浪微博)
<img src='http://srain-github.qiniudn.com/ultra-ptr/keep-header.gif' width="300px"/>
* 刷新时,头部不保持(微信朋友圈)
<img src='http://srain-github.qiniudn.com/ultra-ptr/hide-header.gif' width="300px" sytle='border: #f1f1f1 solid 1px'/>
* 自动刷新,进入界面时自动刷新
<img src='http://srain-github.qiniudn.com/ultra-ptr/auto-refresh.gif' width="300px" sytle='border: #f1f1f1 solid 1px'/></div>
# 使用方式
#### 中央库依赖
项目已经发布到了Maven中央库,包括`aar`和`apklib`两种格式。在Maven或者Gradle下可如下直接引入:
最新版版本号: `1.0.11`, 发布到了: https://oss.sonatype.org/content/repositories/snapshots
在gradle中:
```
maven {
url 'https://oss.sonatype.org/content/repositories/snapshots'
}
```
稳定版: `1.0.11`, https://oss.sonatype.org/content/repositories/releases, in gradle:
```
mavenCentral()
```
`pom.xml` 文件中
最新版:
```xml
<dependency>
<groupId>in.srain.cube</groupId>
<artifactId>ultra-ptr</artifactId>
<type>aar</type>
<!-- or apklib format, if you want -->
<!-- <type>apklib</type> -->
<version>1.0.11</version>
</dependency>
稳定版
```xml
<dependency>
<groupId>in.srain.cube</groupId>
<artifactId>ultra-ptr</artifactId>
<type>aar</type>
<!-- or apklib format, if you want -->
<!-- <type>apklib</type> -->
<version>1.0.11</version>
</dependency>
```
gradle / Android Studio, 最新版
```
compile 'in.srain.cube:ultra-ptr:1.0.11'
```
gradle / Android Studio, 稳定版
```
compile 'in.srain.cube:ultra-ptr:1.0.11'
```
#### 配置
有6个参数可配置:
* 阻尼系数
默认: `1.7f`,越大,感觉下拉时越吃力。
* 触发刷新时移动的位置比例
默认,`1.2f`,移动达到头部高度1.2倍时可触发刷新操作。
* 回弹延时
默认 `200ms`,回弹到刷新高度所用时间
* 头部回弹时间
默认`1000ms`
* 刷新是保持头部
默认值 `true`.
* 下拉刷新 / 释放刷新
默认为释放刷新
##### xml中配置示例
```xml
<in.srain.cube.views.ptr.PtrFrameLayout
android:id="@+id/store_house_ptr_frame"
xmlns:cube_ptr="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
cube_ptr:ptr_resistance="1.7"
cube_ptr:ptr_ratio_of_header_height_to_refresh="1.2"
cube_ptr:ptr_duration_to_close="300"
cube_ptr:ptr_duration_to_close_header="2000"
cube_ptr:ptr_keep_header_when_refresh="true"
cube_ptr:ptr_pull_to_fresh="false" >
<LinearLayout
android:id="@+id/store_house_ptr_image_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cube_mints_333333"
android:clickable="true"
android:padding="10dp">
<in.srain.cube.image.CubeImageView
android:id="@+id/store_house_ptr_image"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</in.srain.cube.views.ptr.PtrFrameLayout>
```
### 也可以在java代码中配置
```java
// the following are default settings
mPtrFrame.setResistance(1.7f);
mPtrFrame.setRatioOfHeaderHeightToRefresh(1.2f);
mPtrFrame.setDurationToClose(200);
mPtrFrame.setDurationToCloseHeader(1000);
// default is false
mPtrFrame.setPullToRefresh(false);
// default is true
mPtrFrame.setKeepHeaderWhenRefresh(true);
```
### 其他配置
* 刷新时,保持内容不动,仅头部下移, `setPinContent()`
`Material` 风格时,效果不错,其他风格的头部,效果不好。issue #29
## StoreHouse 风格
* 使用字符串, 支持A-Z, 0-7 以及 `-` `.`
```java
// header
final StoreHouseHeader header = new StoreHouseHeader(getContext());
header.setPadding(0, LocalDisplay.dp2px(15), 0, 0);
/**
* using a string, support: A-Z 0-9 - .
* you can add more letters by {@link in.srain.cube.views.ptr.header.StoreHousePath#addChar}
*/
header.initWithString('Alibaba');
```
* 使用资源文件中的路径信息
```java
header.initWithStringArray(R.array.storehouse);
```
资源文件 `res/values/arrays.xml` 内容如下:
```xml
<resources>
<string-array name="storehouse">
<item>0,35,12,42,</item>
<item>12,42,24,35,</item>
<item>24,35,12,28,</item>
<item>0,35,12,28,</item>
<item>0,21,12,28,</item>
<item>12,28,24,21,</item>
<item>24,35,24,21,</item>
<item>24,21,12,14,</item>
<item>0,21,12,14,</item>
<item>0,21,0,7,</item>
<item>12,14,0,7,</item>
<item>12,14,24,7,</item>
<item>24,7,12,0,</item>
<item>0,7,12,0,</item>
</string-array>
</resources>
```
# 处理刷新
通过`PtrHandler`,可以检查确定是否可以下来刷新以及在合适的时间刷新数据。
检查是否可以下拉刷新在`PtrDefaultHandler.checkContentCanBePulledDown`中有默认简单的实现,你可以根据实际情况完成这个逻辑。
```
public interface PtrHandler {
/**
* 检查是否可以执行下来刷新,比如列表为空或者列表第一项在最上面时。
* <p/>
* {@link in.srain.cube.views.ptr.PtrDefaultHandler#checkContentCanBePulledDown}
*/
public boolean checkCanDoRefresh(final PtrFrameLayout frame, final View content, final View header);
/**
* 需要加载数据时触发
*
* @param frame
*/
public void onRefreshBegin(final PtrFrameLayout frame);
}
```
例子:
```java
ptrFrame.setPtrHandler(new PtrHandler() {
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
frame.postDelayed(new Runnable() {
@Override
public void run() {
ptrFrame.refreshComplete();
}
}, 1800);
}
@Override
public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
// 默认实现,根据实际情况做改动
return PtrDefaultHandler.checkContentCanBePulledDown(frame, content, header);
}
});
```
# 常见问题
* ViewPager滑动冲突: `disableWhenHorizontalMove()`
* 长按LongPressed, `setInterceptEventWhileWorking()`
# 联系方式和问题建议
* 微博: http://weibo.com/liaohuqiu
* QQ 群:
1. cube系列开源项目使用交流,问题解答: 271918140 (cube-sdk)
加群前请先阅读群约定: https://github.com/liaohuqiu/qq-tribe-rule
2. 如果你会通过google解决问题,喜欢独立思考,喜欢和优秀却又温和的人成为朋友,欢迎加入我们在 Slack 上的群组: 我们在 Slack 上的群组:
http://join-add1bit.liaohuqiu.net/?channel=git-android-ultra-ptr
* srain@php.net
* twitter: https://twitter.com/liaohuqiu
* blog: http://www.liaohuqiu.net
================================================
FILE: README.md
================================================
###### Welcome to follow me on GitHub or Twitter
GitHub: https://github.com/liaohuqiu
Twitter: https://twitter.com/liaohuqiu
---
[](https://travis-ci.org/liaohuqiu/android-Ultra-Pull-To-Refresh)
[](https://android-arsenal.com/details/1/1180)
#### [中文版文档](https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh/blob/master/README-cn.md)
Wanna auto-load-more? This will be what you want: https://github.com/liaohuqiu/android-cube-app
# Ultra Pull To Refresh
It's a replacement for the deprecated pull to refresh solution. It can contain any view you want.
It's easy to use and more powerful than SwipeRefreshLayout.
It's well designed, you can customize the UI effect you want as easy as adding a headview to ListView.
Support `API LEVEL >= 8`, all snapshots are taken from Genymotion, 2.3.7.
[Download APK](https://raw.githubusercontent.com/liaohuqiu/android-Ultra-Pull-To-Refresh/master/ptr-demo.apk)
* StoreHouse Style first! Thanks to [CBStoreHouseRefreshControl](https://github.com/coolbeet/CBStoreHouseRefreshControl).
<div class='row'>
<img src='http://srain-github.qiniudn.com/ultra-ptr/store-house-string-array.gif' width="300px" style='border: #f1f1f1 solid 1px'/>
<img src='http://srain-github.qiniudn.com/ultra-ptr/store-house-string.gif' width="300px" style='border: #f1f1f1 solid 1px'/>
</div>
* Material Style, added @ 2014-12-09. **There is a beautiful shadow which looks terrible in gif snapshot. Please Check out the DEMO.**
<div class='row'>
<img src='http://srain-github.qiniudn.com/ultra-ptr/material-style.gif' width="300px"/>
</div>
* **Supports all of the views**:
ListView, GridView, ScrollView, FrameLayout, or Even a single TextView.
<div><img src='http://srain-github.qiniudn.com/ultra-ptr/contains-all-of-views.gif' width="300px" style='border: #f1f1f1 solid 1px'/></div>
* Supports all of the refresh types.
* pull to refresh
<div><img src='http://srain-github.qiniudn.com/ultra-ptr/pull-to-refresh.gif' width="300px" style='border: #f1f1f1 solid 1px'/></div>
* release to refresh
<div><img src='http://srain-github.qiniudn.com/ultra-ptr/release-to-refresh.gif' width="300px" style='border: #f1f1f1 solid 1px'/></div>
* keep header when refresh
<img src='http://srain-github.qiniudn.com/ultra-ptr/keep-header.gif' width="300px"/>
* hide header when refresh
<img src='http://srain-github.qiniudn.com/ultra-ptr/hide-header.gif' width="300px" sytle='border: #f1f1f1 solid 1px'/>
* auto refresh
<img src='http://srain-github.qiniudn.com/ultra-ptr/auto-refresh.gif' width="300px" sytle='border: #f1f1f1 solid 1px'/></div>
# Usage
#### Maven Central
This project has been pushed to Maven Central, both in `aar` and `apklib`.
The latest version: `1.0.11`, has been published to: https://oss.sonatype.org/content/repositories/snapshots, in gradle:
```
maven {
url 'https://oss.sonatype.org/content/repositories/snapshots'
}
```
The stable version: `1.0.11`, https://oss.sonatype.org/content/repositories/releases, in gradle:
```
mavenCentral()
```
pom.xml, latest version:
```xml
<dependency>
<groupId>in.srain.cube</groupId>
<artifactId>ultra-ptr</artifactId>
<type>aar</type>
<!-- or apklib format, if you want -->
<!-- <type>apklib</type> -->
<version>1.0.11</version>
</dependency>
```
pom.xml, stable version:
```xml
<dependency>
<groupId>in.srain.cube</groupId>
<artifactId>ultra-ptr</artifactId>
<type>aar</type>
<!-- or apklib format, if you want -->
<!-- <type>apklib</type> -->
<version>1.0.11</version>
</dependency>
```
gradle, latest version:
```
compile 'in.srain.cube:ultra-ptr:1.0.11'
```
gradle, stable version:
```
compile 'in.srain.cube:ultra-ptr:1.0.11'
```
#### Config
There are 6 properties:
* Resistence
This is the resistence while you are moving the frame, default is: `1.7f`.
* Ratio of the Height of the Header to Refresh
The ratio of the height of the header to trigger refresh, default is: `1.2f`.
* Duration to Close
The duration for moving from the position you relase the view to the height of header, default is `200ms`.
* Duration to Close Header
The default value is `1000ms`
* Keep Header while Refreshing
The default value is `true`.
* Pull to Refresh / Release to Refresh
The default value is Release to Refresh.
##### Config in xml
```xml
<in.srain.cube.views.ptr.PtrFrameLayout
android:id="@+id/store_house_ptr_frame"
xmlns:cube_ptr="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
cube_ptr:ptr_resistance="1.7"
cube_ptr:ptr_ratio_of_header_height_to_refresh="1.2"
cube_ptr:ptr_duration_to_close="300"
cube_ptr:ptr_duration_to_close_header="2000"
cube_ptr:ptr_keep_header_when_refresh="true"
cube_ptr:ptr_pull_to_fresh="false" >
<LinearLayout
android:id="@+id/store_house_ptr_image_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cube_mints_333333"
android:clickable="true"
android:padding="10dp">
<in.srain.cube.image.CubeImageView
android:id="@+id/store_house_ptr_image"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</in.srain.cube.views.ptr.PtrFrameLayout>
```
### Or config in java code
```java
// the following are default settings
mPtrFrame.setResistance(1.7f);
mPtrFrame.setRatioOfHeaderHeightToRefresh(1.2f);
mPtrFrame.setDurationToClose(200);
mPtrFrame.setDurationToCloseHeader(1000);
// default is false
mPtrFrame.setPullToRefresh(false);
// default is true
mPtrFrame.setKeepHeaderWhenRefresh(true);
```
### Other Config
* `setPinContent`. Pin the content, only the `HeaderView` will be moved.
This's the the performance of material style in support package v19.
## StoreHouse Style
* Config using string:
```java
// header
final StoreHouseHeader header = new StoreHouseHeader(getContext());
header.setPadding(0, LocalDisplay.dp2px(15), 0, 0);
/**
* using a string, support: A-Z 0-9 - .
* you can add more letters by {@link in.srain.cube.views.ptr.header.StoreHousePath#addChar}
*/
header.initWithString('Alibaba');
```
* Config using string array from xml:
```java
header.initWithStringArray(R.array.storehouse);
```
And in `res/values/arrays.xml`:
```xml
<resources>
<string-array name="storehouse">
<item>0,35,12,42,</item>
<item>12,42,24,35,</item>
<item>24,35,12,28,</item>
<item>0,35,12,28,</item>
<item>0,21,12,28,</item>
<item>12,28,24,21,</item>
<item>24,35,24,21,</item>
<item>24,21,12,14,</item>
<item>0,21,12,14,</item>
<item>0,21,0,7,</item>
<item>12,14,0,7,</item>
<item>12,14,24,7,</item>
<item>24,7,12,0,</item>
<item>0,7,12,0,</item>
</string-array>
</resources>
```
# Process Refresh
There is a `PtrHandler`, by which you can refresh the data.
```
public interface PtrHandler {
/**
* Check can do refresh or not. For example the content is empty or the first child is in view.
* <p/>
* {@link in.srain.cube.views.ptr.PtrDefaultHandler#checkContentCanBePulledDown}
*/
public boolean checkCanDoRefresh(final PtrFrameLayout frame, final View content, final View header);
/**
* When refresh begin
*
* @param frame
*/
public void onRefreshBegin(final PtrFrameLayout frame);
}
```
An example:
```java
ptrFrame.setPtrHandler(new PtrHandler() {
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
frame.postDelayed(new Runnable() {
@Override
public void run() {
ptrFrame.refreshComplete();
}
}, 1800);
}
@Override
public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
return PtrDefaultHandler.checkContentCanBePulledDown(frame, content, header);
}
});
```
# Customize
You can add a `PtrUIHandler` to `PtrFrameLayout` to implement any UI effect you want.
```java
public interface PtrUIHandler {
/**
* When the content view has reached top and refresh has been completed, view will be reset.
*
* @param frame
*/
public void onUIReset(PtrFrameLayout frame);
/**
* prepare for loading
*
* @param frame
*/
public void onUIRefreshPrepare(PtrFrameLayout frame);
/**
* perform refreshing UI
*/
public void onUIRefreshBegin(PtrFrameLayout frame);
/**
* perform UI after refresh
*/
public void onUIRefreshComplete(PtrFrameLayout frame);
public void onUIPositionChange(PtrFrameLayout frame, boolean isUnderTouch, byte status, int oldPosition, int currentPosition, float oldPercent, float currentPercent);
}
```
# Q & A
* work with ViewPager: `disableWhenHorizontalMove()`
* work with LongPressed, `setInterceptEventWhileWorking()`
# Contact & Help
Please fell free to contact me if there is any problem when using the library.
* srain@php.net
* twitter: https://twitter.com/liaohuqiu
* weibo: http://weibo.com/liaohuqiu
* blog: http://www.liaohuqiu.net
1. About how to use cube-sdk / Ultra Ptr: 271918140 (cube-sdk)
This the rule for our tribes, please read it before you request to join: https://github.com/liaohuqiu/qq-tribe-rule
2. For those who like thinking independently and are good at solving problem independently. Please join us, we are all here on Slack:
http://join-add1bit.liaohuqiu.net/
================================================
FILE: build.gradle
================================================
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.0.0'
}
}
allprojects {
repositories {
jcenter()
mavenCentral();
maven {
url 'https://oss.sonatype.org/content/repositories/releases'
}
maven {
url 'https://oss.sonatype.org/content/repositories/snapshots'
}
}
}
================================================
FILE: buildSrc/src/main/groovy/copy-libs.gradle
================================================
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.12.+'
}
}
EXCLUDE_JAR_LIST = ['cube-sdk', 'support-v4-r7-source', 'ultra-ptr', 'support-annotation']
class CopyLibsTask extends DefaultTask {
@TaskAction
def copyLibs() {
// copy jars
copy {
from configurations.compile
into "libs"
eachFile { file ->
println file.name
for (name in EXCLUDE_JAR_LIST) {
if (file.name.contains(name)) {
file.exclude()
return
}
}
}
}
// copy source
copy {
def sourceList = configurations.compile.incoming.dependencies.collect { dependency ->
dependency.artifact { artifact ->
artifact.name = dependency.name
artifact.type = 'source'
artifact.extension = 'jar'
artifact.classifier = 'sources'
}
dependency
}
from(configurations.detachedConfiguration(sourceList as Dependency[]).resolvedConfiguration.
resolvedConfiguration.lenientConfiguration.getFiles(Specs.SATISFIES_ALL)) {
}
into("libs")
eachFile { file ->
println file.name
for (name in EXCLUDE_JAR_LIST) {
if (file.name.contains(name)) {
file.exclude()
return
}
}
}
}
}
}
================================================
FILE: gradle/wrapper/gradle-wrapper.properties
================================================
#Thu Dec 18 15:33:58 CST 2014
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
================================================
FILE: gradle.properties
================================================
ANDROID_BUILD_MIN_SDK_VERSION=8
ANDROID_BUILD_TARGET_SDK_VERSION=22
ANDROID_BUILD_SDK_VERSION=22
ANDROID_BUILD_TOOLS_VERSION=22.0.1
================================================
FILE: gradlew
================================================
#!/usr/bin/env bash
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn ( ) {
echo "$*"
}
die ( ) {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
esac
# For Cygwin, ensure paths are in UNIX format before anything is touched.
if $cygwin ; then
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
fi
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >&-
APP_HOME="`pwd -P`"
cd "$SAVED" >&-
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
================================================
FILE: gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windowz variants
if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
goto execute
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
================================================
FILE: pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>in.srain</groupId>
<artifactId>cube-parent-for-oss</artifactId>
<version>1.0.1</version>
</parent>
<groupId>in.srain</groupId>
<artifactId>cube-ptr-parent</artifactId>
<version>1.0.1</version>
<packaging>pom</packaging>
<name>Ultra Pull to Refersh Parent</name>
<modules>
<module>ptr-lib</module>
<module>ptr-demo</module>
</modules>
</project>
================================================
FILE: proguard-project.txt
================================================
# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# 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 *;
#}
-keep class in.srain.*
-dontwarn class in.srain.cube.image.ImageProvider
-dontwarn class android.graphics.Bitmap
-ignorewarnings class in.srain.cube.image.ImageProvider
-ignorewarnings class android.graphics.Bitmap
================================================
FILE: project.properties
================================================
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system edit
# "ant.properties", and override values to adapt the script to your
# project structure.
#
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
android.library=true
# Project target.
target=android-19
android.library.reference.1=../../android-CLog
================================================
FILE: ptr-demo/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest
package="in.srain.cube.views.ptr.demo"
xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:name=".app.PtrDemoApplication"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/CubeTheme.NoWindowAniAndNoTitle">
<activity android:name=".ui.activity.PtrDemoHomeActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.viewpager.ViewPagerActivity"
android:windowSoftInputMode="stateAlwaysHidden|adjustResize"></activity>
</application>
</manifest>
================================================
FILE: ptr-demo/assets/request_init/demo/image-list.json
================================================
{"data":{"time":"2014-08-27 02:13:01 UTC","list":[{"pic":"http:\/\/img4.duitang.com\/uploads\/blog\/201311\/04\/20131104193715_NCexN.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/item\/201408\/09\/20140809210610_iTSJx.thumb.jpeg"},{"pic":"http:\/\/cdn.duitang.com\/uploads\/blog\/201401\/07\/20140107223310_LH3Uy.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/item\/201405\/09\/20140509222156_kVexJ.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/item\/201306\/14\/20130614185903_raNR3.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/item\/201112\/11\/20111211191621_HU4Bj.thumb.jpg"},{"pic":"http:\/\/cdn.duitang.com\/uploads\/item\/201408\/07\/20140807224553_VXaUc.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/blog\/201407\/29\/20140729105929_GQLwC.thumb.jpeg"},{"pic":"http:\/\/img4.duitang.com\/uploads\/blog\/201408\/04\/20140804160432_LnFeB.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/blog\/201408\/04\/20140804161101_JVJea.thumb.jpeg"},{"pic":"http:\/\/cdn.duitang.com\/uploads\/blog\/201408\/04\/20140804093210_FxFNd.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/blog\/201408\/04\/20140804160314_hRKtv.thumb.jpeg"},{"pic":"http:\/\/cdn.duitang.com\/uploads\/item\/201408\/01\/20140801080524_SnGfE.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/item\/201407\/23\/20140723140958_NSWfE.thumb.jpeg"},{"pic":"http:\/\/img4.duitang.com\/uploads\/blog\/201407\/22\/20140722153305_WHejQ.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/item\/201407\/21\/20140721010148_ZBQwe.thumb.jpeg"},{"pic":"http:\/\/cdn.duitang.com\/uploads\/item\/201407\/23\/20140723085122_cmteu.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/item\/201407\/23\/20140723130620_Z2yJB.thumb.jpeg"},{"pic":"http:\/\/cdn.duitang.com\/uploads\/blog\/201407\/20\/20140720204738_NXxLE.thumb.jpeg"},{"pic":"http:\/\/cdn.duitang.com\/uploads\/item\/201407\/20\/20140720134916_VGfyh.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/blog\/201407\/17\/20140717113117_mUssJ.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/blog\/201407\/17\/20140717121501_wfFEm.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/blog\/201407\/17\/20140717121431_w4AV8.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/blog\/201407\/17\/20140717121918_TtJjY.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/item\/201407\/11\/20140711234806_FNLBQ.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/item\/201407\/18\/20140718121437_UyiAS.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/blog\/201407\/17\/20140717114829_RiCXR.thumb.jpeg"},{"pic":"http:\/\/img4.duitang.com\/uploads\/blog\/201407\/17\/20140717120301_wGFYL.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/blog\/201405\/11\/20140511121106_JXS4B.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/blog\/201405\/10\/20140510094144_kfLji.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/blog\/201405\/09\/20140509201906_kERjy.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/blog\/201405\/08\/20140508193226_UaSGB.thumb.jpeg"},{"pic":"http:\/\/img4.duitang.com\/uploads\/blog\/201405\/05\/20140505201747_aPNtf.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/blog\/201405\/06\/20140506104824_jPWQj.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/blog\/201405\/05\/20140505201105_MkXdn.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/blog\/201405\/03\/20140503205822_GCzta.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/blog\/201405\/03\/20140503205535_cCHPB.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/blog\/201405\/03\/20140503204354_xxSQX.thumb.jpeg"},{"pic":"http:\/\/img4.duitang.com\/uploads\/blog\/201404\/06\/20140406191307_GTxFd.thumb.jpeg"},{"pic":"http:\/\/img4.duitang.com\/uploads\/blog\/201404\/06\/20140406191247_BG2cU.thumb.jpeg"},{"pic":"http:\/\/img4.duitang.com\/uploads\/blog\/201404\/06\/20140406191114_MzYtw.thumb.jpeg"},{"pic":"http:\/\/img4.duitang.com\/uploads\/blog\/201404\/06\/20140406191127_fazJA.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/item\/201407\/10\/20140710081204_vYnCi.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/item\/201407\/15\/20140715133758_M2Y3J.thumb.jpeg"},{"pic":"http:\/\/img4.duitang.com\/uploads\/item\/201407\/13\/20140713190806_TGJHm.thumb.jpeg"},{"pic":"http:\/\/img4.duitang.com\/uploads\/blog\/201407\/05\/20140705223413_5r3ze.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/item\/201407\/13\/20140713012526_tcy5u.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/blog\/201407\/13\/20140713121424_Gy43T.thumb.jpeg"},{"pic":"http:\/\/img4.duitang.com\/uploads\/item\/201407\/15\/20140715033844_tcvrY.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/item\/201407\/10\/20140710181106_4HHay.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/blog\/201407\/06\/20140706122850_8PER3.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/blog\/201407\/07\/20140707192042_8xKXF.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/item\/201407\/07\/20140707063954_mVa3y.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/item\/201407\/08\/20140708093733_AFFhc.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/blog\/201407\/07\/20140707161220_unvzn.thumb.jpeg"},{"pic":"http:\/\/img4.duitang.com\/uploads\/blog\/201407\/07\/20140707113856_hBf3R.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/item\/201308\/26\/20130826090203_NtuYA.thumb.jpeg"},{"pic":"http:\/\/img4.duitang.com\/uploads\/item\/201407\/07\/20140707145925_dHeKV.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/item\/201406\/25\/20140625101534_xiZxN.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/blog\/201406\/30\/20140630150534_EWUVY.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/item\/201406\/25\/20140625121626_ZmT5n.thumb.jpeg"},{"pic":"http:\/\/img4.duitang.com\/uploads\/blog\/201307\/31\/20130731231806_4yGxV.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/item\/201406\/28\/20140628122218_fLQyP.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/blog\/201406\/26\/20140626131831_MrdKP.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/blog\/201406\/16\/20140616165201_nuKWj.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/item\/201406\/25\/20140625140308_KP4rn.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/item\/201406\/25\/20140625121604_2auuA.thumb.jpeg"},{"pic":"http:\/\/img4.duitang.com\/uploads\/item\/201406\/25\/20140625131625_LmmLZ.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/item\/201406\/25\/20140625132851_mPmKY.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/item\/201406\/25\/20140625133312_ZtmW4.thumb.jpeg"},{"pic":"http:\/\/img5.duitang.com\/uploads\/item\/201406\/25\/20140625164858_AuafS.thumb.jpeg"}]},"server_time":"2014-08-27 02:13:01"}
================================================
FILE: ptr-demo/build.gradle
================================================
apply plugin: 'com.android.application'
android {
compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION)
buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION
defaultConfig {
applicationId "in.srain.cube.views.ptr.demo"
minSdkVersion 8
targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION)
}
lintOptions {
abortOnError false
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['resources']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
// aidl.srcDirs = ['src']
// renderscript.srcDirs = ['src']
}
androidTest.setRoot('tests')
}
dexOptions {
preDexLibraries = false
}
}
def EXCLUDE_JAR_LIST = ['cube-sdk', 'support-v4-r7-source', 'ultra-ptr', 'support-annotation', 'ptr-lib']
task copyLibs << {
// copy jars
copy {
from configurations.compile
into "libs"
eachFile { file ->
println file.name
for (name in EXCLUDE_JAR_LIST) {
if (file.name.contains(name)) {
file.exclude()
return
}
}
}
}
// copy source
copy {
def sourceList = configurations.compile.incoming.dependencies.collect { dependency ->
dependency.artifact { artifact ->
artifact.name = dependency.name
artifact.type = 'source'
artifact.extension = 'jar'
artifact.classifier = 'sources'
}
dependency
}
from(configurations.detachedConfiguration(sourceList as Dependency[]).resolvedConfiguration.
resolvedConfiguration.lenientConfiguration.getFiles(Specs.SATISFIES_ALL)) {
}
into("libs")
eachFile { file ->
println file.name
for (name in EXCLUDE_JAR_LIST) {
if (file.name.contains(name)) {
file.exclude()
return
}
}
}
}
}
dependencies {
compile(project(':ptr-lib')) {
}
compile 'in.srain.cube:clog:1.0.2'
compile 'in.srain.cube:cube-sdk:1.0.44.39-SNAPSHOT@aar'
compile 'com.google.android:support-v4:r7'
}
================================================
FILE: ptr-demo/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>in.srain</groupId>
<artifactId>cube-parent-for-oss</artifactId>
<version>1.0.1</version>
</parent>
<groupId>in.srain.cube</groupId>
<artifactId>ultra-ptr-demo</artifactId>
<packaging>apk</packaging>
<name>Ultra Pull to Refresh Demo</name>
<version>1.0.1</version>
<dependencies>
<dependency>
<groupId>com.google.android</groupId>
<artifactId>android</artifactId>
<version>4.1.1.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.android</groupId>
<artifactId>support-v4</artifactId>
<version>r7</version>
</dependency>
<dependency>
<groupId>in.srain.cube</groupId>
<artifactId>ultra-ptr</artifactId>
<type>aar</type>
<version>1.0.11</version>
</dependency>
<dependency>
<groupId>in.srain.cube</groupId>
<artifactId>cube-sdk</artifactId>
<type>aar</type>
<version>1.0.44.39-SNAPSHOT</version>
</dependency>
</dependencies>
<properties>
<android_maven_plugin_version>3.8.2</android_maven_plugin_version>
<android_compile_api_level>16</android_compile_api_level>
</properties>
<build>
<finalName>${project.artifactId}</finalName>
<sourceDirectory>src/</sourceDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<!-- compile plugin -->
<plugin>
<groupId>com.jayway.maven.plugins.android.generation2</groupId>
<artifactId>android-maven-plugin</artifactId>
<extensions>true</extensions>
<version>${android_maven_plugin_version}</version>
<configuration>
<sdk>
<platform>${android_compile_api_level}</platform>
</sdk>
<sign>
<debug>false</debug>
</sign>
</configuration>
</plugin>
</plugins>
</build>
</project>
================================================
FILE: ptr-demo/proguard-project.txt
================================================
# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# 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 *;
#}
================================================
FILE: ptr-demo/proguard-rules.pro
================================================
-keep class in.srain.*
-dontwarn android.graphics.Bitmap
================================================
FILE: ptr-demo/project.properties
================================================
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system edit
# "ant.properties", and override values to adapt the script to your
# project structure.
#
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target.
target=android-19
================================================
FILE: ptr-demo/res/drawable/image_border.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#ffffff" />
<stroke
android:width="1px"
android:color="#007edf" />
</shape>
================================================
FILE: ptr-demo/res/drawable/text_view_bg.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/cube_holo_orange_light" android:state_pressed="true" />
<item android:drawable="@color/cube_holo_orange_dark" />
</selector>
================================================
FILE: ptr-demo/res/drawable/with_long_press_list_item_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/cube_mints_f1f1f1" android:state_selected="true" />
<item android:drawable="@color/cube_mints_f1f1f1" android:state_pressed="true" />
<item android:drawable="@color/cube_mints_white" android:state_selected="false" />
</selector>
================================================
FILE: ptr-demo/res/layout/activity_main.xml
================================================
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:id="@+id/id_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
</LinearLayout>
================================================
FILE: ptr-demo/res/layout/activity_view_pager.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cube_mints_f1f1f1"
android:orientation="vertical">
<in.srain.cube.views.pager.TabPageIndicator
android:id="@+id/view_pager_tab_indicator"
android:layout_width="match_parent"
android:layout_height="36dp"
android:background="@color/cube_mints_white"
android:fadingEdge="none"
android:paddingLeft="15dp"
android:paddingRight="15dp" />
<in.srain.cube.views.ptr.PtrClassicFrameLayout
android:id="@+id/view_pager_ptr_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">
<android.support.v4.view.ViewPager
android:id="@+id/view_pager_view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cube_mints_white" />
</in.srain.cube.views.ptr.PtrClassicFrameLayout>
</LinearLayout>
================================================
FILE: ptr-demo/res/layout/fragment_classic_header_with_gridview.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<in.srain.cube.views.ptr.PtrClassicFrameLayout
android:id="@+id/rotate_header_grid_view_frame"
xmlns:cube_ptr="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cube_mints_f1f1f1"
cube_ptr:ptr_duration_to_close="200"
cube_ptr:ptr_duration_to_close_header="1000"
cube_ptr:ptr_keep_header_when_refresh="true"
cube_ptr:ptr_pull_to_fresh="false"
cube_ptr:ptr_ratio_of_header_height_to_refresh="1.2"
cube_ptr:ptr_resistance="1.7">
<GridView
android:id="@+id/rotate_header_grid_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cube_mints_white"
android:fadingEdge="none"
android:focusable="false"
android:horizontalSpacing="10dp"
android:listSelector="@android:color/transparent"
android:numColumns="2"
android:paddingBottom="12dp"
android:paddingLeft="12dp"
android:paddingRight="12dp"
android:scrollbars="none"
android:stretchMode="columnWidth" />
</in.srain.cube.views.ptr.PtrClassicFrameLayout>
</RelativeLayout>
================================================
FILE: ptr-demo/res/layout/fragment_classic_header_with_list_view.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<in.srain.cube.views.ptr.PtrClassicFrameLayout
android:id="@+id/rotate_header_list_view_frame"
xmlns:cube_ptr="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cube_mints_f1f1f1"
cube_ptr:ptr_duration_to_close="200"
cube_ptr:ptr_duration_to_close_header="1000"
cube_ptr:ptr_keep_header_when_refresh="true"
cube_ptr:ptr_pull_to_fresh="false"
cube_ptr:ptr_ratio_of_header_height_to_refresh="1.2"
cube_ptr:ptr_resistance="1.7">
<ListView
android:id="@+id/rotate_header_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@null"
android:fadingEdge="none"
android:listSelector="@android:color/transparent"
android:paddingLeft="12dp"
android:paddingRight="12dp"
android:scrollbarStyle="outsideOverlay"
android:choiceMode="singleChoice" />
</in.srain.cube.views.ptr.PtrClassicFrameLayout>
</RelativeLayout>
================================================
FILE: ptr-demo/res/layout/fragment_classic_header_with_list_view_and_empty_view.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cube_mints_white">
<TextView
android:id="@+id/list_view_with_empty_view_fragment_empty_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center"
android:text="@string/ptr_demo_block_with_list_view_and_empty_view_tip"
android:textColor="@color/cube_holo_blue_dark"
android:textSize="20sp" />
<in.srain.cube.views.ptr.PtrClassicFrameLayout
android:id="@+id/list_view_with_empty_view_fragment_ptr_frame"
xmlns:cube_ptr="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cube_mints_f1f1f1"
cube_ptr:ptr_duration_to_close="200"
cube_ptr:ptr_duration_to_close_header="1000"
cube_ptr:ptr_keep_header_when_refresh="true"
cube_ptr:ptr_pull_to_fresh="false"
cube_ptr:ptr_ratio_of_header_height_to_refresh="1.2"
cube_ptr:ptr_resistance="1.7">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/list_view_with_empty_view_fragment_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:choiceMode="singleChoice"
android:divider="@null"
android:fadingEdge="none"
android:listSelector="@android:color/transparent"
android:paddingLeft="12dp"
android:paddingRight="12dp"
android:scrollbarStyle="outsideOverlay" />
</FrameLayout>
</in.srain.cube.views.ptr.PtrClassicFrameLayout>
</RelativeLayout>
================================================
FILE: ptr-demo/res/layout/fragment_classic_header_with_scroll_view.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<in.srain.cube.views.ptr.PtrClassicFrameLayout
android:id="@+id/rotate_header_web_view_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cube_mints_f1f1f1"
app:ptr_duration_to_close="200"
app:ptr_duration_to_close_header="1000"
app:ptr_keep_header_when_refresh="true"
app:ptr_pull_to_fresh="false"
app:ptr_ratio_of_header_height_to_refresh="1.2"
app:ptr_resistance="1.7">
<ScrollView
android:id="@+id/rotate_header_scroll_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_margin="@dimen/cube_mints_content_view_padding"
android:background="@drawable/text_view_bg"
android:clickable="true"
android:gravity="center"
android:text="text 1"
android:textColor="@color/cube_mints_white"
android:textSize="30sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="400dp"
android:layout_margin="@dimen/cube_mints_content_view_padding"
android:background="@drawable/text_view_bg"
android:clickable="true"
android:gravity="center"
android:text="text 2"
android:textColor="@color/cube_mints_white"
android:textSize="30sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="300dp"
android:layout_margin="@dimen/cube_mints_content_view_padding"
android:background="@drawable/text_view_bg"
android:clickable="true"
android:gravity="center"
android:text="text 3"
android:textColor="@color/cube_mints_white"
android:textSize="30sp" />
</LinearLayout>
</ScrollView>
</in.srain.cube.views.ptr.PtrClassicFrameLayout>
</RelativeLayout>
================================================
FILE: ptr-demo/res/layout/fragment_classic_header_with_textview.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f1f1f1">
<in.srain.cube.views.ptr.PtrClassicFrameLayout
android:id="@+id/fragment_rotate_header_with_text_view_frame"
xmlns:cube_ptr="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#fff"
cube_ptr:ptr_duration_to_close="200"
cube_ptr:ptr_duration_to_close_header="1000"
cube_ptr:ptr_keep_header_when_refresh="true"
cube_ptr:ptr_pull_to_fresh="false"
cube_ptr:ptr_ratio_of_header_height_to_refresh="1.2"
cube_ptr:ptr_resistance="1.7">
<TextView
android:id="@+id/fragment_rotate_header_with_text_view_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="@dimen/cube_mints_content_view_padding"
android:clickable="true"
android:background="@drawable/text_view_bg"
android:gravity="center"
android:text="I am a TextView"
android:textColor="@color/cube_mints_white"
android:textSize="30sp" />
</in.srain.cube.views.ptr.PtrClassicFrameLayout>
</RelativeLayout>
================================================
FILE: ptr-demo/res/layout/fragment_classic_header_with_viewgroup.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cube_mints_f1f1f1">
<in.srain.cube.views.ptr.PtrClassicFrameLayout
android:id="@+id/fragment_rotate_header_with_view_group_frame"
xmlns:cube_ptr="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
cube_ptr:ptr_duration_to_close="200"
cube_ptr:ptr_duration_to_close_header="1000"
cube_ptr:ptr_keep_header_when_refresh="true"
cube_ptr:ptr_pull_to_fresh="false"
cube_ptr:ptr_ratio_of_header_height_to_refresh="1.2"
cube_ptr:ptr_resistance="1.7">
<FrameLayout
android:id="@+id/fragment_rotate_header_with_view_group_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cube_mints_white"
android:paddingLeft="@dimen/cube_mints_content_view_padding"
android:paddingRight="@dimen/cube_mints_content_view_padding"
android:paddingTop="100dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/cube_mints_4d90fe"
android:gravity="center"
android:padding="@dimen/cube_mints_content_view_padding"
android:text="I am a TextView in FrameLayout"
android:textColor="@color/cube_mints_white"
android:textSize="30sp" />
</FrameLayout>
</in.srain.cube.views.ptr.PtrClassicFrameLayout>
</RelativeLayout>
================================================
FILE: ptr-demo/res/layout/fragment_classic_header_with_webview.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<in.srain.cube.views.ptr.PtrClassicFrameLayout
android:id="@+id/rotate_header_web_view_frame"
xmlns:cube_ptr="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cube_mints_f1f1f1"
cube_ptr:ptr_duration_to_close="200"
cube_ptr:ptr_duration_to_close_header="1000"
cube_ptr:ptr_keep_header_when_refresh="true"
cube_ptr:ptr_pull_to_fresh="false"
cube_ptr:ptr_ratio_of_header_height_to_refresh="1.2"
cube_ptr:ptr_resistance="1.7">
<WebView
android:id="@+id/rotate_header_web_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</in.srain.cube.views.ptr.PtrClassicFrameLayout>
</RelativeLayout>
================================================
FILE: ptr-demo/res/layout/fragment_materail_style.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cube_mints_f1f1f1">
<in.srain.cube.views.ptr.PtrFrameLayout
android:id="@+id/material_style_ptr_frame"
xmlns:cube_ptr="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
cube_ptr:ptr_duration_to_close="300"
cube_ptr:ptr_duration_to_close_header="2000"
cube_ptr:ptr_keep_header_when_refresh="true"
cube_ptr:ptr_pull_to_fresh="false"
cube_ptr:ptr_ratio_of_header_height_to_refresh="1.2"
cube_ptr:ptr_resistance="1.7">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cube_mints_white"
android:clickable="true"
android:padding="10dp">
<in.srain.cube.image.CubeImageView
android:id="@+id/material_style_image_view"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:layout_height="match_parent" />
</LinearLayout>
</in.srain.cube.views.ptr.PtrFrameLayout>
</RelativeLayout>
================================================
FILE: ptr-demo/res/layout/fragment_ptr_home.xml
================================================
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<in.srain.cube.views.ptr.PtrFrameLayout
android:id="@+id/fragment_ptr_home_ptr_frame"
xmlns:cube_ptr="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
cube_ptr:ptr_duration_to_close="200"
cube_ptr:ptr_duration_to_close_header="1000"
cube_ptr:ptr_keep_header_when_refresh="true"
cube_ptr:ptr_pull_to_fresh="false"
cube_ptr:ptr_ratio_of_header_height_to_refresh="1.2"
cube_ptr:ptr_resistance="1.7">
<ScrollView
android:id="@+id/fragment_block_menu_scroll_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cube_mints_white">
<in.srain.cube.views.block.BlockListView
android:id="@+id/fragment_block_menu_block_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/cube_mints_content_view_padding" />
</ScrollView>
</in.srain.cube.views.ptr.PtrFrameLayout>
</LinearLayout>
================================================
FILE: ptr-demo/res/layout/fragment_storehouse_header.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#333333">
<in.srain.cube.views.ptr.PtrFrameLayout
android:id="@+id/store_house_ptr_frame"
xmlns:cube_ptr="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
cube_ptr:ptr_duration_to_close="300"
cube_ptr:ptr_duration_to_close_header="2000"
cube_ptr:ptr_keep_header_when_refresh="true"
cube_ptr:ptr_pull_to_fresh="false"
cube_ptr:ptr_ratio_of_header_height_to_refresh="1.2"
cube_ptr:ptr_resistance="1.7">
<LinearLayout
android:id="@+id/store_house_ptr_image_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cube_mints_333333"
android:clickable="true"
android:padding="10dp">
<in.srain.cube.image.CubeImageView
android:id="@+id/store_house_ptr_image"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</in.srain.cube.views.ptr.PtrFrameLayout>
</RelativeLayout>
================================================
FILE: ptr-demo/res/layout/fragment_view_pager.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cube_mints_white">
<ListView
android:id="@+id/view_pager_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@null"
android:fadingEdge="none"
android:listSelector="@android:color/transparent"
android:paddingLeft="12dp"
android:paddingRight="12dp"
android:scrollbarStyle="outsideOverlay" />
</RelativeLayout>
================================================
FILE: ptr-demo/res/layout/fragment_with_long_press.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cube_mints_f1f1f1"
android:orientation="vertical">
<in.srain.cube.views.ptr.PtrClassicFrameLayout
android:id="@+id/with_long_press_list_view_frame"
xmlns:cube_ptr="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
cube_ptr:ptr_content="@+id/with_long_press_list_view">
<ListView
android:id="@+id/with_long_press_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cube_mints_white"
android:cacheColorHint="@android:color/transparent"
android:divider="#dddddd"
android:dividerHeight="1px"
android:fadingEdge="none"
android:focusable="false"
android:listSelector="@android:color/transparent"
android:scrollbars="none" />
</in.srain.cube.views.ptr.PtrClassicFrameLayout>
</LinearLayout>
================================================
FILE: ptr-demo/res/layout/list_view_item.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"
android:background="@drawable/image_border">
<in.srain.cube.image.CubeImageView
android:id="@+id/list_view_item_image_view"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginBottom="5dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp"
android:scaleType="fitCenter" />
</FrameLayout>
</FrameLayout>
================================================
FILE: ptr-demo/res/layout/view_pager_fragment_list_view_header.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="15dp"
android:paddingTop="15dp">
<TextView
android:id="@+id/view_pager_fragment_list_view_header_title"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_weight="1"
android:gravity="center"
android:padding="5dp"
android:textColor="#000"
android:textSize="16sp" />
</LinearLayout>
================================================
FILE: ptr-demo/res/layout/view_pager_indicator_item.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:orientation="vertical">
<TextView
android:id="@+id/view_pager_indicator_name"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:textColor="#000"
android:textSize="16sp" />
<TextView
android:id="@+id/view_pager_indicator_tab_current"
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="@color/cube_mints_4d90fe" />
</LinearLayout>
</LinearLayout>
================================================
FILE: ptr-demo/res/layout/with_grid_view_item_image_list_grid.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingTop="15dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="1dp">
<in.srain.cube.image.CubeImageView
android:id="@+id/with_grid_view_item_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitCenter" />
</LinearLayout>
</LinearLayout>
================================================
FILE: ptr-demo/res/layout/with_long_press_list_view_item.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/with_long_press_list_item_background"
android:orientation="horizontal"
android:paddingBottom="15dp"
android:paddingLeft="20dp"
android:paddingTop="15dp">
<in.srain.cube.image.CubeImageView
android:id="@+id/with_long_press_list_image"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginBottom="5dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp"
android:scaleType="centerCrop" />
</LinearLayout>
</FrameLayout>
================================================
FILE: ptr-demo/res/values/arrays.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="akta">
<item>22,0,0,30,</item>
<item>22,0,30,0,</item>
<item>30,0,52,30,</item>
<item>0,30,26,30,</item>
<item>60,0,60,15,</item>
<item>60,15,60,30,</item>
<item>60,15,85,15,</item>
<item>85,15,108,0,</item>
<item>85,15,108,30,</item>
<item>117,0,147,0,</item>
<item>147,0,177,0,</item>
<item>147,0,147,32,</item>
<item>198,0,176,30,</item>
<item>198,0,206,0,</item>
<item>206,0,228,30,</item>
<item>176,30,202,30,</item>
</string-array>
<string-array name="storehouse">
<item>0,35,12,42,</item>
<item>12,42,24,35,</item>
<item>24,35,12,28,</item>
<item>0,35,12,28,</item>
<item>0,21,12,28,</item>
<item>12,28,24,21,</item>
<item>24,35,24,21,</item>
<item>24,21,12,14,</item>
<item>0,21,12,14,</item>
<item>0,21,0,7,</item>
<item>12,14,0,7,</item>
<item>12,14,24,7,</item>
<item>24,7,12,0,</item>
<item>0,7,12,0,</item>
</string-array>
<integer-array name="google_colors">
<item>@color/red</item>
<item>@color/blue</item>
<item>@color/yellow</item>
<item>@color/green</item>
</integer-array>
</resources>
================================================
FILE: ptr-demo/res/values/ptr_demo_colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="red">#FFC93437</color>
<color name="blue">#FF375BF1</color>
<color name="yellow">#FFF7D23E</color>
<color name="green">#FF34A350</color>
</resources>
================================================
FILE: ptr-demo/res/values/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Ultra PTR</string>
<string name="ptr_demo_block_for_home">Ultra Pull to Refresh</string>
<string name="ptr_demo_block_grid_view">Contains A GridView</string>
<string name="ptr_demo_block_list_view">Contains A ListView</string>
<string name="ptr_demo_block_web_view">Contains A WebView</string>
<string name="ptr_demo_block_scroll_view">Contains ScrollView</string>
<string name="ptr_demo_block_frame_layout">Contains A FrameLayout</string>
<string name="ptr_demo_block_only_text_view">Contains Even A TextView</string>
<string name="ptr_demo_block_with_list_view_and_empty_view">EmptyView and ListView</string>
<string name="ptr_demo_block_with_list_view_and_empty_view_tip">It\' empty. \n\nClick to load data.</string>
<string name="ptr_demo_block_pull_to_refresh">Pull to Refresh</string>
<string name="ptr_demo_block_release_to_refresh">Release to Refresh</string>
<string name="ptr_demo_block_auto_fresh">Auto Refresh</string>
<string name="ptr_demo_block_keep_header">Keep Header while Refreshing</string>
<string name="ptr_demo_block_hide_header">Hide Header while Refreshing</string>
<string name="ptr_demo_block_with_long_press">Long Press</string>
<string name="ptr_demo_block_with_view_pager">View Pager</string>
<string name="ptr_demo_block_storehouse_header_using_string_array">StoreHouse Style \nusing string array from xml</string>
<string name="ptr_demo_storehouse_header_using_string_array_in_title">using xml: </string>
<string name="ptr_demo_block_storehouse_header_using_string">StoreHouse Style \n\nusing string</string>
<string name="ptr_demo_storehouse_header_using_string_in_title">using string: </string>
<string name="ptr_demo_storehouse_header_using_point_list">Using Point List</string>
<string name="ptr_demo_material_style">Material Style</string>
<string name="ptr_demo_rentals_style">Rentals Style</string>
<string name="ptr_demo_placeholder">To be continued</string>
<string name="ptr_demo_material_style_pin_content">Material Style\nPin Content\n v4 style</string>
<string name="ptr_demo_enable_next_ptr_at_once">Enable Next PTR at once</string>
</resources>
================================================
FILE: ptr-demo/res/values-zh/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Ultra PTR</string>
<string name="ptr_demo_block_auto_fresh">自动刷新</string>
<string name="ptr_demo_block_frame_layout">包含FrameLayout</string>
<string name="ptr_demo_block_grid_view">包含GridView</string>
<string name="ptr_demo_block_hide_header">刷新时不显示头部</string>
<string name="ptr_demo_block_keep_header">刷新时显示头部</string>
<string name="ptr_demo_block_only_text_view">仅包含一个TextView</string>
<string name="ptr_demo_block_pull_to_refresh">下拉刷新</string>
<string name="ptr_demo_block_release_to_refresh">释放刷新</string>
<string name="ptr_demo_block_storehouse_header_using_string_array">StoreHouse Style \n使用xml中的字符串数组</string>
<string name="ptr_demo_storehouse_header_using_string_array_in_title">使用xml:  </string>
<string name="ptr_demo_block_storehouse_header_using_string">StoreHouse Style \n\n使用字符串</string>
<string name="ptr_demo_storehouse_header_using_string_in_title">使用字符串: </string>
<string name="ptr_demo_material_style_pin_content">Material Style\n内容不动,原生风格</string>
<string name="ptr_demo_enable_next_ptr_at_once">立即下拉刷新,不等UIReset</string>
</resources>
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/app/PtrDemoApplication.java
================================================
package in.srain.cube.views.ptr.demo.app;
import android.app.Application;
import in.srain.cube.Cube;
import in.srain.cube.image.ImageLoaderFactory;
import in.srain.cube.request.RequestCacheManager;
import in.srain.cube.util.CLog;
import in.srain.cube.util.CubeDebug;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.demo.image.DemoDuiTangImageReSizer;
import in.srain.cube.views.ptr.demo.image.PtrImageLoadHandler;
public class PtrDemoApplication extends Application {
public static PtrDemoApplication instance;
@Override
public void onCreate() {
super.onCreate();
instance = this;
String environment = "";
if (environment.equals("production")) {
CLog.setLogLevel(CLog.LEVEL_ERROR);
} else if (environment.equals("beta")) {
CLog.setLogLevel(CLog.LEVEL_WARNING);
} else {
// development
CLog.setLogLevel(CLog.LEVEL_VERBOSE);
}
CubeDebug.DEBUG_IMAGE = true;
PtrFrameLayout.DEBUG = true;
PtrFrameLayout.DEBUG = false;
ImageLoaderFactory.setDefaultImageReSizer(DemoDuiTangImageReSizer.getInstance());
ImageLoaderFactory.setDefaultImageLoadHandler(new PtrImageLoadHandler());
String dir = "request-cache";
// ImageLoaderFactory.init(this);
RequestCacheManager.init(this, dir, 1024 * 10, 1024 * 10);
Cube.onCreate(this);
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/data/DemoRequestData.java
================================================
package in.srain.cube.views.ptr.demo.data;
import in.srain.cube.request.*;
public class DemoRequestData {
public static void getImageList(final RequestFinishHandler<JsonData> requestFinishHandler) {
CacheAbleRequestHandler requestHandler = new CacheAbleRequestJsonHandler() {
@Override
public void onCacheAbleRequestFinish(JsonData data, CacheAbleRequest.ResultType type, boolean outOfDate) {
requestFinishHandler.onRequestFinish(data);
}
};
CacheAbleRequest<JsonData> request = new CacheAbleRequest<JsonData>(requestHandler);
String url = "http://cube-server.liaohuqiu.net/api_demo/image-list.php";
request.setCacheTime(3600);
request.setTimeout(1000);
request.getRequestData().setRequestUrl(url);
request.setAssertInitDataPath("request_init/demo/image-list.json");
request.setCacheKey("image-list-1");
request.send();
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/image/DemoDuiTangImageReSizer.java
================================================
package in.srain.cube.views.ptr.demo.image;
import in.srain.cube.image.ImageTask;
import in.srain.cube.image.impl.DefaultImageReSizer;
import in.srain.cube.util.CLog;
/**
* Created by srain on 8/19/14.
*/
public class DemoDuiTangImageReSizer extends DefaultImageReSizer {
private static DemoDuiTangImageReSizer sInstance;
public static DemoDuiTangImageReSizer getInstance() {
if (sInstance == null) {
sInstance = new DemoDuiTangImageReSizer();
}
return sInstance;
}
private static String TAG = "thumb";
private static String SP = "_";
private static String DOT = ".";
private static final int[] CDN_FIX_WIDTH_SIZE = {110, 150, 170, 220, 240, 290, 450, 580, 620, 790};
@Override
public String getRemoteUrl(ImageTask imageTask) {
String url = imageTask.getOriginUrl();
int size = findBestCDNSize(CDN_FIX_WIDTH_SIZE, imageTask.getRequestSize().x, true);
url = url.replace(TAG, TAG + DOT + size + SP + size);
CLog.d("test", "getRemoteUrl: %s %s", imageTask.getRequestSize(), url);
return url;
}
private static int binarySearch(int[] srcArray, int des, boolean higher) {
int low = 0;
int high = srcArray.length - 1;
while (low <= high) {
int middle = (low + high) / 2;
if (des == srcArray[middle]) {
return middle;
} else if (des < srcArray[middle]) {
high = middle - 1;
} else {
low = middle + 1;
}
}
if (high < 0)
return 0;
if (higher) {
if (des > srcArray[high] && high + 1 <= srcArray.length - 1) {
high = high + 1;
}
} else {
if (des < srcArray[high] && high - 1 >= 0)
high = high - 1;
}
return high;
}
private static int findBestCDNSize(int[] array, int size, boolean higher) {
if (size >= array[array.length - 1]) {
return array[array.length - 1];
}
int pos = binarySearch(array, size, higher);
return array[pos];
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/image/Images.java
================================================
package in.srain.cube.views.ptr.demo.image;
import in.srain.cube.image.ImageReuseInfoManger;
public class Images {
private static final String[] sizeList = new String[]{"small_180", "big_360", "big"};
public static final ImageReuseInfoManger sImageReuseInfoManger = new ImageReuseInfoManger(sizeList);
public final static String[] imageUrls = new String[]{
"http://img4.duitang.com/uploads/blog/201311/04/20131104193715_NCexN.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201408/09/20140809210610_iTSJx.thumb.jpeg",
"http://cdn.duitang.com/uploads/blog/201401/07/20140107223310_LH3Uy.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201405/09/20140509222156_kVexJ.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201306/14/20130614185903_raNR3.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201112/11/20111211191621_HU4Bj.thumb.jpg",
"http://cdn.duitang.com/uploads/item/201408/07/20140807224553_VXaUc.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201407/29/20140729105929_GQLwC.thumb.jpeg",
"http://img4.duitang.com/uploads/blog/201408/04/20140804160432_LnFeB.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201408/04/20140804161101_JVJea.thumb.jpeg",
"http://cdn.duitang.com/uploads/blog/201408/04/20140804093210_FxFNd.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201408/04/20140804160314_hRKtv.thumb.jpeg",
"http://cdn.duitang.com/uploads/item/201408/01/20140801080524_SnGfE.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201407/23/20140723140958_NSWfE.thumb.jpeg",
"http://img4.duitang.com/uploads/blog/201407/22/20140722153305_WHejQ.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201407/21/20140721010148_ZBQwe.thumb.jpeg",
"http://cdn.duitang.com/uploads/item/201407/23/20140723085122_cmteu.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201407/23/20140723130620_Z2yJB.thumb.jpeg",
"http://cdn.duitang.com/uploads/blog/201407/20/20140720204738_NXxLE.thumb.jpeg",
"http://cdn.duitang.com/uploads/item/201407/20/20140720134916_VGfyh.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201407/17/20140717113117_mUssJ.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201407/17/20140717121501_wfFEm.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201407/17/20140717121431_w4AV8.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201407/17/20140717121918_TtJjY.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201407/11/20140711234806_FNLBQ.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201407/18/20140718121437_UyiAS.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201407/17/20140717114829_RiCXR.thumb.jpeg",
"http://img4.duitang.com/uploads/blog/201407/17/20140717120301_wGFYL.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201405/11/20140511121106_JXS4B.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201405/10/20140510094144_kfLji.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201405/09/20140509201906_kERjy.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201405/08/20140508193226_UaSGB.thumb.jpeg",
"http://img4.duitang.com/uploads/blog/201405/05/20140505201747_aPNtf.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201405/06/20140506104824_jPWQj.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201405/05/20140505201105_MkXdn.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201405/03/20140503205822_GCzta.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201405/03/20140503205535_cCHPB.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201405/03/20140503204354_xxSQX.thumb.jpeg",
"http://img4.duitang.com/uploads/blog/201404/06/20140406191307_GTxFd.thumb.jpeg",
"http://img4.duitang.com/uploads/blog/201404/06/20140406191247_BG2cU.thumb.jpeg",
"http://img4.duitang.com/uploads/blog/201404/06/20140406191114_MzYtw.thumb.jpeg",
"http://img4.duitang.com/uploads/blog/201404/06/20140406191127_fazJA.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201407/10/20140710081204_vYnCi.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201407/15/20140715133758_M2Y3J.thumb.jpeg",
"http://img4.duitang.com/uploads/item/201407/13/20140713190806_TGJHm.thumb.jpeg",
"http://img4.duitang.com/uploads/blog/201407/05/20140705223413_5r3ze.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201407/13/20140713012526_tcy5u.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201407/13/20140713121424_Gy43T.thumb.jpeg",
"http://img4.duitang.com/uploads/item/201407/15/20140715033844_tcvrY.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201407/10/20140710181106_4HHay.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201407/06/20140706122850_8PER3.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201407/07/20140707192042_8xKXF.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201407/07/20140707063954_mVa3y.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201407/08/20140708093733_AFFhc.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201407/07/20140707161220_unvzn.thumb.jpeg",
"http://img4.duitang.com/uploads/blog/201407/07/20140707113856_hBf3R.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201308/26/20130826090203_NtuYA.thumb.jpeg",
"http://img4.duitang.com/uploads/item/201407/07/20140707145925_dHeKV.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/25/20140625101534_xiZxN.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201406/30/20140630150534_EWUVY.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/25/20140625121626_ZmT5n.thumb.jpeg",
"http://img4.duitang.com/uploads/blog/201307/31/20130731231806_4yGxV.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/28/20140628122218_fLQyP.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201406/26/20140626131831_MrdKP.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201406/16/20140616165201_nuKWj.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/25/20140625140308_KP4rn.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/25/20140625121604_2auuA.thumb.jpeg",
"http://img4.duitang.com/uploads/item/201406/25/20140625131625_LmmLZ.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/25/20140625132851_mPmKY.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/25/20140625133312_ZtmW4.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/25/20140625164858_AuafS.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/24/20140624114145_e4iVw.thumb.jpeg",
"http://cdn.duitang.com/uploads/item/201406/25/20140625100427_Hkxj5.thumb.jpeg",
"http://cdn.duitang.com/uploads/blog/201406/25/20140625213455_VHHcL.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/25/20140625132659_UuES4.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/24/20140624020050_zCE4U.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/18/20140618152533_dJjtW.thumb.jpeg",
"http://cdn.duitang.com/uploads/item/201406/20/20140620075216_twZE4.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/22/20140622162247_Z4WK4.thumb.jpeg",
"http://cdn.duitang.com/uploads/item/201406/20/20140620075158_TnyKU.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201406/18/20140618235506_5QJwc.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/18/20140618152515_AFcLy.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/03/20140603001954_NjKfX.thumb.jpeg",
"http://cdn.duitang.com/uploads/item/201405/31/20140531232042_4FkHQ.thumb.jpeg",
"http://img4.duitang.com/uploads/blog/201406/13/20140613002234_LHXcT.thumb.jpeg",
"http://img4.duitang.com/uploads/item/201405/31/20140531231843_J5Euh.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/11/20140611220941_xBeyi.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/13/20140613114809_yuHRV.thumb.jpeg",
"http://cdn.duitang.com/uploads/item/201406/13/20140613120109_yL8hk.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201406/01/20140601185856_Q5jZr.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/06/20140606004724_GxQHQ.thumb.jpeg",
"http://img4.duitang.com/uploads/item/201406/08/20140608003809_3JnEK.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/10/20140610085447_zeXJU.thumb.jpeg",
"http://img4.duitang.com/uploads/blog/201406/08/20140608193617_HyFrY.thumb.jpeg",
"http://img4.duitang.com/uploads/item/201405/30/20140530190040_KQdsM.thumb.jpeg",
"http://cdn.duitang.com/uploads/item/201406/09/20140609101937_UBfJJ.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201406/10/20140610170410_cFhwW.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/09/20140609225334_PdGwG.thumb.jpeg",
"http://img4.duitang.com/uploads/blog/201406/09/20140609184438_e33i2.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201405/29/20140529200010_AfL8f.thumb.jpeg",
"http://img4.duitang.com/uploads/blog/201406/08/20140608104649_KVtMx.thumb.png",
"http://img5.duitang.com/uploads/item/201406/01/20140601215152_wi4wf.thumb.jpeg",
"http://cdn.duitang.com/uploads/blog/201406/08/20140608194234_FEGkW.thumb.jpeg",
"http://img4.duitang.com/uploads/item/201405/31/20140531221002_Awtv8.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/08/20140608091030_TJ3Cc.thumb.jpeg",
"http://cdn.duitang.com/uploads/item/201405/31/20140531221355_cSCTt.thumb.jpeg",
"http://cdn.duitang.com/uploads/item/201406/08/20140608005415_arBdK.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/08/20140608000002_2MTjn.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/03/20140603012613_z88sn.thumb.jpeg",
"http://cdn.duitang.com/uploads/item/201405/31/20140531221745_rnAzU.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201405/31/20140531220735_XBxFP.thumb.jpeg",
"http://cdn.duitang.com/uploads/blog/201406/08/20140608194112_uEYf5.thumb.jpeg",
"http://img5.duitang.com/uploads/blog/201406/08/20140608225626_xc2QT.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/07/20140607235759_sNS5Z.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201405/31/20140531220635_Lrw3w.thumb.jpeg",
"http://cdn.duitang.com/uploads/item/201406/08/20140608004245_jmBmP.thumb.jpeg",
"http://img4.duitang.com/uploads/item/201406/08/20140608020213_SBfGH.thumb.jpeg",
"http://cdn.duitang.com/uploads/item/201406/08/20140608214105_kvVVY.thumb.jpeg",
"http://img5.duitang.com/uploads/item/201406/03/20140603001556_XsMEv.thumb.jpeg",
"http://cdn.duitang.com/uploads/item/201406/08/20140608024120_XjjGB.thumb.jpeg",
};
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/image/PtrImageLoadHandler.java
================================================
package in.srain.cube.views.ptr.demo.image;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import in.srain.cube.image.CubeImageView;
import in.srain.cube.image.ImageTask;
import in.srain.cube.image.iface.ImageLoadHandler;
public class PtrImageLoadHandler implements ImageLoadHandler {
@Override
public void onLoading(ImageTask imageTask, CubeImageView cubeImageView) {
if (cubeImageView != null) {
cubeImageView.setImageDrawable(new ColorDrawable(Color.GRAY));
}
}
@Override
public void onLoadFinish(ImageTask imageTask, CubeImageView cubeImageView, BitmapDrawable bitmapDrawable) {
if (bitmapDrawable != null && cubeImageView != null) {
cubeImageView.setImageDrawable(bitmapDrawable);
}
}
@Override
public void onLoadError(ImageTask imageTask, CubeImageView cubeImageView, int i) {
if (cubeImageView != null) {
cubeImageView.setImageDrawable(new ColorDrawable(Color.RED));
}
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/EnableNextPTRAtOnce.java
================================================
package in.srain.cube.views.ptr.demo.ui;
import in.srain.cube.views.ptr.PtrClassicFrameLayout;
import in.srain.cube.views.ptr.demo.R;
import in.srain.cube.views.ptr.demo.ui.classic.WithTextViewInFrameLayoutFragment;
public class EnableNextPTRAtOnce extends WithTextViewInFrameLayoutFragment {
@Override
protected void setupViews(PtrClassicFrameLayout ptrFrame) {
setHeaderTitle(R.string.ptr_demo_enable_next_ptr_at_once);
ptrFrame.setEnabledNextPtrAtOnce(true);
ptrFrame.setPullToRefresh(false);
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/MaterialStyleFragment.java
================================================
package in.srain.cube.views.ptr.demo.ui;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.TransitionDrawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import in.srain.cube.image.CubeImageView;
import in.srain.cube.image.ImageLoader;
import in.srain.cube.image.ImageLoaderFactory;
import in.srain.cube.image.ImageTask;
import in.srain.cube.image.iface.ImageLoadHandler;
import in.srain.cube.mints.base.TitleBaseFragment;
import in.srain.cube.util.LocalDisplay;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.PtrHandler;
import in.srain.cube.views.ptr.demo.R;
import in.srain.cube.views.ptr.header.MaterialHeader;
public class MaterialStyleFragment extends TitleBaseFragment {
private String mUrl = "http://img5.duitang.com/uploads/blog/201407/17/20140717113117_mUssJ.thumb.jpeg";
private long mStartLoadingTime = -1;
private boolean mImageHasLoaded = false;
protected PtrFrameLayout mPtrFrameLayout;
@Override
public void onEnter(Object data) {
if (data != null && data instanceof String) {
mUrl = (String) data;
}
}
@Override
protected View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_materail_style, null);
setHeaderTitle(R.string.ptr_demo_material_style);
final CubeImageView imageView = (CubeImageView) view.findViewById(R.id.material_style_image_view);
final ImageLoader imageLoader = ImageLoaderFactory.create(getContext());
mPtrFrameLayout = (PtrFrameLayout) view.findViewById(R.id.material_style_ptr_frame);
// header
final MaterialHeader header = new MaterialHeader(getContext());
int[] colors = getResources().getIntArray(R.array.google_colors);
header.setColorSchemeColors(colors);
header.setLayoutParams(new PtrFrameLayout.LayoutParams(-1, -2));
header.setPadding(0, LocalDisplay.dp2px(15), 0, LocalDisplay.dp2px(10));
header.setPtrFrameLayout(mPtrFrameLayout);
mPtrFrameLayout.setLoadingMinTime(1000);
mPtrFrameLayout.setDurationToCloseHeader(1500);
mPtrFrameLayout.setHeaderView(header);
mPtrFrameLayout.addPtrUIHandler(header);
mPtrFrameLayout.postDelayed(new Runnable() {
@Override
public void run() {
mPtrFrameLayout.autoRefresh(false);
}
}, 100);
mPtrFrameLayout.setPtrHandler(new PtrHandler() {
@Override
public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
return true;
}
@Override
public void onRefreshBegin(final PtrFrameLayout frame) {
if (mImageHasLoaded) {
long delay = (long) (1000 + Math.random() * 2000);
delay = Math.max(0, delay);
delay = 0;
frame.postDelayed(new Runnable() {
@Override
public void run() {
frame.refreshComplete();
}
}, delay);
} else {
mStartLoadingTime = System.currentTimeMillis();
imageView.loadImage(imageLoader, mUrl);
}
}
});
ImageLoadHandler imageLoadHandler = new ImageLoadHandler() {
@Override
public void onLoading(ImageTask imageTask, CubeImageView cubeImageView) {
}
@Override
public void onLoadFinish(ImageTask imageTask, final CubeImageView cubeImageView, final BitmapDrawable bitmapDrawable) {
mImageHasLoaded = true;
long delay = Math.max(0, 1000 - (System.currentTimeMillis() - mStartLoadingTime));
delay = 0;
mPtrFrameLayout.postDelayed(new Runnable() {
@Override
public void run() {
if (cubeImageView != null && bitmapDrawable != null) {
TransitionDrawable w1 = new TransitionDrawable(new Drawable[]{new ColorDrawable(Color.WHITE), (Drawable) bitmapDrawable});
imageView.setImageDrawable(w1);
w1.startTransition(200);
}
mPtrFrameLayout.refreshComplete();
}
}, delay);
}
@Override
public void onLoadError(ImageTask imageTask, CubeImageView cubeImageView, int i) {
}
};
imageLoader.setImageLoadHandler(imageLoadHandler);
return view;
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/MaterialStylePinContentFragment.java
================================================
package in.srain.cube.views.ptr.demo.ui;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class MaterialStylePinContentFragment extends MaterialStyleFragment {
@Override
protected View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = super.createView(inflater, container, savedInstanceState);
// close at once
mPtrFrameLayout.setDurationToClose(100);
mPtrFrameLayout.setPinContent(true);
return view;
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/PtrDemoHomeFragment.java
================================================
package in.srain.cube.views.ptr.demo.ui;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import in.srain.cube.mints.base.BlockMenuFragment;
import in.srain.cube.util.LocalDisplay;
import in.srain.cube.views.ptr.PtrDefaultHandler;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.PtrHandler;
import in.srain.cube.views.ptr.demo.R;
import in.srain.cube.views.ptr.demo.ui.classic.*;
import in.srain.cube.views.ptr.demo.ui.storehouse.StoreHouseUsingPointList;
import in.srain.cube.views.ptr.demo.ui.storehouse.StoreHouseUsingString;
import in.srain.cube.views.ptr.demo.ui.storehouse.StoreHouseUsingStringArray;
import in.srain.cube.views.ptr.demo.ui.viewpager.ViewPagerActivity;
import in.srain.cube.views.ptr.header.StoreHouseHeader;
import java.util.ArrayList;
public class PtrDemoHomeFragment extends BlockMenuFragment {
@Override
protected void addItemInfo(ArrayList<BlockMenuFragment.MenuItemInfo> itemInfos) {
// GridView
itemInfos.add(newItemInfo(R.string.ptr_demo_block_grid_view, R.color.cube_mints_4d90fe, new OnClickListener() {
@Override
public void onClick(View v) {
getContext().pushFragmentToBackStack(WithGridView.class, null);
}
}));
itemInfos.add(newItemInfo(R.string.ptr_demo_block_frame_layout, R.color.cube_mints_4d90fe, new OnClickListener() {
@Override
public void onClick(View v) {
getContext().pushFragmentToBackStack(WithTextViewInFrameLayoutFragment.class, null);
}
}));
itemInfos.add(newItemInfo(R.string.ptr_demo_block_only_text_view, R.color.cube_mints_4d90fe, new OnClickListener() {
@Override
public void onClick(View v) {
getContext().pushFragmentToBackStack(EvenOnlyATextView.class, null);
}
}));
itemInfos.add(newItemInfo(R.string.ptr_demo_block_list_view, R.color.cube_mints_4d90fe, new OnClickListener() {
@Override
public void onClick(View v) {
getContext().pushFragmentToBackStack(WithListView.class, null);
}
}));
itemInfos.add(newItemInfo(R.string.ptr_demo_block_web_view, R.color.cube_mints_4d90fe, new OnClickListener() {
@Override
public void onClick(View v) {
getContext().pushFragmentToBackStack(WithWebView.class, null);
}
}));
itemInfos.add(newItemInfo(R.string.ptr_demo_block_with_list_view_and_empty_view, R.color.cube_mints_4d90fe, new OnClickListener() {
@Override
public void onClick(View v) {
getContext().pushFragmentToBackStack(WithListViewAndEmptyView.class, null);
}
}));
itemInfos.add(newItemInfo(R.string.ptr_demo_block_scroll_view, R.color.cube_mints_4d90fe, new OnClickListener() {
@Override
public void onClick(View v) {
getContext().pushFragmentToBackStack(WithScrollView.class, null);
}
}));
itemInfos.add(null);
itemInfos.add(null);
itemInfos.add(newItemInfo(R.string.ptr_demo_block_keep_header, R.color.cube_mints_4d90fe, new OnClickListener() {
@Override
public void onClick(View v) {
getContext().pushFragmentToBackStack(KeepHeader.class, null);
}
}));
itemInfos.add(newItemInfo(R.string.ptr_demo_block_hide_header, R.color.cube_mints_4d90fe, new OnClickListener() {
@Override
public void onClick(View v) {
getContext().pushFragmentToBackStack(HideHeader.class, null);
}
}));
itemInfos.add(newItemInfo(R.string.ptr_demo_block_release_to_refresh, R.color.cube_mints_4d90fe, new OnClickListener() {
@Override
public void onClick(View v) {
getContext().pushFragmentToBackStack(ReleaseToRefresh.class, null);
}
}));
itemInfos.add(newItemInfo(R.string.ptr_demo_block_pull_to_refresh, R.color.cube_mints_4d90fe, new OnClickListener() {
@Override
public void onClick(View v) {
getContext().pushFragmentToBackStack(PullToRefresh.class, null);
}
}));
itemInfos.add(newItemInfo(R.string.ptr_demo_block_auto_fresh, R.color.cube_mints_4d90fe, new OnClickListener() {
@Override
public void onClick(View v) {
getContext().pushFragmentToBackStack(AutoRefresh.class, null);
}
}));
itemInfos.add(null);
itemInfos.add(newItemInfo(R.string.ptr_demo_block_storehouse_header_using_string_array, R.color.cube_mints_4d90fe, new OnClickListener() {
@Override
public void onClick(View v) {
getContext().pushFragmentToBackStack(StoreHouseUsingStringArray.class, null);
}
}));
itemInfos.add(newItemInfo(R.string.ptr_demo_block_storehouse_header_using_string, R.color.cube_mints_4d90fe, new OnClickListener() {
@Override
public void onClick(View v) {
getContext().pushFragmentToBackStack(StoreHouseUsingString.class, null);
}
}));
itemInfos.add(newItemInfo(R.string.ptr_demo_storehouse_header_using_point_list, R.color.cube_mints_4d90fe, new OnClickListener() {
@Override
public void onClick(View v) {
getContext().pushFragmentToBackStack(StoreHouseUsingPointList.class, null);
}
}));
itemInfos.add(newItemInfo(R.string.ptr_demo_material_style, R.color.cube_mints_4d90fe, new OnClickListener() {
@Override
public void onClick(View v) {
getContext().pushFragmentToBackStack(MaterialStyleFragment.class, null);
}
}));
itemInfos.add(newItemInfo(R.string.ptr_demo_material_style_pin_content, R.color.cube_mints_4d90fe, new OnClickListener() {
@Override
public void onClick(View v) {
getContext().pushFragmentToBackStack(MaterialStylePinContentFragment.class, null);
}
}));
itemInfos.add(newItemInfo(R.string.ptr_demo_block_with_long_press, R.color.cube_mints_4d90fe, new OnClickListener() {
@Override
public void onClick(View v) {
getContext().pushFragmentToBackStack(WithLongPressFragment.class, null);
}
}));
itemInfos.add(newItemInfo(R.string.ptr_demo_block_with_view_pager, R.color.cube_mints_4d90fe, new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(getContext(), ViewPagerActivity.class);
startActivity(intent);
}
}));
itemInfos.add(newItemInfo(R.string.ptr_demo_rentals_style, R.color.cube_mints_4d90fe, new OnClickListener() {
@Override
public void onClick(View v) {
getContext().pushFragmentToBackStack(RentalsStyleFragment.class, null);
}
}));
itemInfos.add(newItemInfo(R.string.ptr_demo_enable_next_ptr_at_once, R.color.cube_mints_4d90fe, new OnClickListener() {
@Override
public void onClick(View v) {
getContext().pushFragmentToBackStack(EnableNextPTRAtOnce.class, null);
}
}));
itemInfos.add(newItemInfo(R.string.ptr_demo_placeholder, R.color.cube_mints_4d90fe, new OnClickListener() {
@Override
public void onClick(View v) {
}
}));
itemInfos.add(newItemInfo(R.string.ptr_demo_placeholder, R.color.cube_mints_4d90fe, new OnClickListener() {
@Override
public void onClick(View v) {
}
}));
itemInfos.add(newItemInfo(R.string.ptr_demo_placeholder, R.color.cube_mints_4d90fe, new OnClickListener() {
@Override
public void onClick(View v) {
}
}));
}
@Override
protected View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = super.createView(inflater, container, savedInstanceState);
view.setBackgroundColor(getResources().getColor(R.color.cube_mints_333333));
final PtrFrameLayout ptrFrameLayout = (PtrFrameLayout) view.findViewById(R.id.fragment_ptr_home_ptr_frame);
StoreHouseHeader header = new StoreHouseHeader(getContext());
header.setPadding(0, LocalDisplay.dp2px(20), 0, LocalDisplay.dp2px(20));
header.initWithString("Ultra PTR");
ptrFrameLayout.setDurationToCloseHeader(1500);
ptrFrameLayout.setHeaderView(header);
ptrFrameLayout.addPtrUIHandler(header);
ptrFrameLayout.setPtrHandler(new PtrHandler() {
@Override
public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
return PtrDefaultHandler.checkContentCanBePulledDown(frame, content, header);
}
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
ptrFrameLayout.postDelayed(new Runnable() {
@Override
public void run() {
ptrFrameLayout.refreshComplete();
}
}, 1500);
}
});
return view;
}
@Override
protected int getLayoutId() {
return R.layout.fragment_ptr_home;
}
@Override
protected void setupViews(View view) {
super.setupViews(view);
setHeaderTitle(R.string.ptr_demo_block_for_home);
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/RentalsStyleFragment.java
================================================
package in.srain.cube.views.ptr.demo.ui;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.TransitionDrawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import in.srain.cube.image.CubeImageView;
import in.srain.cube.image.ImageLoader;
import in.srain.cube.image.ImageLoaderFactory;
import in.srain.cube.image.ImageTask;
import in.srain.cube.image.iface.ImageLoadHandler;
import in.srain.cube.mints.base.TitleBaseFragment;
import in.srain.cube.util.LocalDisplay;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.PtrHandler;
import in.srain.cube.views.ptr.demo.R;
import in.srain.cube.views.ptr.demo.ui.header.RentalsSunHeaderView;
public class RentalsStyleFragment extends TitleBaseFragment {
private String mUrl = "http://img4.duitang.com/uploads/blog/201407/07/20140707113856_hBf3R.thumb.jpeg";
private long mStartLoadingTime = -1;
private boolean mImageHasLoaded = false;
@Override
public void onEnter(Object data) {
if (data != null && data instanceof String) {
mUrl = (String) data;
}
}
@Override
protected View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_materail_style, null);
setHeaderTitle(R.string.ptr_demo_rentals_style);
final CubeImageView imageView = (CubeImageView) view.findViewById(R.id.material_style_image_view);
final ImageLoader imageLoader = ImageLoaderFactory.create(getContext());
final PtrFrameLayout frame = (PtrFrameLayout) view.findViewById(R.id.material_style_ptr_frame);
// header
final RentalsSunHeaderView header = new RentalsSunHeaderView(getContext());
header.setLayoutParams(new PtrFrameLayout.LayoutParams(-1, -2));
header.setPadding(0, LocalDisplay.dp2px(15), 0, LocalDisplay.dp2px(10));
header.setUp(frame);
frame.setLoadingMinTime(1000);
frame.setDurationToCloseHeader(1500);
frame.setHeaderView(header);
frame.addPtrUIHandler(header);
// frame.setPullToRefresh(true);
frame.postDelayed(new Runnable() {
@Override
public void run() {
frame.autoRefresh(true);
}
}, 100);
frame.setPtrHandler(new PtrHandler() {
@Override
public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
return true;
}
@Override
public void onRefreshBegin(final PtrFrameLayout frame) {
if (mImageHasLoaded) {
long delay = 1500;
frame.postDelayed(new Runnable() {
@Override
public void run() {
frame.refreshComplete();
}
}, delay);
} else {
mStartLoadingTime = System.currentTimeMillis();
imageView.loadImage(imageLoader, mUrl);
}
}
});
ImageLoadHandler imageLoadHandler = new ImageLoadHandler() {
@Override
public void onLoading(ImageTask imageTask, CubeImageView cubeImageView) {
}
@Override
public void onLoadFinish(ImageTask imageTask, final CubeImageView cubeImageView, final BitmapDrawable bitmapDrawable) {
mImageHasLoaded = true;
long delay = 1500;
frame.postDelayed(new Runnable() {
@Override
public void run() {
if (cubeImageView != null && bitmapDrawable != null) {
TransitionDrawable w1 = new TransitionDrawable(new Drawable[]{new ColorDrawable(Color.WHITE), (Drawable) bitmapDrawable});
imageView.setImageDrawable(w1);
w1.startTransition(200);
}
frame.refreshComplete();
}
}, delay);
}
@Override
public void onLoadError(ImageTask imageTask, CubeImageView cubeImageView, int i) {
}
};
imageLoader.setImageLoadHandler(imageLoadHandler);
return view;
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/Utils.java
================================================
package in.srain.cube.views.ptr.demo.ui;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.RelativeLayout;
import in.srain.cube.util.LocalDisplay;
import in.srain.cube.views.ptr.demo.R;
public class Utils {
public static View createSimpleLoadingTip(Context context) {
final View view = LayoutInflater.from(context).inflate(R.layout.cube_ptr_simple_loading, null);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(-2, -2);
lp.setMargins(0, 0, 0, LocalDisplay.dp2px(4));
lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
lp.addRule(RelativeLayout.CENTER_VERTICAL);
view.setLayoutParams(lp);
view.setVisibility(View.INVISIBLE);
return view;
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/WithLongPressFragment.java
================================================
package in.srain.cube.views.ptr.demo.ui;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import in.srain.cube.image.CubeImageView;
import in.srain.cube.image.ImageLoader;
import in.srain.cube.image.ImageLoaderFactory;
import in.srain.cube.mints.base.TitleBaseFragment;
import in.srain.cube.views.list.ListViewDataAdapter;
import in.srain.cube.views.list.ViewHolderBase;
import in.srain.cube.views.ptr.PtrDefaultHandler;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.demo.R;
import in.srain.cube.views.ptr.demo.image.Images;
import java.util.Arrays;
public class WithLongPressFragment extends TitleBaseFragment {
private ImageLoader mImageLoader;
@Override
protected View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mImageLoader = ImageLoaderFactory.create(getActivity());
View view = inflater.inflate(R.layout.fragment_with_long_press, null);
setHeaderTitle(R.string.ptr_demo_block_with_long_press);
final PtrFrameLayout ptrFrameLayout = (PtrFrameLayout) view.findViewById(R.id.with_long_press_list_view_frame);
ListView listView = (ListView) view.findViewById(R.id.with_long_press_list_view);
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getContext(), "Long Pressed: " + id, Toast.LENGTH_SHORT).show();
return true;
}
});
final ListViewDataAdapter<String> listViewDataAdapter = new ListViewDataAdapter<String>();
listViewDataAdapter.setViewHolderClass(this, ViewHolder.class);
ptrFrameLayout.setPtrHandler(new PtrDefaultHandler() {
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
ptrFrameLayout.postDelayed(new Runnable() {
@Override
public void run() {
listViewDataAdapter.getDataList().clear();
listViewDataAdapter.getDataList().addAll(Arrays.asList(Images.imageUrls));
listViewDataAdapter.notifyDataSetChanged();
ptrFrameLayout.refreshComplete();
}
}, 2000);
}
});
ptrFrameLayout.postDelayed(new Runnable() {
@Override
public void run() {
ptrFrameLayout.autoRefresh();
}
}, 100);
listView.setAdapter(listViewDataAdapter);
return view;
}
private class ViewHolder extends ViewHolderBase<String> {
private CubeImageView mImageView;
/**
* create a view from resource Xml file, and hold the view that may be used in displaying data.
*
* @param layoutInflater
*/
@Override
public View createView(LayoutInflater layoutInflater) {
View view = layoutInflater.inflate(R.layout.with_long_press_list_view_item, null);
mImageView = (CubeImageView) view.findViewById(R.id.with_long_press_list_image);
return view;
}
/**
* using the held views to display data
*
* @param position
* @param itemData
*/
@Override
public void showData(int position, String itemData) {
mImageView.loadImage(mImageLoader, itemData);
}
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/activity/PtrDemoHomeActivity.java
================================================
package in.srain.cube.views.ptr.demo.ui.activity;
import android.os.Bundle;
import in.srain.cube.mints.base.MintsBaseActivity;
import in.srain.cube.views.ptr.demo.R;
import in.srain.cube.views.ptr.demo.ui.PtrDemoHomeFragment;
public class PtrDemoHomeActivity extends MintsBaseActivity {
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_main);
pushFragmentToBackStack(PtrDemoHomeFragment.class, null);
}
@Override
protected int getFragmentContainerId() {
return R.id.id_fragment;
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/AutoRefresh.java
================================================
package in.srain.cube.views.ptr.demo.ui.classic;
import in.srain.cube.views.ptr.PtrClassicFrameLayout;
import in.srain.cube.views.ptr.demo.R;
public class AutoRefresh extends WithGridView {
@Override
protected void setupViews(final PtrClassicFrameLayout ptrFrame) {
ptrFrame.setLoadingMinTime(3000);
setHeaderTitle(R.string.ptr_demo_block_auto_fresh);
ptrFrame.postDelayed(new Runnable() {
@Override
public void run() {
ptrFrame.autoRefresh(true);
}
}, 150);
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/EvenOnlyATextView.java
================================================
package in.srain.cube.views.ptr.demo.ui.classic;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import in.srain.cube.mints.base.TitleBaseFragment;
import in.srain.cube.views.ptr.PtrClassicFrameLayout;
import in.srain.cube.views.ptr.PtrDefaultHandler;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.demo.R;
public class EvenOnlyATextView extends TitleBaseFragment {
public View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setHeaderTitle(R.string.ptr_demo_block_only_text_view);
final View contentView = inflater.inflate(R.layout.fragment_classic_header_with_textview, container, false);
final PtrClassicFrameLayout ptrFrame = (PtrClassicFrameLayout) contentView.findViewById(R.id.fragment_rotate_header_with_text_view_frame);
ptrFrame.setLastUpdateTimeRelateObject(this);
ptrFrame.setPtrHandler(new PtrDefaultHandler() {
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
frame.postDelayed(new Runnable() {
@Override
public void run() {
ptrFrame.refreshComplete();
}
}, 1500);
}
@Override
public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
return true;
}
});
return contentView;
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/HideHeader.java
================================================
package in.srain.cube.views.ptr.demo.ui.classic;
import android.view.View;
import in.srain.cube.views.ptr.PtrClassicFrameLayout;
import in.srain.cube.views.ptr.PtrDefaultHandler;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.demo.R;
import in.srain.cube.views.ptr.demo.ui.Utils;
public class HideHeader extends WithTextViewInFrameLayoutFragment {
@Override
protected void setupViews(final PtrClassicFrameLayout ptrFrame) {
setHeaderTitle(R.string.ptr_demo_block_hide_header);
ptrFrame.setKeepHeaderWhenRefresh(false);
final View loading = Utils.createSimpleLoadingTip(getContext());
mTitleHeaderBar.getRightViewContainer().addView(loading);
ptrFrame.setPtrHandler(new PtrDefaultHandler() {
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
loading.setVisibility(View.VISIBLE);
frame.postDelayed(new Runnable() {
@Override
public void run() {
loading.setVisibility(View.INVISIBLE);
ptrFrame.refreshComplete();
}
}, 1500);
}
@Override
public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
return true;
}
});
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/KeepHeader.java
================================================
package in.srain.cube.views.ptr.demo.ui.classic;
import in.srain.cube.views.ptr.PtrClassicFrameLayout;
import in.srain.cube.views.ptr.demo.R;
public class KeepHeader extends WithTextViewInFrameLayoutFragment {
@Override
protected void setupViews(PtrClassicFrameLayout ptrFrame) {
setHeaderTitle(R.string.ptr_demo_block_keep_header);
ptrFrame.setKeepHeaderWhenRefresh(true);
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/PullToRefresh.java
================================================
package in.srain.cube.views.ptr.demo.ui.classic;
import in.srain.cube.views.ptr.PtrClassicFrameLayout;
import in.srain.cube.views.ptr.demo.R;
public class PullToRefresh extends WithTextViewInFrameLayoutFragment {
@Override
protected void setupViews(PtrClassicFrameLayout ptrFrame) {
setHeaderTitle(R.string.ptr_demo_block_pull_to_refresh);
ptrFrame.setPullToRefresh(true);
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/ReleaseToRefresh.java
================================================
package in.srain.cube.views.ptr.demo.ui.classic;
import in.srain.cube.views.ptr.PtrClassicFrameLayout;
import in.srain.cube.views.ptr.demo.R;
public class ReleaseToRefresh extends WithTextViewInFrameLayoutFragment {
@Override
protected void setupViews(PtrClassicFrameLayout ptrFrame) {
setHeaderTitle(R.string.ptr_demo_block_release_to_refresh);
ptrFrame.setPullToRefresh(false);
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/WithGridView.java
================================================
package in.srain.cube.views.ptr.demo.ui.classic;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import in.srain.cube.image.CubeImageView;
import in.srain.cube.image.ImageLoader;
import in.srain.cube.image.ImageLoaderFactory;
import in.srain.cube.mints.base.TitleBaseFragment;
import in.srain.cube.request.JsonData;
import in.srain.cube.request.RequestFinishHandler;
import in.srain.cube.util.LocalDisplay;
import in.srain.cube.views.list.ListViewDataAdapter;
import in.srain.cube.views.list.ViewHolderBase;
import in.srain.cube.views.list.ViewHolderCreator;
import in.srain.cube.views.ptr.PtrClassicFrameLayout;
import in.srain.cube.views.ptr.PtrDefaultHandler;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.PtrHandler;
import in.srain.cube.views.ptr.demo.R;
import in.srain.cube.views.ptr.demo.data.DemoRequestData;
import in.srain.cube.views.ptr.demo.ui.MaterialStyleFragment;
public class WithGridView extends TitleBaseFragment {
private static final int sGirdImageSize = (LocalDisplay.SCREEN_WIDTH_PIXELS - LocalDisplay.dp2px(12 + 12 + 10)) / 2;
private ImageLoader mImageLoader;
private ListViewDataAdapter<JsonData> mAdapter;
private PtrClassicFrameLayout mPtrFrame;
@Override
public View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setHeaderTitle(R.string.ptr_demo_block_grid_view);
mImageLoader = ImageLoaderFactory.create(getContext());
final View contentView = inflater.inflate(R.layout.fragment_classic_header_with_gridview, null);
final GridView gridListView = (GridView) contentView.findViewById(R.id.rotate_header_grid_view);
gridListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (position >= 0) {
final String url = mAdapter.getItem(position).optString("pic");
if (!TextUtils.isEmpty(url)) {
getContext().pushFragmentToBackStack(MaterialStyleFragment.class, url);
}
}
}
});
mAdapter = new ListViewDataAdapter<JsonData>(new ViewHolderCreator<JsonData>() {
@Override
public ViewHolderBase<JsonData> createViewHolder(int position) {
return new ViewHolder();
}
});
gridListView.setAdapter(mAdapter);
mPtrFrame = (PtrClassicFrameLayout) contentView.findViewById(R.id.rotate_header_grid_view_frame);
mPtrFrame.setLastUpdateTimeRelateObject(this);
mPtrFrame.setPtrHandler(new PtrHandler() {
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
updateData();
}
@Override
public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
return PtrDefaultHandler.checkContentCanBePulledDown(frame, content, header);
}
});
// the following are default settings
mPtrFrame.setResistance(1.7f);
mPtrFrame.setRatioOfHeaderHeightToRefresh(1.2f);
mPtrFrame.setDurationToClose(200);
mPtrFrame.setDurationToCloseHeader(1000);
// default is false
mPtrFrame.setPullToRefresh(false);
// default is true
mPtrFrame.setKeepHeaderWhenRefresh(true);
mPtrFrame.postDelayed(new Runnable() {
@Override
public void run() {
// mPtrFrame.autoRefresh();
}
}, 100);
// updateData();
setupViews(mPtrFrame);
return contentView;
}
protected void setupViews(final PtrClassicFrameLayout ptrFrame) {
}
protected void updateData() {
DemoRequestData.getImageList(new RequestFinishHandler<JsonData>() {
@Override
public void onRequestFinish(final JsonData data) {
mPtrFrame.postDelayed(new Runnable() {
@Override
public void run() {
mAdapter.getDataList().clear();
mAdapter.getDataList().addAll(data.optJson("data").optJson("list").toArrayList());
mPtrFrame.refreshComplete();
mAdapter.notifyDataSetChanged();
}
}, 0);
}
});
}
private class ViewHolder extends ViewHolderBase<JsonData> {
private CubeImageView mImageView;
@Override
public View createView(LayoutInflater inflater) {
View view = LayoutInflater.from(getActivity()).inflate(R.layout.with_grid_view_item_image_list_grid, null);
mImageView = (CubeImageView) view.findViewById(R.id.with_grid_view_item_image);
mImageView.setScaleType(ScaleType.CENTER_CROP);
LinearLayout.LayoutParams lyp = new LinearLayout.LayoutParams(sGirdImageSize, sGirdImageSize);
mImageView.setLayoutParams(lyp);
return view;
}
@Override
public void showData(int position, JsonData itemData) {
String url = itemData.optString("pic");
mImageView.loadImage(mImageLoader, url);
}
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/WithListView.java
================================================
package in.srain.cube.views.ptr.demo.ui.classic;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import in.srain.cube.image.CubeImageView;
import in.srain.cube.image.ImageLoader;
import in.srain.cube.image.ImageLoaderFactory;
import in.srain.cube.mints.base.TitleBaseFragment;
import in.srain.cube.request.JsonData;
import in.srain.cube.request.RequestFinishHandler;
import in.srain.cube.views.list.ListViewDataAdapter;
import in.srain.cube.views.list.ViewHolderBase;
import in.srain.cube.views.ptr.PtrClassicFrameLayout;
import in.srain.cube.views.ptr.PtrDefaultHandler;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.PtrHandler;
import in.srain.cube.views.ptr.demo.R;
import in.srain.cube.views.ptr.demo.data.DemoRequestData;
import in.srain.cube.views.ptr.demo.ui.MaterialStyleFragment;
public class WithListView extends TitleBaseFragment {
private ImageLoader mImageLoader;
private ListViewDataAdapter<JsonData> mAdapter;
private PtrClassicFrameLayout mPtrFrame;
@Override
public View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setHeaderTitle(R.string.ptr_demo_block_list_view);
mImageLoader = ImageLoaderFactory.create(getContext());
final View contentView = inflater.inflate(R.layout.fragment_classic_header_with_list_view, null);
final ListView listView = (ListView) contentView.findViewById(R.id.rotate_header_list_view);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (position >= 0) {
final String url = mAdapter.getItem(position).optString("pic");
if (!TextUtils.isEmpty(url)) {
getContext().pushFragmentToBackStack(MaterialStyleFragment.class, url);
}
}
}
});
mAdapter = new ListViewDataAdapter<JsonData>();
mAdapter.setViewHolderClass(this, ViewHolder.class);
listView.setAdapter(mAdapter);
mPtrFrame = (PtrClassicFrameLayout) contentView.findViewById(R.id.rotate_header_list_view_frame);
mPtrFrame.setLastUpdateTimeRelateObject(this);
mPtrFrame.setPtrHandler(new PtrHandler() {
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
updateData();
}
@Override
public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
return PtrDefaultHandler.checkContentCanBePulledDown(frame, content, header);
}
});
// the following are default settings
mPtrFrame.setResistance(1.7f);
mPtrFrame.setRatioOfHeaderHeightToRefresh(1.2f);
mPtrFrame.setDurationToClose(200);
mPtrFrame.setDurationToCloseHeader(1000);
// default is false
mPtrFrame.setPullToRefresh(false);
// default is true
mPtrFrame.setKeepHeaderWhenRefresh(true);
mPtrFrame.postDelayed(new Runnable() {
@Override
public void run() {
mPtrFrame.autoRefresh();
}
}, 100);
return contentView;
}
protected void updateData() {
DemoRequestData.getImageList(new RequestFinishHandler<JsonData>() {
@Override
public void onRequestFinish(final JsonData data) {
mPtrFrame.postDelayed(new Runnable() {
@Override
public void run() {
mAdapter.getDataList().clear();
mAdapter.getDataList().addAll(data.optJson("data").optJson("list").toArrayList());
mPtrFrame.refreshComplete();
mAdapter.notifyDataSetChanged();
}
}, 0);
}
});
}
private class ViewHolder extends ViewHolderBase<JsonData> {
private CubeImageView mImageView;
@Override
public View createView(LayoutInflater inflater) {
View v = inflater.inflate(R.layout.list_view_item, null);
mImageView = (CubeImageView) v.findViewById(R.id.list_view_item_image_view);
mImageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
return v;
}
@Override
public void showData(int position, JsonData itemData) {
mImageView.loadImage(mImageLoader, itemData.optString("pic"));
}
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/WithListViewAndEmptyView.java
================================================
package in.srain.cube.views.ptr.demo.ui.classic;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import in.srain.cube.image.CubeImageView;
import in.srain.cube.image.ImageLoader;
import in.srain.cube.image.ImageLoaderFactory;
import in.srain.cube.mints.base.TitleBaseFragment;
import in.srain.cube.request.JsonData;
import in.srain.cube.request.RequestFinishHandler;
import in.srain.cube.views.list.ListViewDataAdapter;
import in.srain.cube.views.list.ViewHolderBase;
import in.srain.cube.views.ptr.PtrClassicFrameLayout;
import in.srain.cube.views.ptr.PtrDefaultHandler;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.PtrHandler;
import in.srain.cube.views.ptr.demo.R;
import in.srain.cube.views.ptr.demo.data.DemoRequestData;
import in.srain.cube.views.ptr.demo.ui.MaterialStyleFragment;
public class WithListViewAndEmptyView extends TitleBaseFragment {
private ImageLoader mImageLoader;
private ListViewDataAdapter<JsonData> mAdapter;
private PtrClassicFrameLayout mPtrFrame;
private TextView mTextView;
private ListView mListView;
@Override
public View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setHeaderTitle(R.string.ptr_demo_block_with_list_view_and_empty_view);
mImageLoader = ImageLoaderFactory.create(getContext());
final View contentView = inflater.inflate(R.layout.fragment_classic_header_with_list_view_and_empty_view, null);
mTextView = (TextView) contentView.findViewById(R.id.list_view_with_empty_view_fragment_empty_view);
mPtrFrame = (PtrClassicFrameLayout) contentView.findViewById(R.id.list_view_with_empty_view_fragment_ptr_frame);
mTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPtrFrame.setVisibility(View.VISIBLE);
mPtrFrame.autoRefresh();
}
});
mListView = (ListView) contentView.findViewById(R.id.list_view_with_empty_view_fragment_list_view);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (position >= 0) {
final String url = mAdapter.getItem(position).optString("pic");
if (!TextUtils.isEmpty(url)) {
getContext().pushFragmentToBackStack(MaterialStyleFragment.class, url);
}
}
}
});
// show empty view
mPtrFrame.setVisibility(View.INVISIBLE);
mTextView.setVisibility(View.VISIBLE);
mAdapter = new ListViewDataAdapter<JsonData>();
mAdapter.setViewHolderClass(this, ViewHolder.class);
mListView.setAdapter(mAdapter);
mPtrFrame.setLastUpdateTimeRelateObject(this);
mPtrFrame.setPtrHandler(new PtrHandler() {
@Override
public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
// here check $mListView instead of $content
return PtrDefaultHandler.checkContentCanBePulledDown(frame, mListView, header);
}
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
updateData();
}
});
// the following are default settings
mPtrFrame.setResistance(1.7f);
mPtrFrame.setRatioOfHeaderHeightToRefresh(1.2f);
mPtrFrame.setDurationToClose(200);
mPtrFrame.setDurationToCloseHeader(1000);
// default is false
mPtrFrame.setPullToRefresh(false);
// default is true
mPtrFrame.setKeepHeaderWhenRefresh(true);
return contentView;
}
protected void updateData() {
DemoRequestData.getImageList(new RequestFinishHandler<JsonData>() {
@Override
public void onRequestFinish(final JsonData data) {
displayData(data);
}
});
}
private void displayData(JsonData data) {
mTextView.setVisibility(View.GONE);
mAdapter.getDataList().clear();
mAdapter.getDataList().addAll(data.optJson("data").optJson("list").toArrayList());
mPtrFrame.refreshComplete();
mAdapter.notifyDataSetChanged();
}
private class ViewHolder extends ViewHolderBase<JsonData> {
private CubeImageView mImageView;
@Override
public View createView(LayoutInflater inflater) {
View v = inflater.inflate(R.layout.list_view_item, null);
mImageView = (CubeImageView) v.findViewById(R.id.list_view_item_image_view);
mImageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
return v;
}
@Override
public void showData(int position, JsonData itemData) {
mImageView.loadImage(mImageLoader, itemData.optString("pic"));
}
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/WithScrollView.java
================================================
package in.srain.cube.views.ptr.demo.ui.classic;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ScrollView;
import in.srain.cube.mints.base.TitleBaseFragment;
import in.srain.cube.views.ptr.PtrClassicFrameLayout;
import in.srain.cube.views.ptr.PtrDefaultHandler;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.PtrHandler;
import in.srain.cube.views.ptr.demo.R;
public class WithScrollView extends TitleBaseFragment {
private PtrClassicFrameLayout mPtrFrame;
private ScrollView mScrollView;
@Override
public View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setHeaderTitle(R.string.ptr_demo_block_scroll_view);
final View contentView = inflater.inflate(R.layout.fragment_classic_header_with_scroll_view, null);
mScrollView = (ScrollView) contentView.findViewById(R.id.rotate_header_scroll_view);
mPtrFrame = (PtrClassicFrameLayout) contentView.findViewById(R.id.rotate_header_web_view_frame);
mPtrFrame.setLastUpdateTimeRelateObject(this);
mPtrFrame.setPtrHandler(new PtrHandler() {
@Override
public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
return PtrDefaultHandler.checkContentCanBePulledDown(frame, mScrollView, header);
}
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
mPtrFrame.postDelayed(new Runnable() {
@Override
public void run() {
mPtrFrame.refreshComplete();
}
}, 100);
}
});
// the following are default settings
mPtrFrame.setResistance(1.7f);
mPtrFrame.setRatioOfHeaderHeightToRefresh(1.2f);
mPtrFrame.setDurationToClose(200);
mPtrFrame.setDurationToCloseHeader(1000);
// default is false
mPtrFrame.setPullToRefresh(false);
// default is true
mPtrFrame.setKeepHeaderWhenRefresh(true);
mPtrFrame.postDelayed(new Runnable() {
@Override
public void run() {
mPtrFrame.autoRefresh();
}
}, 100);
return contentView;
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/WithTextViewInFrameLayoutFragment.java
================================================
package in.srain.cube.views.ptr.demo.ui.classic;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import in.srain.cube.mints.base.TitleBaseFragment;
import in.srain.cube.views.ptr.PtrClassicFrameLayout;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.PtrHandler;
import in.srain.cube.views.ptr.demo.R;
public class WithTextViewInFrameLayoutFragment extends TitleBaseFragment {
@Override
public View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setHeaderTitle(R.string.ptr_demo_block_frame_layout);
final View contentView = inflater.inflate(R.layout.fragment_classic_header_with_viewgroup, container, false);
final PtrClassicFrameLayout ptrFrame = (PtrClassicFrameLayout) contentView.findViewById(R.id.fragment_rotate_header_with_view_group_frame);
ptrFrame.setPtrHandler(new PtrHandler() {
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
frame.postDelayed(new Runnable() {
@Override
public void run() {
ptrFrame.refreshComplete();
}
}, 1800);
}
@Override
public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
return true;
}
});
ptrFrame.setLastUpdateTimeRelateObject(this);
// the following are default settings
ptrFrame.setResistance(1.7f);
ptrFrame.setRatioOfHeaderHeightToRefresh(1.2f);
ptrFrame.setDurationToClose(200);
ptrFrame.setDurationToCloseHeader(1000);
// default is false
ptrFrame.setPullToRefresh(false);
// default is true
ptrFrame.setKeepHeaderWhenRefresh(true);
// scroll then refresh
// comment in base fragment
ptrFrame.postDelayed(new Runnable() {
@Override
public void run() {
// ptrFrame.autoRefresh();
}
}, 150);
setupViews(ptrFrame);
return contentView;
}
protected void setupViews(final PtrClassicFrameLayout ptrFrame) {
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/WithWebView.java
================================================
package in.srain.cube.views.ptr.demo.ui.classic;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import in.srain.cube.mints.base.TitleBaseFragment;
import in.srain.cube.views.ptr.PtrClassicFrameLayout;
import in.srain.cube.views.ptr.PtrDefaultHandler;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.PtrHandler;
import in.srain.cube.views.ptr.demo.R;
public class WithWebView extends TitleBaseFragment {
private PtrClassicFrameLayout mPtrFrame;
private WebView mWebView;
@Override
public View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setHeaderTitle(R.string.ptr_demo_block_web_view);
final View contentView = inflater.inflate(R.layout.fragment_classic_header_with_webview, null);
mWebView = (WebView) contentView.findViewById(R.id.rotate_header_web_view);
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
mPtrFrame.refreshComplete();
}
});
mPtrFrame = (PtrClassicFrameLayout) contentView.findViewById(R.id.rotate_header_web_view_frame);
mPtrFrame.setLastUpdateTimeRelateObject(this);
mPtrFrame.setPtrHandler(new PtrHandler() {
@Override
public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
return PtrDefaultHandler.checkContentCanBePulledDown(frame, mWebView, header);
}
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
updateData();
}
});
// the following are default settings
mPtrFrame.setResistance(1.7f);
mPtrFrame.setRatioOfHeaderHeightToRefresh(1.2f);
mPtrFrame.setDurationToClose(200);
mPtrFrame.setDurationToCloseHeader(1000);
// default is false
mPtrFrame.setPullToRefresh(false);
// default is true
mPtrFrame.setKeepHeaderWhenRefresh(true);
mPtrFrame.postDelayed(new Runnable() {
@Override
public void run() {
mPtrFrame.autoRefresh();
}
}, 100);
return contentView;
}
private void updateData() {
mWebView.loadUrl("http://www.liaohuqiu.net/");
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/header/RentalsSunDrawable.java
================================================
package in.srain.cube.views.ptr.demo.ui.header;
import android.content.Context;
import android.graphics.*;
import android.graphics.drawable.Animatable;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Interpolator;
import android.view.animation.LinearInterpolator;
import android.view.animation.Transformation;
import in.srain.cube.views.ptr.demo.R;
import in.srain.cube.views.ptr.util.PtrLocalDisplay;
public class RentalsSunDrawable extends Drawable implements Animatable {
private static final float SCALE_START_PERCENT = 0.3f;
private static final int ANIMATION_DURATION = 1000;
private final static float SKY_RATIO = 0.65f;
private static final float SKY_INITIAL_SCALE = 1.05f;
private final static float TOWN_RATIO = 0.22f;
private static final float TOWN_INITIAL_SCALE = 1.20f;
private static final float TOWN_FINAL_SCALE = 1.30f;
private static final float SUN_FINAL_SCALE = 0.75f;
private static final float SUN_INITIAL_ROTATE_GROWTH = 1.2f;
private static final float SUN_FINAL_ROTATE_GROWTH = 1.5f;
private static final Interpolator LINEAR_INTERPOLATOR = new LinearInterpolator();
private View mParent;
private Matrix mMatrix;
private Animation mAnimation;
private int mTop;
private int mScreenWidth;
private int mSkyHeight;
private float mSkyTopOffset;
private float mSkyMoveOffset;
private int mTownHeight;
private float mTownInitialTopOffset;
private float mTownFinalTopOffset;
private float mTownMoveOffset;
private int mSunSize = 100;
private float mSunLeftOffset;
private float mSunTopOffset;
private float mPercent = 0.0f;
private float mRotate = 0.0f;
private Bitmap mSky;
private Bitmap mSun;
private Bitmap mTown;
private boolean isRefreshing = false;
private Context mContext;
private int mTotalDragDistance;
public RentalsSunDrawable(Context context, View parent) {
mContext = context;
mParent = parent;
mMatrix = new Matrix();
initiateDimens();
createBitmaps();
setupAnimations();
}
private Context getContext() {
return mContext;
}
private void initiateDimens() {
PtrLocalDisplay.init(mContext);
mTotalDragDistance = PtrLocalDisplay.dp2px(120);
mScreenWidth = getContext().getResources().getDisplayMetrics().widthPixels;
mSkyHeight = (int) (SKY_RATIO * mScreenWidth);
mSkyTopOffset = -(mSkyHeight * 0.28f);
mSkyMoveOffset = PtrLocalDisplay.designedDP2px(15);
mTownHeight = (int) (TOWN_RATIO * mScreenWidth);
mTownInitialTopOffset = (mTotalDragDistance - mTownHeight * TOWN_INITIAL_SCALE) + mTotalDragDistance * .42f;
mTownFinalTopOffset = (mTotalDragDistance - mTownHeight * TOWN_FINAL_SCALE) + mTotalDragDistance * .42f;
mTownMoveOffset = PtrLocalDisplay.designedDP2px(10);
mSunLeftOffset = 0.3f * (float) mScreenWidth;
mSunTopOffset = (mTotalDragDistance * 0.5f);
mTop = 0;
}
private void createBitmaps() {
mSky = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.sky);
mSky = Bitmap.createScaledBitmap(mSky, mScreenWidth, mSkyHeight, true);
mTown = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.buildings);
mTown = Bitmap.createScaledBitmap(mTown, mScreenWidth, (int) (mScreenWidth * TOWN_RATIO), true);
mSun = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.sun);
mSun = Bitmap.createScaledBitmap(mSun, mSunSize, mSunSize, true);
}
public void offsetTopAndBottom(int offset) {
mTop = offset;
invalidateSelf();
}
@Override
public void draw(Canvas canvas) {
final int saveCount = canvas.save();
canvas.translate(0, mTotalDragDistance - mTop);
drawSky(canvas);
drawSun(canvas);
drawTown(canvas);
canvas.restoreToCount(saveCount);
}
private void drawSky(Canvas canvas) {
Matrix matrix = mMatrix;
matrix.reset();
int y = Math.max(0, mTop - mTotalDragDistance);
// 0 ~ 1
float dragPercent = Math.min(1f, Math.abs(mPercent));
/** Change skyScale between {@link #SKY_INITIAL_SCALE} and 1.0f depending on {@link #mPercent} */
float skyScale;
float scalePercentDelta = dragPercent - SCALE_START_PERCENT;
/** less than {@link SCALE_START_PERCENT} will be {@link SKY_INITIAL_SCALE} */
if (scalePercentDelta > 0) {
/** will change from 0 ~ 1 **/
float scalePercent = scalePercentDelta / (1.0f - SCALE_START_PERCENT);
skyScale = SKY_INITIAL_SCALE - (SKY_INITIAL_SCALE - 1.0f) * scalePercent;
} else {
skyScale = SKY_INITIAL_SCALE;
}
float offsetX = -(mScreenWidth * skyScale - mScreenWidth) / 2.0f;
float offsetY = y + 50 + mSkyTopOffset // Offset canvas moving, goes lower when goes down
- mSkyHeight * (skyScale - 1.0f) / 2 // Offset sky scaling, lower than 0, will go greater when goes down
+ mSkyMoveOffset * dragPercent; // Give it a little move top -> bottom // will go greater when goes down
matrix.postScale(skyScale, skyScale);
matrix.postTranslate(offsetX, offsetY);
canvas.drawBitmap(mSky, matrix, null);
}
private void drawTown(Canvas canvas) {
Matrix matrix = mMatrix;
matrix.reset();
int y = Math.max(0, mTop - mTotalDragDistance);
float dragPercent = Math.min(1f, Math.abs(mPercent));
float townScale;
float townTopOffset;
float townMoveOffset;
float scalePercentDelta = dragPercent - SCALE_START_PERCENT;
if (scalePercentDelta > 0) {
/**
* Change townScale between {@link #TOWN_INITIAL_SCALE} and {@link #TOWN_FINAL_SCALE} depending on {@link #mPercent}
* Change townTopOffset between {@link #mTownInitialTopOffset} and {@link #mTownFinalTopOffset} depending on {@link #mPercent}
*/
float scalePercent = scalePercentDelta / (1.0f - SCALE_START_PERCENT);
townScale = TOWN_INITIAL_SCALE + (TOWN_FINAL_SCALE - TOWN_INITIAL_SCALE) * scalePercent;
townTopOffset = mTownInitialTopOffset - (mTownFinalTopOffset - mTownInitialTopOffset) * scalePercent;
townMoveOffset = mTownMoveOffset * (1.0f - scalePercent);
} else {
float scalePercent = dragPercent / SCALE_START_PERCENT;
townScale = TOWN_INITIAL_SCALE;
townTopOffset = mTownInitialTopOffset;
townMoveOffset = mTownMoveOffset * scalePercent;
}
float offsetX = -(mScreenWidth * townScale - mScreenWidth) / 2.0f;
// float offsetY = (1.0f - dragPercent) * mTotalDragDistance // Offset canvas moving
float offsetY = y +
+townTopOffset
- mTownHeight * (townScale - 1.0f) / 2 // Offset town scaling
+ townMoveOffset; // Give it a little move
matrix.postScale(townScale, townScale);
matrix.postTranslate(offsetX, offsetY);
canvas.drawBitmap(mTown, matrix, null);
}
private void drawSun(Canvas canvas) {
Matrix matrix = mMatrix;
matrix.reset();
float dragPercent = mPercent;
if (dragPercent > 1.0f) { // Slow down if pulling over set height
dragPercent = (dragPercent + 9.0f) / 10;
}
float sunRadius = (float) mSunSize / 2.0f;
float sunRotateGrowth = SUN_INITIAL_ROTATE_GROWTH;
float offsetX = mSunLeftOffset;
float offsetY = mSunTopOffset
+ (mTotalDragDistance / 2) * (1.0f - dragPercent); // Move the sun up
float scalePercentDelta = dragPercent - SCALE_START_PERCENT;
if (scalePercentDelta > 0) {
float scalePercent = scalePercentDelta / (1.0f - SCALE_START_PERCENT);
float sunScale = 1.0f - (1.0f - SUN_FINAL_SCALE) * scalePercent;
sunRotateGrowth += (SUN_FINAL_ROTATE_GROWTH - SUN_INITIAL_ROTATE_GROWTH) * scalePercent;
matrix.preTranslate(offsetX + (sunRadius - sunRadius * sunScale), offsetY * (2.0f - sunScale));
matrix.preScale(sunScale, sunScale);
offsetX += sunRadius;
offsetY = offsetY * (2.0f - sunScale) + sunRadius * sunScale;
} else {
matrix.postTranslate(offsetX, offsetY);
offsetX += sunRadius;
offsetY += sunRadius;
}
float r = (isRefreshing ? -360 : 360) * mRotate * (isRefreshing ? 1 : sunRotateGrowth);
matrix.postRotate(r, offsetX, offsetY);
canvas.drawBitmap(mSun, matrix, null);
}
public void setPercent(float percent) {
mPercent = percent;
setRotate(percent);
}
public void setRotate(float rotate) {
mRotate = rotate;
mParent.invalidate();
invalidateSelf();
}
public void resetOriginals() {
setPercent(0);
setRotate(0);
}
@Override
public void setBounds(int left, int top, int right, int bottom) {
super.setBounds(left, top, right, mSkyHeight + top);
}
@Override
public void setAlpha(int alpha) {
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
@Override
public boolean isRunning() {
return false;
}
@Override
public void start() {
mAnimation.reset();
isRefreshing = true;
mParent.startAnimation(mAnimation);
}
@Override
public void stop() {
mParent.clearAnimation();
isRefreshing = false;
resetOriginals();
}
private void setupAnimations() {
mAnimation = new Animation() {
@Override
public void applyTransformation(float interpolatedTime, Transformation t) {
setRotate(interpolatedTime);
}
};
mAnimation.setRepeatCount(Animation.INFINITE);
mAnimation.setRepeatMode(Animation.RESTART);
mAnimation.setInterpolator(LINEAR_INTERPOLATOR);
mAnimation.setDuration(ANIMATION_DURATION);
}
public int getTotalDragDistance() {
return mTotalDragDistance;
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/header/RentalsSunHeaderView.java
================================================
package in.srain.cube.views.ptr.demo.ui.header;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.PtrUIHandler;
import in.srain.cube.views.ptr.indicator.PtrIndicator;
import in.srain.cube.views.ptr.indicator.PtrTensionIndicator;
public class RentalsSunHeaderView extends View implements PtrUIHandler {
private RentalsSunDrawable mDrawable;
private PtrFrameLayout mPtrFrameLayout;
private PtrTensionIndicator mPtrTensionIndicator;
public RentalsSunHeaderView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public RentalsSunHeaderView(Context context) {
super(context);
init();
}
public RentalsSunHeaderView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public void setUp(PtrFrameLayout ptrFrameLayout) {
mPtrFrameLayout = ptrFrameLayout;
mPtrTensionIndicator = new PtrTensionIndicator();
mPtrFrameLayout.setPtrIndicator(mPtrTensionIndicator);
}
private void init() {
mDrawable = new RentalsSunDrawable(getContext(), this);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int height = mDrawable.getTotalDragDistance() * 5 / 4;
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height + getPaddingTop() + getPaddingBottom(), MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
int pl = getPaddingLeft();
int pt = getPaddingTop();
mDrawable.setBounds(pl, pt, pl + right - left, pt + bottom - top);
}
@Override
public void onUIReset(PtrFrameLayout frame) {
mDrawable.resetOriginals();
}
@Override
protected void onDraw(Canvas canvas) {
mDrawable.draw(canvas);
float percent = mPtrTensionIndicator.getOverDragPercent();
}
@Override
public void onUIRefreshPrepare(PtrFrameLayout frame) {
}
@Override
public void onUIRefreshBegin(PtrFrameLayout frame) {
mDrawable.start();
float percent = mPtrTensionIndicator.getOverDragPercent();
mDrawable.offsetTopAndBottom(mPtrTensionIndicator.getCurrentPosY());
mDrawable.setPercent(percent);
invalidate();
}
@Override
public void onUIRefreshComplete(PtrFrameLayout frame) {
float percent = mPtrTensionIndicator.getOverDragPercent();
mDrawable.stop();
mDrawable.offsetTopAndBottom(mPtrTensionIndicator.getCurrentPosY());
mDrawable.setPercent(percent);
invalidate();
}
@Override
public void onUIPositionChange(PtrFrameLayout frame, boolean isUnderTouch, byte status, PtrIndicator ptrIndicator) {
float percent = mPtrTensionIndicator.getOverDragPercent();
mDrawable.offsetTopAndBottom(mPtrTensionIndicator.getCurrentPosY());
mDrawable.setPercent(percent);
invalidate();
}
@Override
public void invalidateDrawable(Drawable dr) {
if (dr == mDrawable) {
invalidate();
} else {
super.invalidateDrawable(dr);
}
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/storehouse/StoreHouseUsingPointList.java
================================================
package in.srain.cube.views.ptr.demo.ui.storehouse;
import android.graphics.Point;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import in.srain.cube.image.CubeImageView;
import in.srain.cube.image.ImageLoader;
import in.srain.cube.image.ImageLoaderFactory;
import in.srain.cube.mints.base.TitleBaseFragment;
import in.srain.cube.util.LocalDisplay;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.PtrHandler;
import in.srain.cube.views.ptr.demo.R;
import in.srain.cube.views.ptr.header.StoreHouseHeader;
import java.util.ArrayList;
import java.util.List;
/**
* the point list used here is taken from:
* https://github.com/cloay/CRefreshLayout
*/
public class StoreHouseUsingPointList extends TitleBaseFragment {
@Override
protected View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setHeaderTitle(R.string.ptr_demo_storehouse_header_using_point_list);
View view = inflater.inflate(R.layout.fragment_storehouse_header, null);
CubeImageView imageView = (CubeImageView) view.findViewById(R.id.store_house_ptr_image);
ImageLoader imageLoader = ImageLoaderFactory.create(getContext());
String pic = "http://img5.duitang.com/uploads/item/201406/28/20140628122218_fLQyP.thumb.jpeg";
imageView.loadImage(imageLoader, pic);
final PtrFrameLayout frame = (PtrFrameLayout) view.findViewById(R.id.store_house_ptr_frame);
// header
final StoreHouseHeader header = new StoreHouseHeader(getContext());
header.setPadding(0, LocalDisplay.dp2px(15), 0, 0);
header.initWithPointList(getPointList());
frame.setDurationToCloseHeader(3000);
frame.setHeaderView(header);
frame.addPtrUIHandler(header);
frame.postDelayed(new Runnable() {
@Override
public void run() {
frame.autoRefresh(false);
}
}, 100);
frame.setPtrHandler(new PtrHandler() {
@Override
public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
return true;
}
@Override
public void onRefreshBegin(final PtrFrameLayout frame) {
frame.postDelayed(new Runnable() {
@Override
public void run() {
frame.refreshComplete();
}
}, 2000);
}
});
return view;
}
private ArrayList<float[]> getPointList() {
// this point is taken from https://github.com/cloay/CRefreshLayout
List<Point> startPoints = new ArrayList<Point>();
startPoints.add(new Point(240, 80));
startPoints.add(new Point(270, 80));
startPoints.add(new Point(265, 103));
startPoints.add(new Point(255, 65));
startPoints.add(new Point(275, 80));
startPoints.add(new Point(275, 80));
startPoints.add(new Point(302, 80));
startPoints.add(new Point(275, 107));
startPoints.add(new Point(320, 70));
startPoints.add(new Point(313, 80));
startPoints.add(new Point(330, 63));
startPoints.add(new Point(315, 87));
startPoints.add(new Point(330, 80));
startPoints.add(new Point(315, 100));
startPoints.add(new Point(330, 90));
startPoints.add(new Point(315, 110));
startPoints.add(new Point(345, 65));
startPoints.add(new Point(357, 67));
startPoints.add(new Point(363, 103));
startPoints.add(new Point(375, 80));
startPoints.add(new Point(375, 80));
startPoints.add(new Point(425, 80));
startPoints.add(new Point(380, 95));
startPoints.add(new Point(400, 63));
List<Point> endPoints = new ArrayList<Point>();
endPoints.add(new Point(270, 80));
endPoints.add(new Point(270, 110));
endPoints.add(new Point(270, 110));
endPoints.add(new Point(250, 110));
endPoints.add(new Point(275, 107));
endPoints.add(new Point(302, 80));
endPoints.add(new Point(302, 107));
endPoints.add(new Point(302, 107));
endPoints.add(new Point(340, 70));
endPoints.add(new Point(360, 80));
endPoints.add(new Point(330, 80));
endPoints.add(new Point(340, 87));
endPoints.add(new Point(315, 100));
endPoints.add(new Point(345, 98));
endPoints.add(new Point(330, 120));
endPoints.add(new Point(345, 108));
endPoints.add(new Point(360, 120));
endPoints.add(new Point(363, 75));
endPoints.add(new Point(345, 117));
endPoints.add(new Point(380, 95));
endPoints.add(new Point(425, 80));
endPoints.add(new Point(420, 95));
endPoints.add(new Point(420, 95));
endPoints.add(new Point(400, 120));
ArrayList<float[]> list = new ArrayList<float[]>();
int offsetX = Integer.MAX_VALUE;
int offsetY = Integer.MAX_VALUE;
for (int i = 0; i < startPoints.size(); i++) {
offsetX = Math.min(startPoints.get(i).x, offsetX);
offsetY = Math.min(startPoints.get(i).y, offsetY);
}
for (int i = 0; i < endPoints.size(); i++) {
float[] point = new float[4];
point[0] = startPoints.get(i).x - offsetX;
point[1] = startPoints.get(i).y - offsetY;
point[2] = endPoints.get(i).x - offsetX;
point[3] = endPoints.get(i).y - offsetY;
list.add(point);
}
return list;
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/storehouse/StoreHouseUsingString.java
================================================
package in.srain.cube.views.ptr.demo.ui.storehouse;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import in.srain.cube.image.CubeImageView;
import in.srain.cube.image.ImageLoader;
import in.srain.cube.image.ImageLoaderFactory;
import in.srain.cube.mints.base.TitleBaseFragment;
import in.srain.cube.util.LocalDisplay;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.PtrHandler;
import in.srain.cube.views.ptr.PtrUIHandler;
import in.srain.cube.views.ptr.demo.R;
import in.srain.cube.views.ptr.header.StoreHouseHeader;
import in.srain.cube.views.ptr.indicator.PtrIndicator;
public class StoreHouseUsingString extends TitleBaseFragment {
final String[] mStringList = {"Alibaba", "TMALL 11-11"};
private String mTitlePre;
@Override
protected View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_storehouse_header, null);
mTitlePre = getString(R.string.ptr_demo_storehouse_header_using_string_in_title);
CubeImageView imageView = (CubeImageView) view.findViewById(R.id.store_house_ptr_image);
ImageLoader imageLoader = ImageLoaderFactory.create(getContext());
String pic = "http://img5.duitang.com/uploads/item/201406/28/20140628122218_fLQyP.thumb.jpeg";
imageView.loadImage(imageLoader, pic);
final PtrFrameLayout frame = (PtrFrameLayout) view.findViewById(R.id.store_house_ptr_frame);
// header
final StoreHouseHeader header = new StoreHouseHeader(getContext());
header.setPadding(0, LocalDisplay.dp2px(15), 0, 0);
/**
* using a string, support: A-Z 0-9 - .
* you can add more letters by {@link in.srain.cube.views.ptr.header.StoreHousePath#addChar}
*/
header.initWithString(mStringList[0]);
setHeaderTitle(mTitlePre + mStringList[0]);
// for changing string
frame.addPtrUIHandler(new PtrUIHandler() {
private int mLoadTime = 0;
@Override
public void onUIReset(PtrFrameLayout frame) {
mLoadTime++;
String string = mStringList[mLoadTime % mStringList.length];
header.initWithString(string);
}
@Override
public void onUIRefreshPrepare(PtrFrameLayout frame) {
String string = mStringList[mLoadTime % mStringList.length];
setHeaderTitle(mTitlePre + string);
}
@Override
public void onUIRefreshBegin(PtrFrameLayout frame) {
}
@Override
public void onUIRefreshComplete(PtrFrameLayout frame) {
}
@Override
public void onUIPositionChange(PtrFrameLayout frame, boolean isUnderTouch, byte status, PtrIndicator ptrIndicator) {
}
});
frame.setDurationToCloseHeader(3000);
frame.setHeaderView(header);
frame.addPtrUIHandler(header);
frame.postDelayed(new Runnable() {
@Override
public void run() {
frame.autoRefresh(false);
}
}, 100);
frame.setPtrHandler(new PtrHandler() {
@Override
public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
return true;
}
@Override
public void onRefreshBegin(final PtrFrameLayout frame) {
frame.postDelayed(new Runnable() {
@Override
public void run() {
frame.refreshComplete();
}
}, 2000);
}
});
return view;
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/storehouse/StoreHouseUsingStringArray.java
================================================
package in.srain.cube.views.ptr.demo.ui.storehouse;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import in.srain.cube.image.CubeImageView;
import in.srain.cube.image.ImageLoader;
import in.srain.cube.image.ImageLoaderFactory;
import in.srain.cube.mints.base.TitleBaseFragment;
import in.srain.cube.util.LocalDisplay;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.PtrHandler;
import in.srain.cube.views.ptr.PtrUIHandler;
import in.srain.cube.views.ptr.demo.R;
import in.srain.cube.views.ptr.header.StoreHouseHeader;
import in.srain.cube.views.ptr.indicator.PtrIndicator;
public class StoreHouseUsingStringArray extends TitleBaseFragment {
private String mTitlePre;
@Override
protected View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment_storehouse_header, null);
mTitlePre = getString(R.string.ptr_demo_storehouse_header_using_string_array_in_title);
setHeaderTitle(mTitlePre + "R.array.storehouse");
// loading image
CubeImageView imageView = (CubeImageView) view.findViewById(R.id.store_house_ptr_image);
ImageLoader imageLoader = ImageLoaderFactory.create(getContext());
String pic = "http://img5.duitang.com/uploads/item/201406/28/20140628122218_fLQyP.thumb.jpeg";
imageView.loadImage(imageLoader, pic);
final PtrFrameLayout frame = (PtrFrameLayout) view.findViewById(R.id.store_house_ptr_frame);
final StoreHouseHeader header = new StoreHouseHeader(getContext());
header.setPadding(0, LocalDisplay.dp2px(15), 0, 0);
// using string array from resource xml file
header.initWithStringArray(R.array.storehouse);
frame.setDurationToCloseHeader(1500);
frame.setHeaderView(header);
frame.addPtrUIHandler(header);
frame.postDelayed(new Runnable() {
@Override
public void run() {
frame.autoRefresh(false);
}
}, 100);
// change header after loaded
frame.addPtrUIHandler(new PtrUIHandler() {
private int mLoadTime = 0;
@Override
public void onUIReset(PtrFrameLayout frame) {
mLoadTime++;
if (mLoadTime % 2 == 0) {
header.setScale(1);
header.initWithStringArray(R.array.storehouse);
} else {
header.setScale(0.5f);
header.initWithStringArray(R.array.akta);
}
}
@Override
public void onUIRefreshPrepare(PtrFrameLayout frame) {
if (mLoadTime % 2 == 0) {
setHeaderTitle(mTitlePre + "R.array.storehouse");
} else {
setHeaderTitle(mTitlePre + "R.array.akta");
}
}
@Override
public void onUIRefreshBegin(PtrFrameLayout frame) {
}
@Override
public void onUIRefreshComplete(PtrFrameLayout frame) {
}
@Override
public void onUIPositionChange(PtrFrameLayout frame, boolean isUnderTouch, byte status, PtrIndicator ptrIndicator) {
}
});
frame.setPtrHandler(new PtrHandler() {
@Override
public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
return true;
}
@Override
public void onRefreshBegin(final PtrFrameLayout frame) {
frame.postDelayed(new Runnable() {
@Override
public void run() {
frame.refreshComplete();
}
}, 2000);
}
});
return view;
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/viewpager/ImageListViewHolder.java
================================================
package in.srain.cube.views.ptr.demo.ui.viewpager;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import in.srain.cube.image.CubeImageView;
import in.srain.cube.image.ImageLoader;
import in.srain.cube.request.JsonData;
import in.srain.cube.views.list.ViewHolderBase;
import in.srain.cube.views.ptr.demo.R;
public class ImageListViewHolder extends ViewHolderBase<JsonData> {
private ImageLoader mImageLoader;
private CubeImageView mImageView;
private ImageListViewHolder(ImageLoader imageLoader) {
mImageLoader = imageLoader;
}
@Override
public View createView(LayoutInflater inflater) {
View v = inflater.inflate(R.layout.list_view_item, null);
mImageView = (CubeImageView) v.findViewById(R.id.list_view_item_image_view);
mImageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
return v;
}
@Override
public void showData(int position, JsonData itemData) {
mImageView.loadImage(mImageLoader, itemData.optString("pic"));
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/viewpager/ViewPagerActivity.java
================================================
package in.srain.cube.views.ptr.demo.ui.viewpager;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.TextView;
import in.srain.cube.mints.base.TitleBaseActivity;
import in.srain.cube.request.JsonData;
import in.srain.cube.request.RequestFinishHandler;
import in.srain.cube.util.LocalDisplay;
import in.srain.cube.views.pager.TabPageIndicator;
import in.srain.cube.views.ptr.PtrClassicFrameLayout;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.PtrHandler;
import in.srain.cube.views.ptr.demo.R;
import in.srain.cube.views.ptr.demo.data.DemoRequestData;
import java.util.ArrayList;
public class ViewPagerActivity extends TitleBaseActivity {
private TabPageIndicator mCatTabPageIndicator;
private ViewPager mFragmentViewPager;
private FragmentViewPagerAdapter mPagerAdapter;
private PtrFrameLayout mPtrFrame;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHeaderTitle(R.string.ptr_demo_block_with_view_pager);
setContentView(R.layout.activity_view_pager);
initCateViews();
}
private void initCateViews() {
int startIndex = 0;
mCatTabPageIndicator = (TabPageIndicator) findViewById(R.id.view_pager_tab_indicator);
mFragmentViewPager = (ViewPager) this.findViewById(R.id.view_pager_view_pager);
ArrayList<ViewPagerFragment> list = new ArrayList<ViewPagerFragment>();
for (int i = 1; i <= 8; i++) {
list.add(ViewPagerFragment.create(i));
}
mPagerAdapter = new FragmentViewPagerAdapter(getSupportFragmentManager(), list);
mFragmentViewPager.setAdapter(mPagerAdapter);
mCatTabPageIndicator.setViewHolderCreator(new TabPageIndicator.ViewHolderCreator() {
@Override
public TabPageIndicator.ViewHolderBase createViewHolder() {
return new HomeCatItemViewHolder();
}
});
mCatTabPageIndicator.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int i) {
switchTo(i);
}
});
mCatTabPageIndicator.setViewPager(mFragmentViewPager);
mPtrFrame = (PtrClassicFrameLayout) findViewById(R.id.view_pager_ptr_frame);
mPtrFrame.disableWhenHorizontalMove(true);
mPtrFrame.setPtrHandler(new PtrHandler() {
@Override
public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
return mPagerAdapter.checkCanDoRefresh();
}
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
mPagerAdapter.updateData();
}
});
mFragmentViewPager.setCurrentItem(startIndex);
}
@Override
protected void onResume() {
super.onResume();
mCatTabPageIndicator.moveToItem(mFragmentViewPager.getCurrentItem());
}
private void switchTo(int position) {
mPagerAdapter.switchTO(position);
}
private class FragmentViewPagerAdapter extends FragmentStatePagerAdapter {
private final ArrayList<ViewPagerFragment> mViewPagerFragments;
private ViewPagerFragment mCurrentFragment;
public FragmentViewPagerAdapter(FragmentManager fm, ArrayList<ViewPagerFragment> list) {
super(fm);
mViewPagerFragments = list;
}
@Override
public Fragment getItem(int position) {
return mViewPagerFragments.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
}
protected void updateData() {
final ViewPagerFragment fragment = mCurrentFragment;
DemoRequestData.getImageList(new RequestFinishHandler<JsonData>() {
@Override
public void onRequestFinish(final JsonData data) {
if (fragment == mCurrentFragment) {
fragment.update(data);
mPtrFrame.refreshComplete();
}
}
});
}
@Override
public int getCount() {
return mViewPagerFragments.size();
}
public void switchTO(final int position) {
int len = mViewPagerFragments.size();
for (int i = 0; i < len; i++) {
ViewPagerFragment fragment = mViewPagerFragments.get(i);
if (i == position) {
mCurrentFragment = fragment;
fragment.show();
} else {
fragment.hide();
}
}
}
public boolean checkCanDoRefresh() {
if (mCurrentFragment == null) {
return true;
}
return mCurrentFragment.checkCanDoRefresh();
}
}
private class HomeCatItemViewHolder extends TabPageIndicator.ViewHolderBase {
private TextView mNameView;
private View mTagView;
@Override
public View createView(LayoutInflater layoutInflater, int position) {
View view = layoutInflater.inflate(R.layout.view_pager_indicator_item, null);
view.setLayoutParams(new AbsListView.LayoutParams(LocalDisplay.dp2px(40), -1));
mNameView = (TextView) view.findViewById(R.id.view_pager_indicator_name);
mTagView = view.findViewById(R.id.view_pager_indicator_tab_current);
return view;
}
@Override
public void updateView(int position, boolean isCurrent) {
mNameView.setText(position + "");
if (isCurrent) {
mTagView.setVisibility(View.VISIBLE);
} else {
mTagView.setVisibility(View.INVISIBLE);
}
}
}
}
================================================
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/viewpager/ViewPagerFragment.java
================================================
package in.srain.cube.views.ptr.demo.ui.viewpager;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import in.srain.cube.app.CubeFragment;
import in.srain.cube.image.ImageLoader;
import in.srain.cube.image.ImageLoaderFactory;
import in.srain.cube.request.JsonData;
import in.srain.cube.util.CLog;
import in.srain.cube.views.list.ListViewDataAdapter;
import in.srain.cube.views.ptr.demo.R;
import in.srain.cube.views.ptr.demo.ui.MaterialStyleFragment;
public class ViewPagerFragment extends CubeFragment {
private int mPage;
private ListView mListView;
private ImageLoader mImageLoader;
private ListViewDataAdapter<JsonData> mAdapter;
public static ViewPagerFragment create(int page) {
ViewPagerFragment fragment = new ViewPagerFragment();
fragment.mPage = page;
return fragment;
}
@Override
protected View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return null;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mImageLoader = ImageLoaderFactory.create(getContext()).tryToAttachToContainer(getContext());
View view = inflater.inflate(R.layout.fragment_view_pager, null);
mListView = (ListView) view.findViewById(R.id.view_pager_list_view);
View headerView = inflater.inflate(R.layout.view_pager_fragment_list_view_header, null);
TextView mHeaderTextView = (TextView) headerView.findViewById(R.id.view_pager_fragment_list_view_header_title);
mHeaderTextView.setBackgroundColor(0xff4d90fe * mPage / 30);
mHeaderTextView.setText("Page: " + mPage);
mListView.addHeaderView(headerView);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (position >= 0) {
JsonData js = mAdapter.getItem(position);
final String url = js!=null?js.optString("pic"):null;
if (!TextUtils.isEmpty(url)) {
getContext().pushFragmentToBackStack(MaterialStyleFragment.class, url);
}
}
}
});
mAdapter = new ListViewDataAdapter<JsonData>();
mAdapter.setViewHolderClass(this, ImageListViewHolder.class, mImageLoader);
mListView.setAdapter(mAdapter);
return view;
}
public void update(JsonData data) {
mAdapter.getDataList().clear();
mAdapter.getDataList().addAll(data.optJson("data").optJson("list").toArrayList());
mAdapter.notifyDataSetChanged();
}
public void show() {
}
public void hide() {
}
public boolean checkCanDoRefresh() {
if (mAdapter.getCount() == 0 || mListView == null) {
return true;
}
CLog.d("test", "checkCanDoRefresh: %s %s", mListView.getFirstVisiblePosition(), mListView.getChildAt(0).getTop());
return mListView.getFirstVisiblePosition() == 0 && mListView.getChildAt(0).getTop() == 0;
}
}
================================================
FILE: ptr-lib/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="in.srain.cube.views.ptr"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16" />
<application />
</manifest>
================================================
FILE: ptr-lib/build.gradle
================================================
apply plugin: 'com.android.library'
android {
compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION)
buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION
defaultConfig {
minSdkVersion 8
targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION)
}
lintOptions {
abortOnError false
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['resources']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
// aidl.srcDirs = ['src']
// renderscript.srcDirs = ['src']
}
androidTest.setRoot('tests')
}
}
dependencies {
}
apply from: './gradle-mvn-push.gradle'
================================================
FILE: ptr-lib/checkstyle.xml
================================================
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Puppy Crawl//DTD Check Configuration 1.2//EN"
"http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
<module name="Checker">
<!--module name="NewlineAtEndOfFile"/-->
<module name="FileLength"/>
<module name="FileTabCharacter"/>
<!-- Trailing spaces -->
<module name="RegexpSingleline">
<property name="format" value="\s+$"/>
<property name="message" value="Line has trailing spaces."/>
</module>
<module name="TreeWalker">
<property name="cacheFile" value="${checkstyle.cache.file}"/>
<!-- Checks for Javadoc comments. -->
<!
gitextract_757m5xqu/ ├── .gitignore ├── .travis.yml ├── LICENSE ├── README-cn.md ├── README.md ├── build.gradle ├── buildSrc/ │ └── src/ │ └── main/ │ └── groovy/ │ └── copy-libs.gradle ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── pom.xml ├── proguard-project.txt ├── project.properties ├── ptr-demo/ │ ├── AndroidManifest.xml │ ├── assets/ │ │ └── request_init/ │ │ └── demo/ │ │ └── image-list.json │ ├── build.gradle │ ├── libs/ │ │ ├── clog-1.0.2-sources.jar │ │ ├── clog-1.0.2.jar │ │ └── support-v4-r7.jar │ ├── pom.xml │ ├── proguard-project.txt │ ├── proguard-rules.pro │ ├── project.properties │ ├── res/ │ │ ├── drawable/ │ │ │ ├── image_border.xml │ │ │ ├── text_view_bg.xml │ │ │ └── with_long_press_list_item_background.xml │ │ ├── layout/ │ │ │ ├── activity_main.xml │ │ │ ├── activity_view_pager.xml │ │ │ ├── fragment_classic_header_with_gridview.xml │ │ │ ├── fragment_classic_header_with_list_view.xml │ │ │ ├── fragment_classic_header_with_list_view_and_empty_view.xml │ │ │ ├── fragment_classic_header_with_scroll_view.xml │ │ │ ├── fragment_classic_header_with_textview.xml │ │ │ ├── fragment_classic_header_with_viewgroup.xml │ │ │ ├── fragment_classic_header_with_webview.xml │ │ │ ├── fragment_materail_style.xml │ │ │ ├── fragment_ptr_home.xml │ │ │ ├── fragment_storehouse_header.xml │ │ │ ├── fragment_view_pager.xml │ │ │ ├── fragment_with_long_press.xml │ │ │ ├── list_view_item.xml │ │ │ ├── view_pager_fragment_list_view_header.xml │ │ │ ├── view_pager_indicator_item.xml │ │ │ ├── with_grid_view_item_image_list_grid.xml │ │ │ └── with_long_press_list_view_item.xml │ │ ├── values/ │ │ │ ├── arrays.xml │ │ │ ├── ptr_demo_colors.xml │ │ │ └── strings.xml │ │ └── values-zh/ │ │ └── strings.xml │ └── src/ │ └── in/ │ └── srain/ │ └── cube/ │ └── views/ │ └── ptr/ │ └── demo/ │ ├── app/ │ │ └── PtrDemoApplication.java │ ├── data/ │ │ └── DemoRequestData.java │ ├── image/ │ │ ├── DemoDuiTangImageReSizer.java │ │ ├── Images.java │ │ └── PtrImageLoadHandler.java │ └── ui/ │ ├── EnableNextPTRAtOnce.java │ ├── MaterialStyleFragment.java │ ├── MaterialStylePinContentFragment.java │ ├── PtrDemoHomeFragment.java │ ├── RentalsStyleFragment.java │ ├── Utils.java │ ├── WithLongPressFragment.java │ ├── activity/ │ │ └── PtrDemoHomeActivity.java │ ├── classic/ │ │ ├── AutoRefresh.java │ │ ├── EvenOnlyATextView.java │ │ ├── HideHeader.java │ │ ├── KeepHeader.java │ │ ├── PullToRefresh.java │ │ ├── ReleaseToRefresh.java │ │ ├── WithGridView.java │ │ ├── WithListView.java │ │ ├── WithListViewAndEmptyView.java │ │ ├── WithScrollView.java │ │ ├── WithTextViewInFrameLayoutFragment.java │ │ └── WithWebView.java │ ├── header/ │ │ ├── RentalsSunDrawable.java │ │ └── RentalsSunHeaderView.java │ ├── storehouse/ │ │ ├── StoreHouseUsingPointList.java │ │ ├── StoreHouseUsingString.java │ │ └── StoreHouseUsingStringArray.java │ └── viewpager/ │ ├── ImageListViewHolder.java │ ├── ViewPagerActivity.java │ └── ViewPagerFragment.java ├── ptr-demo.apk ├── ptr-lib/ │ ├── AndroidManifest.xml │ ├── build.gradle │ ├── checkstyle.xml │ ├── gradle-mvn-push.gradle │ ├── gradle.properties │ ├── libs/ │ │ ├── clog-1.0.2-sources.jar │ │ └── clog-1.0.2.jar │ ├── pom.xml │ ├── res/ │ │ ├── layout/ │ │ │ ├── cube_ptr_classic_default_header.xml │ │ │ └── cube_ptr_simple_loading.xml │ │ ├── values/ │ │ │ ├── cube_ptr_attrs.xml │ │ │ └── cube_ptr_string.xml │ │ └── values-zh/ │ │ └── cube_ptr_string.xml │ └── src/ │ └── in/ │ └── srain/ │ └── cube/ │ └── views/ │ └── ptr/ │ ├── PtrClassicDefaultHeader.java │ ├── PtrClassicFrameLayout.java │ ├── PtrDefaultHandler.java │ ├── PtrFrameLayout.java │ ├── PtrHandler.java │ ├── PtrUIHandler.java │ ├── PtrUIHandlerHolder.java │ ├── PtrUIHandlerHook.java │ ├── header/ │ │ ├── MaterialHeader.java │ │ ├── MaterialProgressDrawable.java │ │ ├── StoreHouseBarItem.java │ │ ├── StoreHouseHeader.java │ │ └── StoreHousePath.java │ ├── indicator/ │ │ ├── PtrIndicator.java │ │ └── PtrTensionIndicator.java │ └── util/ │ ├── PtrCLog.java │ └── PtrLocalDisplay.java ├── publish-to-maven.sh ├── settings.gradle ├── template/ │ ├── README-cn.md │ ├── README.md │ ├── ptr-demo/ │ │ ├── build.gradle │ │ └── pom.xml │ └── ptr-lib/ │ ├── gradle.properties │ └── pom.xml └── update-project.py
SYMBOL INDEX (508 symbols across 51 files)
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/app/PtrDemoApplication.java
class PtrDemoApplication (line 13) | public class PtrDemoApplication extends Application {
method onCreate (line 17) | @Override
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/data/DemoRequestData.java
class DemoRequestData (line 5) | public class DemoRequestData {
method getImageList (line 7) | public static void getImageList(final RequestFinishHandler<JsonData> r...
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/image/DemoDuiTangImageReSizer.java
class DemoDuiTangImageReSizer (line 10) | public class DemoDuiTangImageReSizer extends DefaultImageReSizer {
method getInstance (line 15) | public static DemoDuiTangImageReSizer getInstance() {
method getRemoteUrl (line 28) | @Override
method binarySearch (line 37) | private static int binarySearch(int[] srcArray, int des, boolean highe...
method findBestCDNSize (line 63) | private static int findBestCDNSize(int[] array, int size, boolean high...
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/image/Images.java
class Images (line 5) | public class Images {
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/image/PtrImageLoadHandler.java
class PtrImageLoadHandler (line 10) | public class PtrImageLoadHandler implements ImageLoadHandler {
method onLoading (line 12) | @Override
method onLoadFinish (line 19) | @Override
method onLoadError (line 26) | @Override
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/EnableNextPTRAtOnce.java
class EnableNextPTRAtOnce (line 7) | public class EnableNextPTRAtOnce extends WithTextViewInFrameLayoutFragme...
method setupViews (line 9) | @Override
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/MaterialStyleFragment.java
class MaterialStyleFragment (line 24) | public class MaterialStyleFragment extends TitleBaseFragment {
method onEnter (line 31) | @Override
method createView (line 38) | @Override
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/MaterialStylePinContentFragment.java
class MaterialStylePinContentFragment (line 8) | public class MaterialStylePinContentFragment extends MaterialStyleFragme...
method createView (line 10) | @Override
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/PtrDemoHomeFragment.java
class PtrDemoHomeFragment (line 24) | public class PtrDemoHomeFragment extends BlockMenuFragment {
method addItemInfo (line 26) | @Override
method createView (line 209) | @Override
method getLayoutId (line 241) | @Override
method setupViews (line 246) | @Override
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/RentalsStyleFragment.java
class RentalsStyleFragment (line 24) | public class RentalsStyleFragment extends TitleBaseFragment {
method onEnter (line 30) | @Override
method createView (line 37) | @Override
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/Utils.java
class Utils (line 10) | public class Utils {
method createSimpleLoadingTip (line 12) | public static View createSimpleLoadingTip(Context context) {
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/WithLongPressFragment.java
class WithLongPressFragment (line 23) | public class WithLongPressFragment extends TitleBaseFragment {
method createView (line 27) | @Override
class ViewHolder (line 74) | private class ViewHolder extends ViewHolderBase<String> {
method createView (line 83) | @Override
method showData (line 96) | @Override
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/activity/PtrDemoHomeActivity.java
class PtrDemoHomeActivity (line 8) | public class PtrDemoHomeActivity extends MintsBaseActivity {
method onCreate (line 10) | @Override
method getFragmentContainerId (line 17) | @Override
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/AutoRefresh.java
class AutoRefresh (line 6) | public class AutoRefresh extends WithGridView {
method setupViews (line 8) | @Override
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/EvenOnlyATextView.java
class EvenOnlyATextView (line 13) | public class EvenOnlyATextView extends TitleBaseFragment {
method createView (line 15) | public View createView(LayoutInflater inflater, ViewGroup container, B...
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/HideHeader.java
class HideHeader (line 10) | public class HideHeader extends WithTextViewInFrameLayoutFragment {
method setupViews (line 12) | @Override
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/KeepHeader.java
class KeepHeader (line 6) | public class KeepHeader extends WithTextViewInFrameLayoutFragment {
method setupViews (line 8) | @Override
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/PullToRefresh.java
class PullToRefresh (line 6) | public class PullToRefresh extends WithTextViewInFrameLayoutFragment {
method setupViews (line 8) | @Override
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/ReleaseToRefresh.java
class ReleaseToRefresh (line 6) | public class ReleaseToRefresh extends WithTextViewInFrameLayoutFragment {
method setupViews (line 8) | @Override
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/WithGridView.java
class WithGridView (line 30) | public class WithGridView extends TitleBaseFragment {
method createView (line 37) | @Override
method setupViews (line 99) | protected void setupViews(final PtrClassicFrameLayout ptrFrame) {
method updateData (line 103) | protected void updateData() {
class ViewHolder (line 121) | private class ViewHolder extends ViewHolderBase<JsonData> {
method createView (line 125) | @Override
method showData (line 136) | @Override
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/WithListView.java
class WithListView (line 27) | public class WithListView extends TitleBaseFragment {
method createView (line 33) | @Override
method updateData (line 89) | protected void updateData() {
class ViewHolder (line 107) | private class ViewHolder extends ViewHolderBase<JsonData> {
method createView (line 111) | @Override
method showData (line 119) | @Override
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/WithListViewAndEmptyView.java
class WithListViewAndEmptyView (line 28) | public class WithListViewAndEmptyView extends TitleBaseFragment {
method createView (line 36) | @Override
method updateData (line 103) | protected void updateData() {
method displayData (line 113) | private void displayData(JsonData data) {
class ViewHolder (line 123) | private class ViewHolder extends ViewHolderBase<JsonData> {
method createView (line 127) | @Override
method showData (line 135) | @Override
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/WithScrollView.java
class WithScrollView (line 15) | public class WithScrollView extends TitleBaseFragment {
method createView (line 20) | @Override
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/WithTextViewInFrameLayoutFragment.java
class WithTextViewInFrameLayoutFragment (line 13) | public class WithTextViewInFrameLayoutFragment extends TitleBaseFragment {
method createView (line 15) | @Override
method setupViews (line 65) | protected void setupViews(final PtrClassicFrameLayout ptrFrame) {
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/WithWebView.java
class WithWebView (line 16) | public class WithWebView extends TitleBaseFragment {
method createView (line 21) | @Override
method updateData (line 65) | private void updateData() {
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/header/RentalsSunDrawable.java
class RentalsSunDrawable (line 15) | public class RentalsSunDrawable extends Drawable implements Animatable {
method RentalsSunDrawable (line 65) | public RentalsSunDrawable(Context context, View parent) {
method getContext (line 76) | private Context getContext() {
method initiateDimens (line 81) | private void initiateDimens() {
method createBitmaps (line 101) | private void createBitmaps() {
method offsetTopAndBottom (line 110) | public void offsetTopAndBottom(int offset) {
method draw (line 115) | @Override
method drawSky (line 127) | private void drawSky(Canvas canvas) {
method drawTown (line 159) | private void drawTown(Canvas canvas) {
method drawSun (line 199) | private void drawSun(Canvas canvas) {
method setPercent (line 239) | public void setPercent(float percent) {
method setRotate (line 244) | public void setRotate(float rotate) {
method resetOriginals (line 250) | public void resetOriginals() {
method setBounds (line 255) | @Override
method setAlpha (line 260) | @Override
method setColorFilter (line 265) | @Override
method getOpacity (line 270) | @Override
method isRunning (line 275) | @Override
method start (line 280) | @Override
method stop (line 287) | @Override
method setupAnimations (line 294) | private void setupAnimations() {
method getTotalDragDistance (line 307) | public int getTotalDragDistance() {
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/header/RentalsSunHeaderView.java
class RentalsSunHeaderView (line 13) | public class RentalsSunHeaderView extends View implements PtrUIHandler {
method RentalsSunHeaderView (line 19) | public RentalsSunHeaderView(Context context, AttributeSet attrs, int d...
method RentalsSunHeaderView (line 24) | public RentalsSunHeaderView(Context context) {
method RentalsSunHeaderView (line 29) | public RentalsSunHeaderView(Context context, AttributeSet attrs) {
method setUp (line 34) | public void setUp(PtrFrameLayout ptrFrameLayout) {
method init (line 40) | private void init() {
method onMeasure (line 44) | @Override
method onLayout (line 51) | @Override
method onUIReset (line 58) | @Override
method onDraw (line 63) | @Override
method onUIRefreshPrepare (line 69) | @Override
method onUIRefreshBegin (line 74) | @Override
method onUIRefreshComplete (line 83) | @Override
method onUIPositionChange (line 92) | @Override
method invalidateDrawable (line 100) | @Override
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/storehouse/StoreHouseUsingPointList.java
class StoreHouseUsingPointList (line 26) | public class StoreHouseUsingPointList extends TitleBaseFragment {
method createView (line 28) | @Override
method getPointList (line 76) | private ArrayList<float[]> getPointList() {
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/storehouse/StoreHouseUsingString.java
class StoreHouseUsingString (line 19) | public class StoreHouseUsingString extends TitleBaseFragment {
method createView (line 24) | @Override
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/storehouse/StoreHouseUsingStringArray.java
class StoreHouseUsingStringArray (line 19) | public class StoreHouseUsingStringArray extends TitleBaseFragment {
method createView (line 23) | @Override
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/viewpager/ImageListViewHolder.java
class ImageListViewHolder (line 12) | public class ImageListViewHolder extends ViewHolderBase<JsonData> {
method ImageListViewHolder (line 17) | private ImageListViewHolder(ImageLoader imageLoader) {
method createView (line 21) | @Override
method showData (line 29) | @Override
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/viewpager/ViewPagerActivity.java
class ViewPagerActivity (line 26) | public class ViewPagerActivity extends TitleBaseActivity {
method onCreate (line 33) | @Override
method initCateViews (line 41) | private void initCateViews() {
method onResume (line 86) | @Override
method switchTo (line 92) | private void switchTo(int position) {
class FragmentViewPagerAdapter (line 96) | private class FragmentViewPagerAdapter extends FragmentStatePagerAdapt...
method FragmentViewPagerAdapter (line 101) | public FragmentViewPagerAdapter(FragmentManager fm, ArrayList<ViewPa...
method getItem (line 106) | @Override
method destroyItem (line 111) | @Override
method updateData (line 115) | protected void updateData() {
method getCount (line 128) | @Override
method switchTO (line 133) | public void switchTO(final int position) {
method checkCanDoRefresh (line 146) | public boolean checkCanDoRefresh() {
class HomeCatItemViewHolder (line 154) | private class HomeCatItemViewHolder extends TabPageIndicator.ViewHolde...
method createView (line 159) | @Override
method updateView (line 168) | @Override
FILE: ptr-demo/src/in/srain/cube/views/ptr/demo/ui/viewpager/ViewPagerFragment.java
class ViewPagerFragment (line 20) | public class ViewPagerFragment extends CubeFragment {
method create (line 27) | public static ViewPagerFragment create(int page) {
method createView (line 33) | @Override
method onCreateView (line 38) | @Override
method update (line 69) | public void update(JsonData data) {
method show (line 75) | public void show() {
method hide (line 79) | public void hide() {
method checkCanDoRefresh (line 83) | public boolean checkCanDoRefresh() {
FILE: ptr-lib/src/in/srain/cube/views/ptr/PtrClassicDefaultHeader.java
class PtrClassicDefaultHeader (line 19) | public class PtrClassicDefaultHeader extends FrameLayout implements PtrU...
method PtrClassicDefaultHeader (line 36) | public PtrClassicDefaultHeader(Context context) {
method PtrClassicDefaultHeader (line 41) | public PtrClassicDefaultHeader(Context context, AttributeSet attrs) {
method PtrClassicDefaultHeader (line 46) | public PtrClassicDefaultHeader(Context context, AttributeSet attrs, in...
method initViews (line 51) | protected void initViews(AttributeSet attrs) {
method onDetachedFromWindow (line 68) | @Override
method setRotateAniTime (line 76) | public void setRotateAniTime(int time) {
method setLastUpdateTimeKey (line 89) | public void setLastUpdateTimeKey(String key) {
method setLastUpdateTimeRelateObject (line 101) | public void setLastUpdateTimeRelateObject(Object object) {
method buildAnimation (line 105) | private void buildAnimation() {
method resetView (line 117) | private void resetView() {
method hideRotateView (line 122) | private void hideRotateView() {
method onUIReset (line 127) | @Override
method onUIRefreshPrepare (line 134) | @Override
method onUIRefreshBegin (line 152) | @Override
method onUIRefreshComplete (line 164) | @Override
method tryUpdateLastUpdateTime (line 181) | private void tryUpdateLastUpdateTime() {
method getLastUpdateTime (line 195) | private String getLastUpdateTime() {
method onUIPositionChange (line 234) | @Override
method crossRotateLineFromTopUnderTouch (line 260) | private void crossRotateLineFromTopUnderTouch(PtrFrameLayout frame) {
method crossRotateLineFromBottomUnderTouch (line 267) | private void crossRotateLineFromBottomUnderTouch(PtrFrameLayout frame) {
class LastUpdateTimeUpdater (line 276) | private class LastUpdateTimeUpdater implements Runnable {
method start (line 280) | private void start() {
method stop (line 288) | private void stop() {
method run (line 293) | @Override
FILE: ptr-lib/src/in/srain/cube/views/ptr/PtrClassicFrameLayout.java
class PtrClassicFrameLayout (line 6) | public class PtrClassicFrameLayout extends PtrFrameLayout {
method PtrClassicFrameLayout (line 10) | public PtrClassicFrameLayout(Context context) {
method PtrClassicFrameLayout (line 15) | public PtrClassicFrameLayout(Context context, AttributeSet attrs) {
method PtrClassicFrameLayout (line 20) | public PtrClassicFrameLayout(Context context, AttributeSet attrs, int ...
method initViews (line 25) | private void initViews() {
method getHeader (line 31) | public PtrClassicDefaultHeader getHeader() {
method setLastUpdateTimeKey (line 40) | public void setLastUpdateTimeKey(String key) {
method setLastUpdateTimeRelateObject (line 51) | public void setLastUpdateTimeRelateObject(Object object) {
FILE: ptr-lib/src/in/srain/cube/views/ptr/PtrDefaultHandler.java
class PtrDefaultHandler (line 6) | public abstract class PtrDefaultHandler implements PtrHandler {
method canChildScrollUp (line 8) | public static boolean canChildScrollUp(View view) {
method checkContentCanBePulledDown (line 31) | public static boolean checkContentCanBePulledDown(PtrFrameLayout frame...
method checkCanDoRefresh (line 35) | @Override
FILE: ptr-lib/src/in/srain/cube/views/ptr/PtrFrameLayout.java
class PtrFrameLayout (line 17) | public class PtrFrameLayout extends ViewGroup {
method run (line 66) | @Override
method PtrFrameLayout (line 72) | public PtrFrameLayout(Context context) {
method PtrFrameLayout (line 76) | public PtrFrameLayout(Context context, AttributeSet attrs) {
method PtrFrameLayout (line 80) | public PtrFrameLayout(Context context, AttributeSet attrs, int defStyl...
method onFinishInflate (line 113) | @Override
method onDetachedFromWindow (line 171) | @Override
method onMeasure (line 183) | @Override
method measureContentView (line 214) | private void measureContentView(View child,
method onLayout (line 227) | @Override
method layoutChildren (line 232) | private void layoutChildren() {
method isDebug (line 265) | @SuppressWarnings({"PointlessBooleanExpression", "ConstantConditions"})
method dispatchTouchEventSupper (line 270) | public boolean dispatchTouchEventSupper(MotionEvent e) {
method dispatchTouchEvent (line 274) | @Override
method movePos (line 353) | private void movePos(float deltaY) {
method updatePos (line 377) | private void updatePos(int change) {
method onPositionChange (line 441) | protected void onPositionChange(boolean isInTouching, byte status, Ptr...
method getHeaderHeight (line 444) | @SuppressWarnings("unused")
method onRelease (line 449) | private void onRelease(boolean stayForLoading) {
method setRefreshCompleteHook (line 480) | public void setRefreshCompleteHook(PtrUIHandlerHook hook) {
method tryScrollBackToTop (line 496) | private void tryScrollBackToTop() {
method tryScrollBackToTopWhileLoading (line 505) | private void tryScrollBackToTopWhileLoading() {
method tryScrollBackToTopAfterComplete (line 512) | private void tryScrollBackToTopAfterComplete() {
method tryScrollBackToTopAbortRefresh (line 519) | private void tryScrollBackToTopAbortRefresh() {
method tryToPerformRefresh (line 523) | private boolean tryToPerformRefresh() {
method performRefresh (line 536) | private void performRefresh() {
method tryToNotifyReset (line 552) | private boolean tryToNotifyReset() {
method onPtrScrollAbort (line 567) | protected void onPtrScrollAbort() {
method onPtrScrollFinish (line 576) | protected void onPtrScrollFinish() {
method isRefreshing (line 590) | public boolean isRefreshing() {
method refreshComplete (line 598) | final public void refreshComplete() {
method performRefreshComplete (line 624) | private void performRefreshComplete() {
method notifyUIRefreshComplete (line 645) | private void notifyUIRefreshComplete(boolean ignoreHook) {
method autoRefresh (line 668) | public void autoRefresh() {
method autoRefresh (line 672) | public void autoRefresh(boolean atOnce) {
method clearFlag (line 676) | private void clearFlag() {
method autoRefresh (line 681) | public void autoRefresh(boolean atOnce, int duration) {
method isAutoRefresh (line 703) | public boolean isAutoRefresh() {
method performAutoRefreshButLater (line 707) | private boolean performAutoRefreshButLater() {
method isEnabledNextPtrAtOnce (line 711) | public boolean isEnabledNextPtrAtOnce() {
method setEnabledNextPtrAtOnce (line 720) | public void setEnabledNextPtrAtOnce(boolean enable) {
method isPinContent (line 728) | public boolean isPinContent() {
method setPinContent (line 737) | public void setPinContent(boolean pinContent) {
method disableWhenHorizontalMove (line 750) | public void disableWhenHorizontalMove(boolean disable) {
method setLoadingMinTime (line 759) | public void setLoadingMinTime(int time) {
method setInterceptEventWhileWorking (line 768) | @Deprecated
method getContentView (line 772) | @SuppressWarnings({"unused"})
method setPtrHandler (line 777) | public void setPtrHandler(PtrHandler ptrHandler) {
method addPtrUIHandler (line 781) | public void addPtrUIHandler(PtrUIHandler ptrUIHandler) {
method removePtrUIHandler (line 785) | @SuppressWarnings({"unused"})
method setPtrIndicator (line 790) | public void setPtrIndicator(PtrIndicator slider) {
method getResistance (line 797) | @SuppressWarnings({"unused"})
method setResistance (line 802) | public void setResistance(float resistance) {
method getDurationToClose (line 806) | @SuppressWarnings({"unused"})
method setDurationToClose (line 816) | public void setDurationToClose(int duration) {
method getDurationToCloseHeader (line 820) | @SuppressWarnings({"unused"})
method setDurationToCloseHeader (line 830) | public void setDurationToCloseHeader(int duration) {
method setRatioOfHeaderHeightToRefresh (line 834) | public void setRatioOfHeaderHeightToRefresh(float ratio) {
method getOffsetToRefresh (line 838) | public int getOffsetToRefresh() {
method setOffsetToRefresh (line 842) | @SuppressWarnings({"unused"})
method getRatioOfHeaderToHeightRefresh (line 847) | @SuppressWarnings({"unused"})
method getOffsetToKeepHeaderWhileLoading (line 852) | @SuppressWarnings({"unused"})
method setOffsetToKeepHeaderWhileLoading (line 857) | @SuppressWarnings({"unused"})
method isKeepHeaderWhenRefresh (line 862) | @SuppressWarnings({"unused"})
method setKeepHeaderWhenRefresh (line 867) | public void setKeepHeaderWhenRefresh(boolean keepOrNot) {
method isPullToRefresh (line 871) | public boolean isPullToRefresh() {
method setPullToRefresh (line 875) | public void setPullToRefresh(boolean pullToRefresh) {
method getHeaderView (line 879) | @SuppressWarnings({"unused"})
method setHeaderView (line 884) | public void setHeaderView(View header) {
method checkLayoutParams (line 897) | @Override
method generateDefaultLayoutParams (line 902) | @Override
method generateLayoutParams (line 907) | @Override
method generateLayoutParams (line 912) | @Override
method sendCancelEvent (line 917) | private void sendCancelEvent() {
method sendDownEvent (line 931) | private void sendDownEvent() {
class LayoutParams (line 940) | public static class LayoutParams extends MarginLayoutParams {
method LayoutParams (line 942) | public LayoutParams(Context c, AttributeSet attrs) {
method LayoutParams (line 946) | public LayoutParams(int width, int height) {
method LayoutParams (line 950) | @SuppressWarnings({"unused"})
method LayoutParams (line 955) | public LayoutParams(ViewGroup.LayoutParams source) {
class ScrollChecker (line 960) | class ScrollChecker implements Runnable {
method ScrollChecker (line 968) | public ScrollChecker() {
method run (line 972) | public void run() {
method finish (line 992) | private void finish() {
method reset (line 1000) | private void reset() {
method destroy (line 1006) | private void destroy() {
method abortIfWorking (line 1013) | public void abortIfWorking() {
method tryToScrollTo (line 1023) | public void tryToScrollTo(int to, int duration) {
FILE: ptr-lib/src/in/srain/cube/views/ptr/PtrHandler.java
type PtrHandler (line 5) | public interface PtrHandler {
method checkCanDoRefresh (line 12) | public boolean checkCanDoRefresh(final PtrFrameLayout frame, final Vie...
method onRefreshBegin (line 19) | public void onRefreshBegin(final PtrFrameLayout frame);
FILE: ptr-lib/src/in/srain/cube/views/ptr/PtrUIHandler.java
type PtrUIHandler (line 8) | public interface PtrUIHandler {
method onUIReset (line 15) | public void onUIReset(PtrFrameLayout frame);
method onUIRefreshPrepare (line 22) | public void onUIRefreshPrepare(PtrFrameLayout frame);
method onUIRefreshBegin (line 27) | public void onUIRefreshBegin(PtrFrameLayout frame);
method onUIRefreshComplete (line 32) | public void onUIRefreshComplete(PtrFrameLayout frame);
method onUIPositionChange (line 34) | public void onUIPositionChange(PtrFrameLayout frame, boolean isUnderTo...
FILE: ptr-lib/src/in/srain/cube/views/ptr/PtrUIHandlerHolder.java
class PtrUIHandlerHolder (line 8) | class PtrUIHandlerHolder implements PtrUIHandler {
method contains (line 13) | private boolean contains(PtrUIHandler handler) {
method PtrUIHandlerHolder (line 17) | private PtrUIHandlerHolder() {
method hasHandler (line 21) | public boolean hasHandler() {
method getHandler (line 25) | private PtrUIHandler getHandler() {
method addHandler (line 29) | public static void addHandler(PtrUIHandlerHolder head, PtrUIHandler ha...
method create (line 59) | public static PtrUIHandlerHolder create() {
method removeHandler (line 63) | public static PtrUIHandlerHolder removeHandler(PtrUIHandlerHolder head...
method onUIReset (line 102) | @Override
method onUIRefreshPrepare (line 113) | @Override
method onUIRefreshBegin (line 127) | @Override
method onUIRefreshComplete (line 138) | @Override
method onUIPositionChange (line 149) | @Override
FILE: ptr-lib/src/in/srain/cube/views/ptr/PtrUIHandlerHook.java
class PtrUIHandlerHook (line 8) | public abstract class PtrUIHandlerHook implements Runnable {
method takeOver (line 16) | public void takeOver() {
method takeOver (line 20) | public void takeOver(Runnable resumeAction) {
method reset (line 37) | public void reset() {
method resume (line 41) | public void resume() {
method setResumeAction (line 53) | public void setResumeAction(Runnable runnable) {
FILE: ptr-lib/src/in/srain/cube/views/ptr/header/MaterialHeader.java
class MaterialHeader (line 17) | public class MaterialHeader extends View implements PtrUIHandler {
method applyTransformation (line 24) | @Override
method MaterialHeader (line 32) | public MaterialHeader(Context context) {
method MaterialHeader (line 37) | public MaterialHeader(Context context, AttributeSet attrs) {
method MaterialHeader (line 42) | public MaterialHeader(Context context, AttributeSet attrs, int defStyl...
method setPtrFrameLayout (line 47) | public void setPtrFrameLayout(PtrFrameLayout layout) {
method initView (line 78) | private void initView() {
method invalidateDrawable (line 84) | @Override
method setColorSchemeColors (line 93) | public void setColorSchemeColors(int[] colors) {
method onMeasure (line 98) | @Override
method onLayout (line 105) | @Override
method onDraw (line 111) | @Override
method onUIReset (line 127) | @Override
method onUIRefreshPrepare (line 138) | @Override
method onUIRefreshBegin (line 147) | @Override
method onUIRefreshComplete (line 158) | @Override
method onUIPositionChange (line 163) | @Override
FILE: ptr-lib/src/in/srain/cube/views/ptr/header/MaterialProgressDrawable.java
class MaterialProgressDrawable (line 42) | public class MaterialProgressDrawable extends Drawable implements Animat...
method invalidateDrawable (line 100) | @Override
method scheduleDrawable (line 105) | @Override
method unscheduleDrawable (line 110) | @Override
method MaterialProgressDrawable (line 129) | public MaterialProgressDrawable(Context context, View parent) {
method setSizeParameters (line 138) | private void setSizeParameters(double progressCircleWidth, double prog...
method setUp (line 153) | private void setUp(final double diameter) {
method updateSizes (line 173) | public void updateSizes(int size) {
method showArrow (line 186) | public void showArrow(boolean show) {
method setArrowScale (line 193) | public void setArrowScale(float scale) {
method setStartEndTrim (line 203) | public void setStartEndTrim(float startAngle, float endAngle) {
method setProgressRotation (line 213) | public void setProgressRotation(float rotation) {
method setBackgroundColor (line 220) | public void setBackgroundColor(int color) {
method setColorSchemeColors (line 232) | public void setColorSchemeColors(int... colors) {
method getIntrinsicHeight (line 237) | @Override
method getIntrinsicWidth (line 242) | @Override
method draw (line 247) | @Override
method getAlpha (line 261) | public int getAlpha() {
method setAlpha (line 265) | @Override
method setColorFilter (line 270) | @Override
method getRotation (line 275) | @SuppressWarnings("unused")
method setRotation (line 280) | @SuppressWarnings("unused")
method getOpacity (line 286) | @Override
method isRunning (line 291) | @Override
method start (line 304) | @Override
method stop (line 318) | @Override
method setupAnimators (line 327) | private void setupAnimators() {
class Ring (line 417) | private static class Ring {
method Ring (line 445) | public Ring(Callback callback) {
method setBackgroundColor (line 456) | public void setBackgroundColor(int color) {
method setArrowDimensions (line 466) | public void setArrowDimensions(float width, float height) {
method draw (line 474) | public void draw(Canvas c, Rect bounds) {
method drawTriangle (line 493) | private void drawTriangle(Canvas c, float startAngle, float sweepAng...
method setColors (line 530) | public void setColors(int[] colors) {
method setColorIndex (line 540) | public void setColorIndex(int index) {
method goToNextColor (line 548) | public void goToNextColor() {
method setColorFilter (line 552) | public void setColorFilter(ColorFilter filter) {
method getAlpha (line 560) | public int getAlpha() {
method setAlpha (line 567) | public void setAlpha(int alpha) {
method getStrokeWidth (line 571) | @SuppressWarnings("unused")
method setStrokeWidth (line 579) | public void setStrokeWidth(float strokeWidth) {
method getStartTrim (line 585) | @SuppressWarnings("unused")
method setStartTrim (line 590) | @SuppressWarnings("unused")
method getStartingStartTrim (line 596) | public float getStartingStartTrim() {
method getStartingEndTrim (line 600) | public float getStartingEndTrim() {
method getEndTrim (line 604) | @SuppressWarnings("unused")
method setEndTrim (line 609) | @SuppressWarnings("unused")
method getRotation (line 615) | @SuppressWarnings("unused")
method setRotation (line 620) | @SuppressWarnings("unused")
method setInsets (line 626) | public void setInsets(int width, int height) {
method getInsets (line 637) | @SuppressWarnings("unused")
method getCenterRadius (line 642) | public double getCenterRadius() {
method setCenterRadius (line 650) | public void setCenterRadius(double centerRadius) {
method setShowArrow (line 657) | public void setShowArrow(boolean show) {
method setArrowScale (line 667) | public void setArrowScale(float scale) {
method getStartingRotation (line 677) | public float getStartingRotation() {
method storeOriginals (line 685) | public void storeOriginals() {
method resetOriginals (line 694) | public void resetOriginals() {
method invalidateSelf (line 703) | private void invalidateSelf() {
class EndCurveInterpolator (line 711) | private static class EndCurveInterpolator extends AccelerateDecelerate...
method getInterpolation (line 712) | @Override
class StartCurveInterpolator (line 721) | private static class StartCurveInterpolator extends AccelerateDecelera...
method getInterpolation (line 722) | @Override
class OvalShadow (line 731) | private class OvalShadow extends OvalShape {
method OvalShadow (line 737) | public OvalShadow(int shadowRadius, int circleDiameter) {
method draw (line 749) | @Override
FILE: ptr-lib/src/in/srain/cube/views/ptr/header/StoreHouseBarItem.java
class StoreHouseBarItem (line 14) | public class StoreHouseBarItem extends Animation {
method StoreHouseBarItem (line 26) | public StoreHouseBarItem(int index, PointF start, PointF end, int colo...
method setLineWidth (line 40) | public void setLineWidth(int width) {
method setColor (line 44) | public void setColor(int color) {
method resetPosition (line 48) | public void resetPosition(int horizontalRandomness) {
method applyTransformation (line 54) | @Override
method start (line 61) | public void start(float fromAlpha, float toAlpha) {
method setAlpha (line 67) | public void setAlpha(float alpha) {
method draw (line 71) | public void draw(Canvas canvas) {
FILE: ptr-lib/src/in/srain/cube/views/ptr/header/StoreHouseHeader.java
class StoreHouseHeader (line 18) | public class StoreHouseHeader extends View implements PtrUIHandler {
method StoreHouseHeader (line 47) | public StoreHouseHeader(Context context) {
method StoreHouseHeader (line 52) | public StoreHouseHeader(Context context, AttributeSet attrs) {
method StoreHouseHeader (line 57) | public StoreHouseHeader(Context context, AttributeSet attrs, int defSt...
method initView (line 62) | private void initView() {
method setProgress (line 69) | private void setProgress(float progress) {
method getLoadingAniDuration (line 73) | public int getLoadingAniDuration() {
method setLoadingAniDuration (line 77) | public void setLoadingAniDuration(int duration) {
method setLineWidth (line 82) | public StoreHouseHeader setLineWidth(int width) {
method setTextColor (line 90) | public StoreHouseHeader setTextColor(int color) {
method setDropHeight (line 98) | public StoreHouseHeader setDropHeight(int height) {
method onMeasure (line 103) | @Override
method getTopOffset (line 114) | private int getTopOffset() {
method getBottomOffset (line 118) | private int getBottomOffset() {
method initWithString (line 122) | public void initWithString(String str) {
method initWithString (line 126) | public void initWithString(String str, int fontSize) {
method initWithStringArray (line 131) | public void initWithStringArray(int id) {
method getScale (line 145) | public float getScale() {
method setScale (line 149) | public void setScale(float scale) {
method initWithPointList (line 153) | public void initWithPointList(ArrayList<float[]> pointList) {
method beginLoading (line 181) | private void beginLoading() {
method loadFinish (line 187) | private void loadFinish() {
method onDraw (line 192) | @Override
method onUIReset (line 249) | @Override
method onUIRefreshPrepare (line 258) | @Override
method onUIRefreshBegin (line 263) | @Override
method onUIRefreshComplete (line 268) | @Override
method onUIPositionChange (line 273) | @Override
class AniController (line 281) | private class AniController implements Runnable {
method start (line 289) | private void start() {
method run (line 299) | @Override
method stop (line 326) | private void stop() {
FILE: ptr-lib/src/in/srain/cube/views/ptr/header/StoreHousePath.java
class StoreHousePath (line 10) | public class StoreHousePath {
method addChar (line 324) | public static void addChar(char c, float[] points) {
method getPath (line 328) | public static ArrayList<float[]> getPath(String str) {
method getPath (line 338) | public static ArrayList<float[]> getPath(String str, float scale, int ...
FILE: ptr-lib/src/in/srain/cube/views/ptr/indicator/PtrIndicator.java
class PtrIndicator (line 5) | public class PtrIndicator {
method isUnderTouch (line 24) | public boolean isUnderTouch() {
method getResistance (line 28) | public float getResistance() {
method setResistance (line 32) | public void setResistance(float resistance) {
method onRelease (line 36) | public void onRelease() {
method onUIRefreshComplete (line 40) | public void onUIRefreshComplete() {
method goDownCrossFinishPosition (line 44) | public boolean goDownCrossFinishPosition() {
method processOnMove (line 48) | protected void processOnMove(float currentX, float currentY, float off...
method setRatioOfHeaderHeightToRefresh (line 52) | public void setRatioOfHeaderHeightToRefresh(float ratio) {
method getRatioOfHeaderToHeightRefresh (line 57) | public float getRatioOfHeaderToHeightRefresh() {
method getOffsetToRefresh (line 61) | public int getOffsetToRefresh() {
method setOffsetToRefresh (line 65) | public void setOffsetToRefresh(int offset) {
method onPressDown (line 70) | public void onPressDown(float x, float y) {
method onMove (line 76) | public final void onMove(float x, float y) {
method setOffset (line 83) | protected void setOffset(float x, float y) {
method getOffsetX (line 88) | public float getOffsetX() {
method getOffsetY (line 92) | public float getOffsetY() {
method getLastPosY (line 96) | public int getLastPosY() {
method getCurrentPosY (line 100) | public int getCurrentPosY() {
method setCurrentPos (line 107) | public final void setCurrentPos(int current) {
method onUpdatePos (line 113) | protected void onUpdatePos(int current, int last) {
method getHeaderHeight (line 117) | public int getHeaderHeight() {
method setHeaderHeight (line 121) | public void setHeaderHeight(int height) {
method updateHeight (line 126) | protected void updateHeight() {
method convertFrom (line 130) | public void convertFrom(PtrIndicator ptrSlider) {
method hasLeftStartPosition (line 136) | public boolean hasLeftStartPosition() {
method hasJustLeftStartPosition (line 140) | public boolean hasJustLeftStartPosition() {
method hasJustBackToStartPosition (line 144) | public boolean hasJustBackToStartPosition() {
method isOverOffsetToRefresh (line 148) | public boolean isOverOffsetToRefresh() {
method hasMovedAfterPressedDown (line 152) | public boolean hasMovedAfterPressedDown() {
method isInStartPosition (line 156) | public boolean isInStartPosition() {
method crossRefreshLineFromTopToBottom (line 160) | public boolean crossRefreshLineFromTopToBottom() {
method hasJustReachedHeaderHeightFromTopToBottom (line 164) | public boolean hasJustReachedHeaderHeightFromTopToBottom() {
method isOverOffsetToKeepHeaderWhileLoading (line 168) | public boolean isOverOffsetToKeepHeaderWhileLoading() {
method setOffsetToKeepHeaderWhileLoading (line 172) | public void setOffsetToKeepHeaderWhileLoading(int offset) {
method getOffsetToKeepHeaderWhileLoading (line 176) | public int getOffsetToKeepHeaderWhileLoading() {
method isAlreadyHere (line 180) | public boolean isAlreadyHere(int to) {
method getLastPercent (line 184) | public float getLastPercent() {
method getCurrentPercent (line 189) | public float getCurrentPercent() {
method willOverTop (line 194) | public boolean willOverTop(int to) {
FILE: ptr-lib/src/in/srain/cube/views/ptr/indicator/PtrTensionIndicator.java
class PtrTensionIndicator (line 3) | public class PtrTensionIndicator extends PtrIndicator {
method onPressDown (line 15) | @Override
method onRelease (line 22) | @Override
method onUIRefreshComplete (line 29) | @Override
method setHeaderHeight (line 35) | @Override
method processOnMove (line 41) | @Override
method offsetToTarget (line 76) | private float offsetToTarget(float scrollTop) {
method getOffsetToKeepHeaderWhileLoading (line 98) | @Override
method getOffsetToRefresh (line 103) | @Override
method getOverDragPercent (line 108) | public float getOverDragPercent() {
FILE: ptr-lib/src/in/srain/cube/views/ptr/util/PtrCLog.java
class PtrCLog (line 10) | public class PtrCLog {
method setLogLevel (line 26) | public static void setLogLevel(int level) {
method v (line 36) | public static void v(String tag, String msg) {
method v (line 50) | public static void v(String tag, String msg, Throwable throwable) {
method v (line 64) | public static void v(String tag, String msg, Object... args) {
method d (line 80) | public static void d(String tag, String msg) {
method d (line 94) | public static void d(String tag, String msg, Object... args) {
method d (line 111) | public static void d(String tag, String msg, Throwable throwable) {
method i (line 124) | public static void i(String tag, String msg) {
method i (line 138) | public static void i(String tag, String msg, Object... args) {
method i (line 154) | public static void i(String tag, String msg, Throwable throwable) {
method w (line 167) | public static void w(String tag, String msg) {
method w (line 181) | public static void w(String tag, String msg, Object... args) {
method w (line 198) | public static void w(String tag, String msg, Throwable throwable) {
method e (line 211) | public static void e(String tag, String msg) {
method e (line 225) | public static void e(String tag, String msg, Object... args) {
method e (line 242) | public static void e(String tag, String msg, Throwable throwable) {
method f (line 255) | public static void f(String tag, String msg) {
method f (line 269) | public static void f(String tag, String msg, Object... args) {
method f (line 286) | public static void f(String tag, String msg, Throwable throwable) {
FILE: ptr-lib/src/in/srain/cube/views/ptr/util/PtrLocalDisplay.java
class PtrLocalDisplay (line 8) | public class PtrLocalDisplay {
method init (line 16) | public static void init(Context context) {
method dp2px (line 30) | public static int dp2px(float dp) {
method designedDP2px (line 35) | public static int designedDP2px(float designedDp) {
method setPadding (line 42) | public static void setPadding(final View view, float left, float top, ...
FILE: update-project.py
function update_var_for_file (line 22) | def update_var_for_file(file, vars):
Condensed preview — 124 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (383K chars).
[
{
"path": ".gitignore",
"chars": 306,
"preview": "# built application files\n*.ap_\n\n# files for the dex VM\n*.dex\n*.iml\n\n# Java class files\n*.class\n\n# generated files\nbin/\n"
},
{
"path": ".travis.yml",
"chars": 155,
"preview": "language: android\n\nandroid:\n components:\n - build-tools-20.0.0\n - android-16\n\njdk: oraclejdk7\n\nscript:\n - ./gr"
},
{
"path": "LICENSE",
"chars": 1083,
"preview": "The MIT License (MIT)\n\nCopyright (c) <2015> <liaohuqiu.net>\n\nPermission is hereby granted, free of charge, to any person"
},
{
"path": "README-cn.md",
"chars": 7720,
"preview": "###### 欢迎关注我\n\nGitHub: https://github.com/liaohuqiu\n\n微博: http://weibo.com/liaohuqiu\n\n知乎: http://www.zhihu.com/people/liao"
},
{
"path": "README.md",
"chars": 9939,
"preview": "###### Welcome to follow me on GitHub or Twitter\n\nGitHub: https://github.com/liaohuqiu\n\nTwitter: https://twitter.com/lia"
},
{
"path": "build.gradle",
"chars": 424,
"preview": "buildscript {\n repositories {\n jcenter()\n }\n dependencies {\n classpath 'com.android.tools.build:g"
},
{
"path": "buildSrc/src/main/groovy/copy-libs.gradle",
"chars": 1709,
"preview": "buildscript {\n repositories {\n jcenter()\n }\n dependencies {\n classpath 'com.android.tools.build:g"
},
{
"path": "gradle/wrapper/gradle-wrapper.properties",
"chars": 238,
"preview": "#Thu Dec 18 15:33:58 CST 2014\r\ndistributionBase=GRADLE_USER_HOME\r\ndistributionPath=wrapper/dists\r\nzipStoreBase=GRADLE_US"
},
{
"path": "gradle.properties",
"chars": 132,
"preview": "ANDROID_BUILD_MIN_SDK_VERSION=8\nANDROID_BUILD_TARGET_SDK_VERSION=22\nANDROID_BUILD_SDK_VERSION=22\nANDROID_BUILD_TOOLS_VER"
},
{
"path": "gradlew",
"chars": 5080,
"preview": "#!/usr/bin/env bash\n\n##############################################################################\n##\n## Gradle start "
},
{
"path": "gradlew.bat",
"chars": 2404,
"preview": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@r"
},
{
"path": "pom.xml",
"chars": 727,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
},
{
"path": "proguard-project.txt",
"chars": 997,
"preview": "# To enable ProGuard in your project, edit project.properties\n# to define the proguard.config property as described in t"
},
{
"path": "project.properties",
"chars": 631,
"preview": "# This file is automatically generated by Android Tools.\n# Do not modify this file -- YOUR CHANGES WILL BE ERASED!\n#\n# T"
},
{
"path": "ptr-demo/AndroidManifest.xml",
"chars": 1335,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest\n package=\"in.srain.cube.views.ptr.demo\"\n xmlns:android=\"http://sc"
},
{
"path": "ptr-demo/assets/request_init/demo/image-list.json",
"chars": 6896,
"preview": "{\"data\":{\"time\":\"2014-08-27 02:13:01 UTC\",\"list\":[{\"pic\":\"http:\\/\\/img4.duitang.com\\/uploads\\/blog\\/201311\\/04\\/20131104"
},
{
"path": "ptr-demo/build.gradle",
"chars": 2601,
"preview": "apply plugin: 'com.android.application'\n\nandroid {\n compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERS"
},
{
"path": "ptr-demo/pom.xml",
"chars": 2754,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
},
{
"path": "ptr-demo/proguard-project.txt",
"chars": 781,
"preview": "# To enable ProGuard in your project, edit project.properties\n# to define the proguard.config property as described in t"
},
{
"path": "ptr-demo/proguard-rules.pro",
"chars": 57,
"preview": "-keep class in.srain.*\n-dontwarn android.graphics.Bitmap\n"
},
{
"path": "ptr-demo/project.properties",
"chars": 563,
"preview": "# This file is automatically generated by Android Tools.\n# Do not modify this file -- YOUR CHANGES WILL BE ERASED!\n#\n# T"
},
{
"path": "ptr-demo/res/drawable/image_border.xml",
"chars": 230,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n <solid an"
},
{
"path": "ptr-demo/res/drawable/text_view_bg.xml",
"chars": 276,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\r\n <item"
},
{
"path": "ptr-demo/res/drawable/with_long_press_list_item_background.xml",
"chars": 380,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <item a"
},
{
"path": "ptr-demo/res/layout/activity_main.xml",
"chars": 372,
"preview": "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:layout_width=\"match_parent\"\n and"
},
{
"path": "ptr-demo/res/layout/activity_view_pager.xml",
"chars": 1168,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n andr"
},
{
"path": "ptr-demo/res/layout/fragment_classic_header_with_gridview.xml",
"chars": 1529,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n an"
},
{
"path": "ptr-demo/res/layout/fragment_classic_header_with_list_view.xml",
"chars": 1363,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n an"
},
{
"path": "ptr-demo/res/layout/fragment_classic_header_with_list_view_and_empty_view.xml",
"chars": 2060,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n an"
},
{
"path": "ptr-demo/res/layout/fragment_classic_header_with_scroll_view.xml",
"chars": 2812,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xm"
},
{
"path": "ptr-demo/res/layout/fragment_classic_header_with_textview.xml",
"chars": 1439,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n an"
},
{
"path": "ptr-demo/res/layout/fragment_classic_header_with_viewgroup.xml",
"chars": 1820,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n an"
},
{
"path": "ptr-demo/res/layout/fragment_classic_header_with_webview.xml",
"chars": 1047,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n an"
},
{
"path": "ptr-demo/res/layout/fragment_materail_style.xml",
"chars": 1390,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n an"
},
{
"path": "ptr-demo/res/layout/fragment_ptr_home.xml",
"chars": 1359,
"preview": "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:layout_width=\"match_parent\"\n and"
},
{
"path": "ptr-demo/res/layout/fragment_storehouse_header.xml",
"chars": 1381,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n an"
},
{
"path": "ptr-demo/res/layout/fragment_view_pager.xml",
"chars": 660,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n an"
},
{
"path": "ptr-demo/res/layout/fragment_with_long_press.xml",
"chars": 1260,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n andr"
},
{
"path": "ptr-demo/res/layout/list_view_item.xml",
"chars": 791,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n andro"
},
{
"path": "ptr-demo/res/layout/view_pager_fragment_list_view_header.xml",
"chars": 605,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n andr"
},
{
"path": "ptr-demo/res/layout/view_pager_indicator_item.xml",
"chars": 1054,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n andr"
},
{
"path": "ptr-demo/res/layout/with_grid_view_item_image_list_grid.xml",
"chars": 717,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n andr"
},
{
"path": "ptr-demo/res/layout/with_long_press_list_view_item.xml",
"chars": 923,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n andro"
},
{
"path": "ptr-demo/res/values/arrays.xml",
"chars": 1374,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <string-array name=\"akta\">\n <item>22,0,0,30,</item>\n "
},
{
"path": "ptr-demo/res/values/ptr_demo_colors.xml",
"chars": 229,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <color name=\"red\">#FFC93437</color>\n <color name=\"blue\">#FF375"
},
{
"path": "ptr-demo/res/values/strings.xml",
"chars": 2290,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <string name=\"app_name\">Ultra PTR</string>\n <string name=\"ptr"
},
{
"path": "ptr-demo/res/values-zh/strings.xml",
"chars": 1204,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"app_name\">Ultra PTR</string>\n <string name=\"ptr_"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/app/PtrDemoApplication.java",
"chars": 1447,
"preview": "package in.srain.cube.views.ptr.demo.app;\n\nimport android.app.Application;\nimport in.srain.cube.Cube;\nimport in.srain.cu"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/data/DemoRequestData.java",
"chars": 969,
"preview": "package in.srain.cube.views.ptr.demo.data;\n\nimport in.srain.cube.request.*;\n\npublic class DemoRequestData {\n\n public "
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/image/DemoDuiTangImageReSizer.java",
"chars": 2170,
"preview": "package in.srain.cube.views.ptr.demo.image;\n\nimport in.srain.cube.image.ImageTask;\nimport in.srain.cube.image.impl.Defau"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/image/Images.java",
"chars": 11639,
"preview": "package in.srain.cube.views.ptr.demo.image;\n\nimport in.srain.cube.image.ImageReuseInfoManger;\n\npublic class Images {\n\n "
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/image/PtrImageLoadHandler.java",
"chars": 1118,
"preview": "package in.srain.cube.views.ptr.demo.image;\r\n\r\nimport android.graphics.Color;\r\nimport android.graphics.drawable.BitmapDr"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/EnableNextPTRAtOnce.java",
"chars": 538,
"preview": "package in.srain.cube.views.ptr.demo.ui;\n\nimport in.srain.cube.views.ptr.PtrClassicFrameLayout;\nimport in.srain.cube.vie"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/MaterialStyleFragment.java",
"chars": 4994,
"preview": "package in.srain.cube.views.ptr.demo.ui;\n\nimport android.graphics.Color;\nimport android.graphics.drawable.BitmapDrawable"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/MaterialStylePinContentFragment.java",
"chars": 586,
"preview": "package in.srain.cube.views.ptr.demo.ui;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.v"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/PtrDemoHomeFragment.java",
"chars": 9978,
"preview": "package in.srain.cube.views.ptr.demo.ui;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.view.L"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/RentalsStyleFragment.java",
"chars": 4590,
"preview": "package in.srain.cube.views.ptr.demo.ui;\n\nimport android.graphics.Color;\nimport android.graphics.drawable.BitmapDrawable"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/Utils.java",
"chars": 796,
"preview": "package in.srain.cube.views.ptr.demo.ui;\n\nimport android.content.Context;\nimport android.view.LayoutInflater;\nimport and"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/WithLongPressFragment.java",
"chars": 3715,
"preview": "package in.srain.cube.views.ptr.demo.ui;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.v"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/activity/PtrDemoHomeActivity.java",
"chars": 601,
"preview": "package in.srain.cube.views.ptr.demo.ui.activity;\n\nimport android.os.Bundle;\nimport in.srain.cube.mints.base.MintsBaseAc"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/AutoRefresh.java",
"chars": 561,
"preview": "package in.srain.cube.views.ptr.demo.ui.classic;\n\nimport in.srain.cube.views.ptr.PtrClassicFrameLayout;\nimport in.srain."
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/EvenOnlyATextView.java",
"chars": 1546,
"preview": "package in.srain.cube.views.ptr.demo.ui.classic;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport a"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/HideHeader.java",
"chars": 1392,
"preview": "package in.srain.cube.views.ptr.demo.ui.classic;\n\nimport android.view.View;\nimport in.srain.cube.views.ptr.PtrClassicFra"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/KeepHeader.java",
"chars": 409,
"preview": "package in.srain.cube.views.ptr.demo.ui.classic;\n\nimport in.srain.cube.views.ptr.PtrClassicFrameLayout;\nimport in.srain."
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/PullToRefresh.java",
"chars": 408,
"preview": "package in.srain.cube.views.ptr.demo.ui.classic;\n\nimport in.srain.cube.views.ptr.PtrClassicFrameLayout;\nimport in.srain."
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/ReleaseToRefresh.java",
"chars": 415,
"preview": "package in.srain.cube.views.ptr.demo.ui.classic;\n\nimport in.srain.cube.views.ptr.PtrClassicFrameLayout;\nimport in.srain."
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/WithGridView.java",
"chars": 5590,
"preview": "package in.srain.cube.views.ptr.demo.ui.classic;\n\nimport android.os.Bundle;\nimport android.text.TextUtils;\nimport androi"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/WithListView.java",
"chars": 4817,
"preview": "package in.srain.cube.views.ptr.demo.ui.classic;\n\nimport android.os.Bundle;\nimport android.text.TextUtils;\nimport androi"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/WithListViewAndEmptyView.java",
"chars": 5263,
"preview": "package in.srain.cube.views.ptr.demo.ui.classic;\n\nimport android.os.Bundle;\nimport android.text.TextUtils;\nimport androi"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/WithScrollView.java",
"chars": 2377,
"preview": "package in.srain.cube.views.ptr.demo.ui.classic;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport a"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/WithTextViewInFrameLayoutFragment.java",
"chars": 2290,
"preview": "package in.srain.cube.views.ptr.demo.ui.classic;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport a"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/classic/WithWebView.java",
"chars": 2497,
"preview": "package in.srain.cube.views.ptr.demo.ui.classic;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport a"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/header/RentalsSunDrawable.java",
"chars": 10525,
"preview": "package in.srain.cube.views.ptr.demo.ui.header;\n\nimport android.content.Context;\nimport android.graphics.*;\nimport andro"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/header/RentalsSunHeaderView.java",
"chars": 3462,
"preview": "package in.srain.cube.views.ptr.demo.ui.header;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport "
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/storehouse/StoreHouseUsingPointList.java",
"chars": 5685,
"preview": "package in.srain.cube.views.ptr.demo.ui.storehouse;\n\nimport android.graphics.Point;\nimport android.os.Bundle;\nimport and"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/storehouse/StoreHouseUsingString.java",
"chars": 3837,
"preview": "package in.srain.cube.views.ptr.demo.ui.storehouse;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimpor"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/storehouse/StoreHouseUsingStringArray.java",
"chars": 3967,
"preview": "package in.srain.cube.views.ptr.demo.ui.storehouse;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimpor"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/viewpager/ImageListViewHolder.java",
"chars": 1067,
"preview": "package in.srain.cube.views.ptr.demo.ui.viewpager;\n\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/viewpager/ViewPagerActivity.java",
"chars": 6235,
"preview": "package in.srain.cube.views.ptr.demo.ui.viewpager;\n\nimport android.os.Bundle;\nimport android.support.v4.app.Fragment;\nim"
},
{
"path": "ptr-demo/src/in/srain/cube/views/ptr/demo/ui/viewpager/ViewPagerFragment.java",
"chars": 3365,
"preview": "package in.srain.cube.views.ptr.demo.ui.viewpager;\n\nimport android.os.Bundle;\nimport android.text.TextUtils;\nimport andr"
},
{
"path": "ptr-lib/AndroidManifest.xml",
"chars": 328,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package="
},
{
"path": "ptr-lib/build.gradle",
"chars": 802,
"preview": "apply plugin: 'com.android.library'\n\nandroid {\n compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION)"
},
{
"path": "ptr-lib/checkstyle.xml",
"chars": 4743,
"preview": "<?xml version=\"1.0\"?>\n<!DOCTYPE module PUBLIC\n \"-//Puppy Crawl//DTD Check Configuration 1.2//EN\"\n \"http://www.pupp"
},
{
"path": "ptr-lib/gradle-mvn-push.gradle",
"chars": 3419,
"preview": "apply plugin: 'maven'\napply plugin: 'signing'\n\ndef isReleaseBuild() {\n return VERSION_NAME.contains(\"SNAPSHOT\") == fa"
},
{
"path": "ptr-lib/gradle.properties",
"chars": 755,
"preview": "VERSION_NAME=1.0.11\n\nPOM_GROUP=in.srain.cube\nPOM_ARTIFACT_ID=ultra-ptr\nPOM_PACKAGING=aar\n\nPOM_NAME=Android Ultra Pull to"
},
{
"path": "ptr-lib/pom.xml",
"chars": 3639,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
},
{
"path": "ptr-lib/res/layout/cube_ptr_classic_default_header.xml",
"chars": 2263,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n andr"
},
{
"path": "ptr-lib/res/layout/cube_ptr_simple_loading.xml",
"chars": 288,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ProgressBar\n style=\"@android:style/Widget.ProgressBar.Small\"\n xmlns:androi"
},
{
"path": "ptr-lib/res/values/cube_ptr_attrs.xml",
"chars": 1152,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <declare-styleable name=\"PtrFrameLayout\">\n <!-- Optional."
},
{
"path": "ptr-lib/res/values/cube_ptr_string.xml",
"chars": 665,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <string name=\"cube_ptr_pull_down\">Pull Down</string>\n <string"
},
{
"path": "ptr-lib/res/values-zh/cube_ptr_string.xml",
"chars": 593,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <string name=\"cube_ptr_pull_down\">下拉</string>\n <string name=\""
},
{
"path": "ptr-lib/src/in/srain/cube/views/ptr/PtrClassicDefaultHeader.java",
"chars": 10423,
"preview": "package in.srain.cube.views.ptr;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport andro"
},
{
"path": "ptr-lib/src/in/srain/cube/views/ptr/PtrClassicFrameLayout.java",
"chars": 1446,
"preview": "package in.srain.cube.views.ptr;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\n\npublic class PtrCla"
},
{
"path": "ptr-lib/src/in/srain/cube/views/ptr/PtrDefaultHandler.java",
"chars": 1265,
"preview": "package in.srain.cube.views.ptr;\n\nimport android.view.View;\nimport android.widget.AbsListView;\n\npublic abstract class Pt"
},
{
"path": "ptr-lib/src/in/srain/cube/views/ptr/PtrFrameLayout.java",
"chars": 35352,
"preview": "package in.srain.cube.views.ptr;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android."
},
{
"path": "ptr-lib/src/in/srain/cube/views/ptr/PtrHandler.java",
"chars": 541,
"preview": "package in.srain.cube.views.ptr;\n\nimport android.view.View;\n\npublic interface PtrHandler {\n\n /**\n * Check can do "
},
{
"path": "ptr-lib/src/in/srain/cube/views/ptr/PtrUIHandler.java",
"chars": 785,
"preview": "package in.srain.cube.views.ptr;\n\nimport in.srain.cube.views.ptr.indicator.PtrIndicator;\n\n/**\n *\n */\npublic interface Pt"
},
{
"path": "ptr-lib/src/in/srain/cube/views/ptr/PtrUIHandlerHolder.java",
"chars": 4418,
"preview": "package in.srain.cube.views.ptr;\n\nimport in.srain.cube.views.ptr.indicator.PtrIndicator;\n\n/**\n * A single linked list to"
},
{
"path": "ptr-lib/src/in/srain/cube/views/ptr/PtrUIHandlerHook.java",
"chars": 1444,
"preview": "package in.srain.cube.views.ptr;\n\n/**\n * Run a hook runnable, the runnable will run only once.\n * After the runnable is "
},
{
"path": "ptr-lib/src/in/srain/cube/views/ptr/header/MaterialHeader.java",
"chars": 5335,
"preview": "package in.srain.cube.views.ptr.header;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android."
},
{
"path": "ptr-lib/src/in/srain/cube/views/ptr/header/MaterialProgressDrawable.java",
"chars": 26851,
"preview": "/*\n * Copyright (C) 2014 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
},
{
"path": "ptr-lib/src/in/srain/cube/views/ptr/header/StoreHouseBarItem.java",
"chars": 2104,
"preview": "package in.srain.cube.views.ptr.header;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.g"
},
{
"path": "ptr-lib/src/in/srain/cube/views/ptr/header/StoreHouseHeader.java",
"chars": 10435,
"preview": "package in.srain.cube.views.ptr.header;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android."
},
{
"path": "ptr-lib/src/in/srain/cube/views/ptr/header/StoreHousePath.java",
"chars": 10624,
"preview": "package in.srain.cube.views.ptr.header;\n\nimport android.util.SparseArray;\n\nimport java.util.ArrayList;\n\n/**\n * Created b"
},
{
"path": "ptr-lib/src/in/srain/cube/views/ptr/indicator/PtrIndicator.java",
"chars": 5216,
"preview": "package in.srain.cube.views.ptr.indicator;\n\nimport android.graphics.PointF;\n\npublic class PtrIndicator {\n\n public fin"
},
{
"path": "ptr-lib/src/in/srain/cube/views/ptr/indicator/PtrTensionIndicator.java",
"chars": 3709,
"preview": "package in.srain.cube.views.ptr.indicator;\n\npublic class PtrTensionIndicator extends PtrIndicator {\n\n private float D"
},
{
"path": "ptr-lib/src/in/srain/cube/views/ptr/util/PtrCLog.java",
"chars": 6142,
"preview": "package in.srain.cube.views.ptr.util;\n\nimport android.util.Log;\n\n/**\n * An encapsulation of {@link Log}, enable log leve"
},
{
"path": "ptr-lib/src/in/srain/cube/views/ptr/util/PtrLocalDisplay.java",
"chars": 1528,
"preview": "package in.srain.cube.views.ptr.util;\n\nimport android.content.Context;\nimport android.util.DisplayMetrics;\nimport androi"
},
{
"path": "publish-to-maven.sh",
"chars": 65,
"preview": "python update-project.py\n./gradlew clean :ptr-lib:uploadArchives\n"
},
{
"path": "settings.gradle",
"chars": 90,
"preview": "rootProject.name = 'android-Ultra-Pull-To-Refresh'\n\ninclude ':ptr-lib'\ninclude ':ptr-demo'"
},
{
"path": "template/README-cn.md",
"chars": 7807,
"preview": "###### 欢迎关注我\n\nGitHub: https://github.com/liaohuqiu\n\n微博: http://weibo.com/liaohuqiu\n\n知乎: http://www.zhihu.com/people/liao"
},
{
"path": "template/README.md",
"chars": 10026,
"preview": "###### Welcome to follow me on GitHub or Twitter\n\nGitHub: https://github.com/liaohuqiu\n\nTwitter: https://twitter.com/lia"
},
{
"path": "template/ptr-demo/build.gradle",
"chars": 2601,
"preview": "apply plugin: 'com.android.application'\n\nandroid {\n compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERS"
},
{
"path": "template/ptr-demo/pom.xml",
"chars": 2765,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
},
{
"path": "template/ptr-lib/gradle.properties",
"chars": 766,
"preview": "VERSION_NAME={ptr_lib_version}\n\nPOM_GROUP=in.srain.cube\nPOM_ARTIFACT_ID=ultra-ptr\nPOM_PACKAGING=aar\n\nPOM_NAME=Android Ul"
},
{
"path": "template/ptr-lib/pom.xml",
"chars": 3650,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
},
{
"path": "update-project.py",
"chars": 1047,
"preview": "import os\nvars = {\n 'ptr_lib_version': '1.0.11',\n 'ptr_lib_stable_version': '1.0.11',\n 'cube_sdk_ve"
}
]
// ... and 7 more files (download for full content)
About this extraction
This page contains the full source code of the liaohuqiu/android-Ultra-Pull-To-Refresh GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 124 files (351.8 KB), approximately 91.0k tokens, and a symbol index with 508 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.