android - Update WebView inside ViewPager after AsyncTask -
i have webview
inside viewpager
. when webview
starts load data, needs perform task on urls, ids urls , update view.
my problem is, how update webview
inside viewpager
latest content? viewpager
inside fragment
.
here code:
@override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { view view = inflater.inflate(r.layout.fragment_detail_native, container, false); //.... non-relevant code removed mviewpager = (viewpager) view.findviewbyid(r.id.viewpager); mcustompageradapter = new custompageradapter(items, activity); mviewpager.setadapter(mcustompageradapter); mviewpager.setcurrentitem(position); mviewpager.setonpagechangelistener(new onpagechangelistener() { @override public void onpageselected(int position) { if (mtwopane) monpageselectedlistener.onpageselected(position); } @override public void onpagescrolled(int position, float arg1, int arg2) { } @override public void onpagescrollstatechanged(int arg0) { } }); return view; }
custompageradapter class:
private class custompageradapter extends pageradapter { list<item> items = new arraylist<item>(); layoutinflater inflater; activity activity; mywebview mwebview = null; public custompageradapter(list<item> items2, activity activity) { this.items = items2; this.activity = activity; inflater = (layoutinflater) activity .getsystemservice(context.layout_inflater_service); } @override public int getcount() { return items.size(); } @override public boolean isviewfromobject(view view, object object) { return view == object; } @suppresslint("setjavascriptenabled") @suppresswarnings("deprecation") @override public object instantiateitem(viewgroup container, int position) { item item = items.get(position); view view = inflater.inflate(r.layout.item_detail_screen, container, false); mwebview = (mywebview) view.findviewbyid(r.id.webview); //... webview settings code removed //... building html content removed string content = item.content; //... other html content removed html.append(content_prefix); html.append(content_test); html.append(content); html.append(content_postfix); html.append(htmlpostfix); string htmlstring = html.tostring(); htmlstring = htmlstring.replace("%", "%"); // @ point htmlstring has html data built. // data has urls, needs parsed // videoids , done asynctask // method calls asynctask parsevideolinks(htmlstring); mwebview.loaddatawithbaseurl("", htmlstring, "text/html", "utf-8", ""); // ((viewpager) container).addview((view) view, 0); ((viewpager) container).addview((view) view); return view; } private void parsevideolinks(string htmlstring) { urltask task = new urltask(htmlstring); task.execute(); } @override public void destroyitem(view collection, int position, object view) { ((viewpager) collection).removeview((view) view); } public class urltask extends asynctask<void, void, string> { string html = ""; public urltask(string html) { this.html = html; } @override protected string doinbackground(void... params) { document doc = jsoup.parse(html); doc.select("img").attr("style", "width:100%") .attr("height", "auto"); doc.select("iframe").attr("style", "width:100%") .attr("height", "auto"); elements paragragh_elements = doc.select("p"); (element element : paragragh_elements) { string text = element.text(); if (text != null && !text.equalsignorecase("")) { if (text.contains("https://www.youtube.com/") || text.contains("http://www.youtube.com/") || text.contains("https://www.youtu.be/") || text.contains("https://youtu.be/")) { string expandedurl = expandurl(text); if (expandedurl != null) { string[] spliturl = expandedurl.split("[?&]"); (string split : spliturl) { if (split.contains("v=")) { string videoid = split .replace("v=", ""); log.d(const.debug, "" + videoid); element new_element = constructelement( videoid, text); element.replacewith(new_element); } } } else { // embed } } else { // not youtube url } } } return doc.html(); } private element constructelement(string videoid, string url) { element outerdivelement = new element(tag.valueof("div"), ""); outerdivelement.attr("style", "position:relative;"); element innerdivelement1 = new element(tag.valueof("div"), ""); element aelement1 = new element(tag.valueof("a"), ""); aelement1.attr("href", url); element thumbimgelement = new element(tag.valueof("img"), ""); thumbimgelement.attr("src", "http://img.youtube.com/vi/" + videoid + "/0.jpg") .attr("style", "width:100%;"); aelement1.appendchild(thumbimgelement); innerdivelement1.appendchild(aelement1); element innerdivelement2 = new element(tag.valueof("div"), ""); innerdivelement2.attr("style", "position:absolute; left:30px; top:30px;"); element aelement2 = new element(tag.valueof("a"), ""); aelement2.attr("href", url); element overlayimgelement = new element(tag.valueof("img"), ""); overlayimgelement.attr("src", "file:///android_asset/images/play.png").attr("style", "width:130%;"); aelement2.appendchild(overlayimgelement); innerdivelement2.appendchild(aelement2); // log.d(const.debug, "http://img.youtube.com/vi/" + videoid // + "/0.jpg"); outerdivelement.appendchild(innerdivelement1); outerdivelement.appendchild(innerdivelement2); return outerdivelement; } @override protected void onpostexecute(string result) { super.onpostexecute(result); // @ point, result has html content // need load webview with. // how set webview data here.. } public string expandurl(string shortenedurl) { url url; string expandedurl = ""; try { url = new url(shortenedurl); httpurlconnection httpurlconnection = (httpurlconnection) url .openconnection(proxy.no_proxy); httpurlconnection.setinstancefollowredirects(false); expandedurl = httpurlconnection.getheaderfield("location"); httpurlconnection.disconnect(); } catch (exception e) { e.printstacktrace(); } return expandedurl; } } }
how can set webview load data once asynctask done, in onpostexecute()
?
i create interface in async task (and maybe split out own class), example 1 below;
public interface htmlvideolinksparsedlistener { public void onhtmlvideolinksparsed(string newhtml) }
and activity implement interface (and corresponding method) i.e.
public class youractivity implements htmlvideolinksparsedlistener { //your activity code here @override public void onhtmlvideolinksparsed(string newhtml) { } }
then pass activity adapter , in turn async task , call interface method once html ready pass webview i.e.
public custompageradapter(list<item> items2, activity activity, htmlvideolinksparsedlistener listener) { this.items = items2; this.activity = activity; this.listener = listener; inflater = (layoutinflater) activity .getsystemservice(context.layout_inflater_service); } private void parsevideolinks(string htmlstring) { urltask task = new urltask(htmlstring, listener); task.execute(); }
then async task ...
//constructor public urltask(string html, htmlvideolinksparsedlistener listener) { this.html = html; this.listener = listener; } @override protected void onpostexecute(string result) { super.onpostexecute(result); listener.onhtmlvideolinksparsed(result); }
then in adapter setup method add instance variable html string used in instantiateitem() method , called notifydatasetchanged() on adapter this.
//in actvity... @override public void onhtmlvideolinksparsed(string newhtml) { mcustompageradapter.sethtmlstring(newhtml); mcustompageradapter.notifydatasetchanged(); } //then in adapter //setter public sethtmlstring(string newhtml) { this.htmlstring = newhtml; } public object instantiateitem(viewgroup container, int position) { //check html string , use in web view else normal processing via async task if (htmlstring!=null) { //add new html webview here } else { //do normal html processing via async task here } }
hope helps! :-)
Comments
Post a Comment