android-Ultra-Pull-To-Refresh实现下拉刷新WebView

本文使用的是功能强大的开源项目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库

  
  
  1. allprojects {
  2.    repositories {
  3.        jcenter()
  4.        mavenCentral()
  5.        maven {
  6.            url 'https://oss.sonatype.org/content/repositories/snapshots'
  7.        }
  8.    }
  9. }
Moudle的build.gradle文件引入依赖
   
   
  1. compile 'in.srain.cube:ultra-ptr:1.0.11'

2、创建布局文件,使用PtrClassicFrameLayout经典下拉刷新布局

   
   
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.    android:layout_width="match_parent"
  4.    android:layout_height="match_parent"
  5.    android:background="#f1f1f1">
  6.    <in.srain.cube.views.ptr.PtrClassicFrameLayout
  7.        android:id="@+id/fragment_rotate_header_with_text_view_frame"
  8.        xmlns:cube_ptr="http://schemas.android.com/apk/res-auto"
  9.        android:layout_width="match_parent"
  10.        android:layout_height="match_parent"
  11.        android:background="#fff"
  12.        cube_ptr:ptr_duration_to_close="200"
  13.        cube_ptr:ptr_duration_to_close_header="1000"
  14.        cube_ptr:ptr_keep_header_when_refresh="true"
  15.        cube_ptr:ptr_pull_to_fresh="false"
  16.        cube_ptr:ptr_ratio_of_header_height_to_refresh="1.2"
  17.        cube_ptr:ptr_resistance="1.7">
  18.        <WebView
  19.            android:layout_width="match_parent"
  20.            android:layout_height="match_parent"
  21.            android:id="@+id/mweb">
  22.        </WebView>
  23.    </in.srain.cube.views.ptr.PtrClassicFrameLayout>
  24. </RelativeLayout>

3、在Activity中初始化

获取PtrClassicFrameLayout,并复写其中的onRefreshBegin()及checkCanDoRefresh()方法。

   
   
  1. final PtrClassicFrameLayout ptrFrame = (PtrClassicFrameLayout) findViewById(R.id.fragment_rotate_header_with_text_view_frame);
  2.        ptrFrame.setLastUpdateTimeRelateObject(this);
  3.        ptrFrame.setPtrHandler(new PtrDefaultHandler() {
  4.            @Override
  5.            public void onRefreshBegin(PtrFrameLayout frame) {
  6.                frame.postDelayed(new Runnable() {
  7.                    @Override
  8.                    public void run() {
  9.                        ptrFrame.refreshComplete();
  10.                    }
  11.                }, 1500);
  12.            }
  13.            @Override
  14.            public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
  15.                return !content.canScrollVertically(-1);
  16.            }
  17.        });
其中在checkCanDoRefresh中需要加return !content.canScrollVertically(-1);这句主要是用于判断WebView当前页面是否滑动在顶部,若在顶部才允许下拉刷新;否则,在网页中间也能下拉刷新就GG了。

4、Webview设置,对于需要加载复杂页面的情况,需要对WebView进行相应的设置。

   
   
  1. WebSettings webSettings = mWeb.getSettings();
  2. //设置页面支持JS
  3. webSettings.setJavaScriptEnabled(true);
  4. webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
  5. //设置使用缓存
  6. webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

最后拦截返回键,使得在浏览网页时返回键控制网页后退,而不是退出当前Activity。

   
   
  1. @Override
  2.    public boolean onKeyDown(int keyCode, KeyEvent event) {
  3.        if(keyCode==KeyEvent.KEYCODE_BACK)
  4.        {
  5.            if(mWeb.canGoBack())
  6.            {
  7.                mWeb.goBack();//返回上一页面
  8.                return true;
  9.            }
  10.            else
  11.            {
  12.                System.exit(0);//退出程序
  13.            }
  14.        }
  15.        return super.onKeyDown(keyCode, event);
  16.    }

5、自定义Header

  • MaterialHeader

布局将上面的PtrClassicFrameLayout替换为PtrFrameLayout,其它基本不变。在Activity中获取此PtrFrameLayout。StroeHouse风格的header同样使用PtrFrameLayout,需要设置显示的字样字母A-Z等字符。

   
   
  1. final PtrFrameLayout ptrFrame = (PtrFrameLayout) findViewById(R.id.fragment_home_ptr_frame);
  2. MaterialHeader header = new MaterialHeader(this);//采用MaterialHeader风格header
  3. header.setPadding(0, LocalDisplay.dp2px(20), 0, LocalDisplay.dp2px(20));//设置header
  4. ptrFrame.setDurationToCloseHeader(1500);
  5.        ptrFrame.setHeaderView(header);
  6.        ptrFrame.addPtrUIHandler(header);
  7.        ptrFrame.setPtrHandler(new PtrDefaultHandler() {
  8.            @Override
  9.            public void onRefreshBegin(PtrFrameLayout frame) {
  10.                frame.postDelayed(new Runnable() {
  11.                    @Override
  12.                    public void run() {
  13.                        ptrFrame.refreshComplete();
  14.                    }
  15.                }, 1500);
  16.            }
  17.            @Override
  18.            public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
  19.                return !content.canScrollVertically(-1);
  20.            }
  21.        });

经典Header与Material风格header如下


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值