本文使用的是功能强大的开源项目android-Ultra-Pull-To-Refresh,支持ListView、GridView、WebView、TextView等多种场景,下面在AS中做个下拉刷新WebView小例子入门。
android-Ultra-Pull-To-Refresh开源库地址https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh
1、将android-Ultra-Pull-To-Refresh引入项目
android-Ultra-Pull-To-Refresh已经上传Maven库,所以在AS中可以很方面的引入。首先在Project的build.gradle文件中引入Maven库
Moudle的build.gradle文件引入依赖
allprojects {
repositories {
jcenter()
mavenCentral()
maven {
url 'https://oss.sonatype.org/content/repositories/snapshots'
}
}
}
compile 'in.srain.cube:ultra-ptr:1.0.11'
2、创建布局文件,使用PtrClassicFrameLayout经典下拉刷新布局
<?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">
<WebView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/mweb">
</WebView>
</in.srain.cube.views.ptr.PtrClassicFrameLayout>
</RelativeLayout>
3、在Activity中初始化
获取PtrClassicFrameLayout,并复写其中的onRefreshBegin()及checkCanDoRefresh()方法。
其中在checkCanDoRefresh中需要加return !content.canScrollVertically(-1);这句主要是用于判断WebView当前页面是否滑动在顶部,若在顶部才允许下拉刷新;否则,在网页中间也能下拉刷新就GG了。
final PtrClassicFrameLayout ptrFrame = (PtrClassicFrameLayout) 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 !content.canScrollVertically(-1);
}
});
4、Webview设置,对于需要加载复杂页面的情况,需要对WebView进行相应的设置。
WebSettings webSettings = mWeb.getSettings();
//设置页面支持JS
webSettings.setJavaScriptEnabled(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
//设置使用缓存
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
最后拦截返回键,使得在浏览网页时返回键控制网页后退,而不是退出当前Activity。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_BACK)
{
if(mWeb.canGoBack())
{
mWeb.goBack();//返回上一页面
return true;
}
else
{
System.exit(0);//退出程序
}
}
return super.onKeyDown(keyCode, event);
}
5、自定义Header
MaterialHeader
布局将上面的PtrClassicFrameLayout替换为PtrFrameLayout,其它基本不变。在Activity中获取此PtrFrameLayout。StroeHouse风格的header同样使用PtrFrameLayout,需要设置显示的字样字母A-Z等字符。
final PtrFrameLayout ptrFrame = (PtrFrameLayout) findViewById(R.id.fragment_home_ptr_frame);
MaterialHeader header = new MaterialHeader(this);//采用MaterialHeader风格header
header.setPadding(0, LocalDisplay.dp2px(20), 0, LocalDisplay.dp2px(20));//设置header
ptrFrame.setDurationToCloseHeader(1500);
ptrFrame.setHeaderView(header);
ptrFrame.addPtrUIHandler(header);
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 !content.canScrollVertically(-1);
}
});
经典Header与Material风格header如下