2014-03-01 3 views
2

나는 로컬 HTML 파일을 가지고 있으며 무한 스크롤 방법으로 보여주고 싶다.안드로이드 webview에서 무한 스크롤

참고 : 나는 HTML 콘텐츠를 변경할 수 없으므로 자바 스크립트를 추가하는 데 도움이되지 마십시오. 나는 그것을 실행 시간에해야한다.

그래서 나는 을 통해 런타임에 javascript을 실행할 수 있다고 생각했습니다.

onOverScrolled() 메서드를 webView으로 대체하여 사용자가 언제 webView의 끝에 도달하는지 확인합니다. (신중하게 행동하므로 여기에 문제가 없습니다)

문제가 몇 번이고 새로운 콘텐츠가 성공적으로 첨부되었지만 다른 시간에는 첨부되지 않았습니다.

로그에서 볼 때 페이지 메서드의 끝이 트리거된다는 것을 알 수 있습니다. 새 html body를 검색하면 호출되는 자바 스크립트 코드가 실행되지만 영향을 미치지는 않습니다.

@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) 나는 자바 스크립트 코더 아니에요, 그래서 자바 스크립트 코드가

2) 아니면 여러 번이 문제

에게 원인이 자바 스크립트 코드를 호출 좋지 않다 될 수있다 3) 자바 스크립트 코드가 완전히로드 된 후에 실행해야한다는 것을 알고 있습니다. 아마 너무 빨리 호출되는 코드 일 수 있습니다.이 문제는 onPageFinished()가 첫 페이지에만 호출되고 자바 스크립트 코드를 통해 연결된 새 콘텐츠가 호출되지 않는 경우, 내가 스레드를 사용 하여이 문제를 해결하기 위해 노력, 나는 그것이 효과가 있다고 생각한다.

업데이트 : 나는이 코드가 html 본문이 작을 때 잘 작동하지만 큰 본문을 첨부하려고하면 제대로 작동하지 않는다고 알았습니다. loadUrl() 메서드는 문자 제한이 있습니까? 또는 다른 아이디어?

답변

0

아무도 알고 싶으면 확인을 클릭합니다.

문제는 loadUri()이 (내 경우에는 적어도)

그래서,이 솔루션은 하나 하나 쉽게, 부하 태그하면 (자바 스크립트 코드에 내가 쓴)에 너무 많은 HTML 태그를로드 할 수 있다는 것입니다.

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; 
} 

편집 :

도 : 문자열에서 먼저 '\'으로 대체해야합니다 다음

body = body.replace("'", "\\'"); 

모든 줄 바꿈 문자 여기

내가 사용하는 코드입니다 제거해야합니다 :

body = body.replaceAll(System.getProperty("line.separator"), " "); 

모든 문제가 해결되었습니다.