AgentWeb上拉刷新和下拉加载更多之SmartRefreshLayout

agentweb功能很多,需要自己挖,作者的范例有时候没那么完整

其中上拉刷新AgentWeb自带SmartRefreshLayout,上拉转圈和下拉加载...动画。

作者例子用的是谷歌SwipeRefreshLayout和TwinklingRefreshLayout

这里仅讨论SmartRefreshLayout,其它下章再说

基础代码

mAgentWeb = AgentWeb.with(this) //这里需要把 Activity 、 和 Fragment  同时传入
                .setAgentWebParent(mLinearLayout, new LinearLayout.LayoutParams(-1, -1))
                .useDefaultIndicator()//使用默认进度条
                .setWebChromeClient(mWebChromeClient)
                .setWebViewClient(mWebViewClient)
                .setMainFrameErrorView(R.layout.agentweb_error_page, -1)
                .setSecurityType(AgentWeb.SecurityType.STRICT_CHECK) //AgentWeb.SecurityType.strict 注意这里开启 strict 模式 , 设备低于 4.2 情况下回把注入的 Js 全部清空掉 , 这里推荐使用 onJsPrompt 通信
                .setWebLayout(new WebLayout(this)) //下拉刷新
                .setOpenOtherPageWays(DefaultWebClient.OpenOtherPageWays.ASK)//打开其他应用时,弹窗咨询用户是否前往其他应用
                .interceptUnkownUrl() //拦截找不到相关页面的Scheme
                .createAgentWeb()
                .ready()
                .go("file:///android_asset/loadpage/loading.html");

注意,声明.setWebLayout(new WebLayout(this))

然后我们找到widget/WebLayout.java修改代码为如下

public class WebLayout implements IWebLayout {
    private Activity mActivity;
    private final SmartRefreshLayout mSmartRefreshLayout;
    private final WebView mWebView;
    private Integer page;

    public WebLayout(Activity activity) {
        this.mActivity = activity;
        this.page=0;

        //指定刷新的界面样式
        View mView=activity.getLayoutInflater().inflate(R.layout.fragment_srl_web,null);
        View smarkView = mView.findViewById(R.id.smarkLayout);
        mSmartRefreshLayout = (SmartRefreshLayout) smarkView;
        mWebView = (WebView) mSmartRefreshLayout.findViewById(R.id.webView);

        mSmartRefreshLayout.setOnRefreshListener(new OnRefreshListener() {
            @Override
            public void onRefresh(RefreshLayout refreshlayout) {
                System.out.println("来自下拉刷新");
                page = 1;
                mWebView.reload();
                mSmartRefreshLayout.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mSmartRefreshLayout.finishRefresh(true);
                    }
                }, 2000);
            }
        });

        mSmartRefreshLayout.setOnLoadmoreListener(new OnLoadmoreListener() {
            @Override
            public void onLoadmore(RefreshLayout refreshlayout) {
                //mWebView.reload();
                System.out.println("来自上拉分页");
                page++;
                String jsCode="javascript:b4anextpage("+page+");";
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                    mWebView.evaluateJavascript(jsCode, null);
                }else{
                    mWebView.loadUrl(jsCode);
                }
                mSmartRefreshLayout.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mSmartRefreshLayout.finishLoadmore(true);
                    }
                }, 2000);
            }
        });
    }

    @NonNull
    @Override
    public ViewGroup getLayout() {
        return mSmartRefreshLayout;
    }

    @Nullable
    @Override
    public WebView getWebView() {
        return mWebView;
    }



}

上拉加载更多数据,你还需要写一个交互的部分,比如上面的b4anextpage

<script>
function b4anextpage(page){
loaddata(page); //你的网页分页代码逻辑
}
</script>

看懂的了吗?不懂的话一起交流吧

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注