首页 » Android » WebView下拉刷新解决办法

WebView下拉刷新解决办法

2016-04-01 16:10:57阅读(2211)

以前一直使用第三方的方式实现下拉刷新,今天偶然发现谷歌官方提供了一个SwipeRefreshView的解决方案,挺好使用的。

SwipeRefreshLayout使用之前

SwipeRefreshLayout使用之前需引入V4包,且版本在19.1以上,它适用于任何控件,包括ListView,WebView,GridView等。在此我是以WebView为例的。

SwipeRefreshLayout布局

SwipeRefreshLayout的使用方式类似于其他的Layout

<android.support.v4.widget.SwipeRefreshLayout
          android:id="@+id/swipe_container"    
          android:layout_width="match_parent"    
          android:layout_height="match_parent" >
    <WebView        
          android:id="@+id/web_view"        
          android:layout_width="match_parent"        
          android:layout_height="match_parent" />    
</android.support.v4.widget.SwipeRefreshLayout>
设置刷新事件
//控制刷新进度条的显示与消失
refreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_container);
mWebView.setWebChromeClient(new WebViewChromeClient() {            
          @Override            
          public void onProgressChanged(WebView view, int newProgress) {                  
                    if (newProgress < 100) {                    
                            refreshLayout.setRefreshing(true);                
                    } else {
                            refreshLayout.setRefreshing(false);
                    }                
                    super.onProgressChanged(view, newProgress);            
        }        
});
//设置刷新事件
refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {    
          @Override    
          public void onRefresh() {
                    if(!refreshLayout.canChildScrollUp()) {            
                              mWebView.loadUrl(mUrl);            
                              refreshLayout.setRefreshing(false);
                   }    
        }
});

以上代码有所省略,这样就可以实现WebView的下拉刷新了,但是有一个问题,这样设置后,WebView的下拉事件就会被拦截掉了,所以还需要进行改进,网上有许多方案,这里使用一种Google官方提供的解决方案,SwipeRefreshLayout中有一个canChildScrollUp方法,通过重写这个方法可以解决这个问题。
(1) 自定义SwipeRefreshLayout

public class CustomSwipeRefreshLayout extends SwipeRefreshLayout {    
          private CanChildScrollUpCallback mCanChildScrollUpCallback;    
          public interface CanChildScrollUpCallback {        
                    boolean canSwipeRefreshChildScrollUp();    
          }    
          public CustomSwipeRefreshLayout(Context context) {        
                    super(context,null);    
          }    
          public CustomSwipeRefreshLayout(Context context, AttributeSet attrs) {        
                    super(context, attrs);    
          }    
          public void setCanChildScrollUpCallback(CanChildScrollUpCallback canChildScrollUpCallback) {        
          mCanChildScrollUpCallback = canChildScrollUpCallback;    }    
          @Override    
          public boolean canChildScrollUp() {        
                     if (mCanChildScrollUpCallback != null) {            
                            return mCanChildScrollUpCallback.canSwipeRefreshChildScrollUp();        
                    }        
                    return super.canChildScrollUp();    
          }
}

(2)将xml文件中的类替换成自己的类

<com.xxx.xxx.SwipeRefreshLayout
          android:id="@+id/swipe_container"    
          android:layout_width="match_parent"    
          android:layout_height="match_parent" >
    <WebView        
          android:id="@+id/web_view"        
          android:layout_width="match_parent"        
          android:layout_height="match_parent" />    
</com.xxx.xxx..SwipeRefreshLayout>

(3) 设置监听器并重写canChildScrollUp()方法

//此类需要实现在自定义View中的CanChildScrollUpCallback接口,在此省略
//控制刷新进度条的显示与消失
refreshLayout = (CustomSwipeRefreshLayout) view.findViewById(R.id.swipe_container);
mWebView.setWebChromeClient(new WebViewChromeClient() {            
          @Override            
          public void onProgressChanged(WebView view, int newProgress) {                  
                    if (newProgress < 100) {                    
                            refreshLayout.setRefreshing(true);                
                    } else {
                            refreshLayout.setRefreshing(false);
                    }                
                    super.onProgressChanged(view, newProgress);            
        }        
});
//设置刷新事件
refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {    
          @Override    
          public void onRefresh() {
                    if(!refreshLayout.canChildScrollUp()) {            
                              mWebView.loadUrl(mUrl);            
                              refreshLayout.setRefreshing(false);
                   }    
        }
});
refreshLayout.setCanChildScrollUpCallback(this);
//以上代码在同一个方法中
@Override
public boolean canSwipeRefreshChildScrollUp() {    
          return mHomeWebView.getScrollY() > 0;
}

这样,一个可以下拉刷新的WebView就实现了,了解更多可以参考Github上的MultiSwipeRefreshLayout

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹