[英]infinite scroll in android webview
我有一些本地html文件,我想用无限滚动方法显示它们。
注意 :我无法更改html内容,所以请不要建议在其中添加javascript。 我必须在运行时执行此操作。
因此,我发现我可以在运行时通过loadUrl("javascript: ....")
执行javascript
。
我重写了webView
onOverScrolled()
方法以找出用户何时到达webView的末尾。 (它采取了谨慎的措施,因此问题不在这里)
问题是新内容有时成功附加,而另一些时候没有附加。
在日志中,我可以看到page方法的结尾被触发,获取了新的html主体,执行了javascript代码,但没有影响。
这是我的代码,可能出了点问题,我看不到:
@Override
protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY)
{
super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
if(clampedY & reloadFlag) //for first time realodFlag is false, when the WebViewClient.onPageFinished() get called it turn to ture
{
if (!(isVerticalScrollPossible(SCROLL_DOWN)))
{
reloadFlag = false;
currUri = nextResource(currUri); //findout next page
appendNextPage();
}
}
}
private final int SCROLL_DOWN = 1;
private final int SCROLL_UP = -1;
private boolean isVerticalScrollPossible(int direction)
{
final int offset = computeVerticalScrollOffset();
final int range = computeVerticalScrollRange() - computeVerticalScrollExtent();
if (range == 0) return false;
if (direction < 0) {
return offset > 0;
} else {
return offset < range - 1;
}
}
public String getNextPageJS(Uri currPage)
{
String body = getNextPageBody(currPage);
//Log.d("myTAG", body);
String jsResult = "javascript:(function() { document.body.innerHTML += '<div id=\"separator\" style=\"height:10px; margin-top:10px; margin-bottom:10px; background-color:#000000;\"></div>" + body + "';})()";
return jsResult;
}
private void appendNextPage()
{
reloadFlag = false;
Thread appendThread = new Thread(null, doAppend, "backgroundAppend");
appendThread.start();
Log.i("appendNextPage", "get called");
}
public String rs = "";
private Runnable doAppend = new Runnable()
{
@Override
public void run()
{
Log.i("doAppend", "get called + currUri: " + currUri);
rs = getNextPageJS(currUri);
//loadUrl(rs);
appendHandler.sendEmptyMessage(0);
}
};
private Handler appendHandler = new Handler()
{
public void handleMessage(Message msg)
{
loadUrl(rs);
reloadFlag = true;
Log.i("appendHandler", "get called");
}
};
注意 :有时我会在仿真器日志中得到此信息(不是在真实设备中):
I/chromium(1339): [INFO:CONSOLE(1)] "Uncaught SyntaxError: An invalid or illegal string was specified.", source: http://localhost:1025/OEBPS/Text/Section0042.xhtml (1)
页面的数量有时会有所不同,可能是因为错误的Javasccript代码,我不知道。
提示:
1)我不是javascript编码器,所以javascript代码可能不好
2)或者可能多次调用javascript代码会导致此问题
3)我知道javascript代码必须在页面完全加载后执行,所以也许代码调用得太早了,问题是onPageFinished()仅针对第一页被调用,并且通过javascript代码附加新内容时不会调用它,我试图使用线程解决此问题,并且我认为它有效。
更新:我发现,当html主体很小时,此代码可以正常工作,但是当我尝试附加大主体时,它无法正常工作。 是loadUrl()
方法有字符限制? 或其他想法?
好,如果有人想知道,我发现了问题。
问题是loadUri()
(至少就我而言)无法一次加载太多html标签(在我编写的javascript代码中)
因此,解决方案很容易,一个接一个地加载标签。
这是我使用的代码:
public ArrayList<String> getNextPageBody(Uri currAddress)
{
String html = getHtml(currAddress); // this is the all html tags in the next file
//get body elements as arrayList, using jsoup
Document doc = Jsoup.parse(html);
Elements elements = doc.select("body").first().children();
ArrayList<String> chuncks = new ArrayList<String>();
for (org.jsoup.nodes.Element el : elements)
{
chuncks.add(el.toString());
}
return chuncks;
}
public void loadBodyChunk(ArrayList<String> bodyChunks)
{
//show a separator for each page
bodyChunks.add(0, "javascript:(function() { document.body.innerHTML += '<div id=\"separator\" style=\"height:10px; margin-top:10px; margin-bottom:10px; background-color:#000000;\"></div>';}())");
loadUrl(bodyChunks.get(0));
for(int i = 1; i < bodyChunks.size(); i++)
{
String jsResult = "javascript:(function() { document.body.innerHTML += '" + bodyChunks.get(i) + "';}())";
loadUrl(jsResult);
}
reloadFlag = true;
}
编辑:
还:首先将String中'
s替换为\\'
:
body = body.replace("'", "\\'");
然后应删除所有换行符:
body = body.replaceAll(System.getProperty("line.separator"), " ");
所有问题都解决了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.