java - NullPointerException onTextChanged -
this question has answer here:
- what nullpointerexception, , how fix it? 12 answers
i using http request data in json format loads image well. trying implement ontextchanged function crashes whenever enter alphabet edittext box.
/** asynctask parse json data , load listview */ private class listviewloadertask extends asynctask<string, void, simpleadapter>{ // doing parsing of xml data in non-ui thread @override protected simpleadapter doinbackground(string... strjson) { try{ jobject = new jsonobject(strjson[0]); storejsonparser countryjsonparser = new storejsonparser(); countryjsonparser.parse(jobject); }catch(exception e){ log.d("json exception1",e.tostring()); } // instantiating json parser class //storejsonparser countryjsonparser = new storejsonparser(); try{ // getting parsed data list construct countries = countryjsonparser.parse(jobject); }catch(exception e){ log.d("exception",e.tostring()); } // instantiating adapter store each items // r.layout.listview_layout defines layout of each item //adapter = new simpleadapter(getbasecontext(), countries, r.layout.restaurant_list, from, to); return adapter; } onpostexecute
protected void onpostexecute(simpleadapter adapter) { // setting adapter listview adapter = new simpleadapter(getbasecontext(), countries, r.layout.restaurant_list, from, to); log.d("what country", string.valueof(countries)); mlistview.setadapter(adapter); searchbox = (edittext)findviewbyid(r.id.searchbox); searchbox.addtextchangedlistener(new textwatcher() { public void ontextchanged(charsequence cs, int arg1, int arg2, int arg3) { // when user changed text choosecategory.this.adapter.getfilter().filter(cs); } public void beforetextchanged(charsequence arg0, int arg1, int arg2, int arg3) { // todo auto-generated method stub } public void aftertextchanged(editable arg0) { // todo auto-generated method stub //choosecategory.this.adapter.getfilter().filter(arg0); } }); for(int i=0;i<adapter.getcount();i++){ hashmap<string, object> hm = (hashmap<string, object>) adapter.getitem(i); string imgurl = (string) hm.get("flag_path"); imageloadertask imageloadertask = new imageloadertask(); hashmap<string, object> hmdownload = new hashmap<string, object>(); hm.put("flag_path",imgurl); hm.put("position", i); // starting imageloadertask download , populate image in listview imageloadertask.execute(hm); } } } the error logcat:
java.lang.nullpointerexception @ choosecategory$listviewloadertask$1.ontextchanged(choosecategory.java:196) @ android.widget.textview.sendontextchanged(textview.java:7408) @ android.widget.textview.handletextchanged(textview.java:7467) @ android.widget.textview$changewatcher.ontextchanged(textview.java:9183) @ android.text.spannablestringbuilder.sendtextchanged(spannablestringbuilder.java:962) @ android.text.spannablestringbuilder.replace(spannablestringbuilder.java:496) @ android.text.spannablestringbuilder.replace(spannablestringbuilder.java:435) @ android.text.spannablestringbuilder.replace(spannablestringbuilder.java:30) @ android.text.method.qwertykeylistener.onkeydown(qwertykeylistener.java:223) @ android.text.method.textkeylistener.onkeydown(textkeylistener.java:136) @ android.widget.textview.dokeydown(textview.java:5532) @ android.widget.textview.onkeydown(textview.java:5343) @ android.view.keyevent.dispatch(keyevent.java:2640) @ android.view.view.dispatchkeyevent(view.java:7665) @ android.view.viewgroup.dispatchkeyevent(viewgroup.java:1408) @ android.view.viewgroup.dispatchkeyevent(viewgroup.java:1408) @ android.view.viewgroup.dispatchkeyevent(viewgroup.java:1408) @ android.view.viewgroup.dispatchkeyevent(viewgroup.java:1408) @ com.android.internal.policy.impl.phonewindow$decorview.superdispatchkeyevent(phonewindow.java:2035) @ com.android.internal.policy.impl.phonewindow.superdispatchkeyevent(phonewindow.java:1505) @ android.app.activity.dispatchkeyevent(activity.java:2418) @ com.android.internal.policy.impl.phonewindow$decorview.dispatchkeyevent(phonewindow.java:1962) @ android.view.viewrootimpl$viewpostimeinputstage.processkeyevent(viewrootimpl.java:3852) @ android.view.viewrootimpl$viewpostimeinputstage.onprocess(viewrootimpl.java:3826) @ android.view.viewrootimpl$inputstage.deliver(viewrootimpl.java:3399) @ android.view.viewrootimpl$inputstage.ondelivertonext(viewrootimpl.java:3449) @ android.view.viewrootimpl$inputstage.forward(viewrootimpl.java:3418) @ android.view.viewrootimpl$asyncinputstage.forward(viewrootimpl.java:3525) @ android.view.viewrootimpl$inputstage.apply(viewrootimpl.java:3426) @ android.view.viewrootimpl$asyncinputstage.apply(viewrootimpl.java:3582) @ android.view.viewrootimpl$inputstage.deliver(viewrootimpl.java:3399) @ android.view.viewrootimpl$inputstage.ondelivertonext(viewrootimpl.java:3449) @ android.view.viewrootimpl$inputstage.forward(viewrootimpl.java:3418) @ android.view.viewrootimpl$inputstage.apply(viewrootimpl.java:3426) @ android.view.viewrootimpl$inputstage.deliver(viewrootimpl.java:3399) @ android.view.viewrootimpl$inputstage.ondelivertonext(viewrootimpl.java:3449) @ android.view.viewrootimpl$inputstage.forward(viewrootimpl.java:3418) @ android.view.viewrootimpl$asyncinputstage.forward(viewrootimpl.java:3558) @ android.view.viewrootimpl$imeinputstage.onfinishedinputevent(viewrootimpl.java:3718) @ android.view.inputmethod.inputmethodmanager$pendingevent.run(inputmethodmanager.java:2010) @ android.view.inputmethod.inputmethodmanager.invokefinishedinputeventcallback(inputmethodmanager.java:1704) @ android.view.inputmethod.inputmethodmanager.finishedinputevent(inputmethodmanager.java:1695) @ android.view.inputmethod.inputmethodmanager$imeinputeventsender.oninputeventfinished(inputmethodmanager.java:1987) @ android.view.inputeventsender.dispatchinputeventfinished(inputeventsender.java:141) @ android.os.messagequeue.nativepollonce(native method) @ android.os.messagequeue.next(messagequeue.java:138) @ android.os.looper.loop(looper.java:123) @ android.app.activitythread.main(activitythread.java:5017) @ java.lang.reflect.method.invokenative(native method) @ java.lang.reflect.method.invoke(method.java:515) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:779) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:595) @ dalvik.system.nativestart.main(native method) java.lang.nullpointerexception @ choosecategory$listviewloadertask$1.ontextchanged please dont make duplicate. have seen post , still can't fix it. why i'm posting here.
this full code choosecategory.java
public class choosecategory extends activity { listview mlistview; edittext searchbox; simpleadapter adapter; jsonobject jobject; storejsonparser countryjsonparser = new storejsonparser(); // list object store parsed countries list list<hashmap<string, object>> countries = null; // keys used in hashmap string[] = { "country","flag","details"}; // ids of views in listview_layout int[] = { r.id.storename,r.id.icon,r.id.details}; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); // getting reference listview of activity_main mlistview = (listview) findviewbyid(r.id.list); // url json data string strurl = "http://10.0.2.2/get_stores.php"; // creating new non-ui thread task download json data downloadtask downloadtask = new downloadtask(); // starting download process downloadtask.execute(strurl); } /** method download json data url */ private string downloadurl(string strurl) throws ioexception { string data = ""; inputstream istream = null; try{ url url = new url(strurl); // creating http connection communicate url httpurlconnection urlconnection = (httpurlconnection) url.openconnection(); // connecting url urlconnection.connect(); // reading data url istream = urlconnection.getinputstream(); bufferedreader br = new bufferedreader(new inputstreamreader(istream)); stringbuffer sb = new stringbuffer(); string line = ""; while( ( line = br.readline()) != null){ sb.append(line); } data = sb.tostring(); br.close(); }catch(exception e){ log.d("exception:", e.tostring()); }finally{ istream.close(); } return data; } /** asynctask download json data */ private class downloadtask extends asynctask<string, integer, string>{ string data = null; @override protected string doinbackground(string... url) { try{ data = downloadurl(url[0]); }catch(exception e){ log.d("background task",e.tostring()); } return data; } @override protected void onpostexecute(string result) { // parsing of xml data done in non-ui thread listviewloadertask listviewloadertask = new listviewloadertask(); // start parsing xml data listviewloadertask.execute(result); } } /** asynctask parse json data , load listview */ private class listviewloadertask extends asynctask<string, void, simpleadapter>{ // doing parsing of xml data in non-ui thread @override protected simpleadapter doinbackground(string... strjson) { try{ jobject = new jsonobject(strjson[0]); storejsonparser countryjsonparser = new storejsonparser(); countryjsonparser.parse(jobject); }catch(exception e){ log.d("json exception1",e.tostring()); } // instantiating json parser class //storejsonparser countryjsonparser = new storejsonparser(); try{ // getting parsed data list construct countries = countryjsonparser.parse(jobject); }catch(exception e){ log.d("exception",e.tostring()); } // instantiating adapter store each items // r.layout.listview_layout defines layout of each item //adapter = new simpleadapter(getbasecontext(), countries, r.layout.restaurant_list, from, to); return adapter; } /** invoked android on "doinbackground" executed */ @override protected void onpostexecute(simpleadapter adapter) { // setting adapter listview adapter = new simpleadapter(getbasecontext(), countries, r.layout.restaurant_list, from, to); log.d("what country", string.valueof(countries)); mlistview.setadapter(adapter); searchbox = (edittext)findviewbyid(r.id.searchbox); searchbox.addtextchangedlistener(new textwatcher() { public void ontextchanged(charsequence cs, int arg1, int arg2, int arg3) { // when user changed text choosecategory.this.adapter.getfilter().filter(cs); } public void beforetextchanged(charsequence arg0, int arg1, int arg2, int arg3) { // todo auto-generated method stub } public void aftertextchanged(editable arg0) { // todo auto-generated method stub //choosecategory.this.adapter.getfilter().filter(arg0); } }); for(int i=0;i<adapter.getcount();i++){ hashmap<string, object> hm = (hashmap<string, object>) adapter.getitem(i); string imgurl = (string) hm.get("flag_path"); imageloadertask imageloadertask = new imageloadertask(); hashmap<string, object> hmdownload = new hashmap<string, object>(); hm.put("flag_path",imgurl); hm.put("position", i); // starting imageloadertask download , populate image in listview imageloadertask.execute(hm); } } } /** asynctask download , load image in listview */ private class imageloadertask extends asynctask<hashmap<string, object>, void, hashmap<string, object>>{ @override protected hashmap<string, object> doinbackground(hashmap<string, object>... hm) { inputstream istream=null; string imgurl = (string) hm[0].get("flag_path"); int position = (integer) hm[0].get("position"); url url; try { url = new url(imgurl); // creating http connection communicate url httpurlconnection urlconnection = (httpurlconnection) url.openconnection(); // connecting url urlconnection.connect(); // reading data url istream = urlconnection.getinputstream(); // getting caching directory file cachedirectory = getbasecontext().getcachedir(); // temporary file store downloaded image file tmpfile = new file(cachedirectory.getpath() + "/wpta_"+position+".png"); // fileoutputstream temporary file fileoutputstream foutstream = new fileoutputstream(tmpfile); // creating bitmap downloaded inputstream bitmap b = bitmapfactory.decodestream(istream); // writing bitmap temporary file png file b.compress(bitmap.compressformat.png,100, foutstream); // flush fileoutputstream foutstream.flush(); //close fileoutputstream foutstream.close(); // create hashmap object store image path , position in listview hashmap<string, object> hmbitmap = new hashmap<string, object>(); // storing path temporary image file hmbitmap.put("flag",tmpfile.getpath()); // storing position of image in listview hmbitmap.put("position",position); // returning hashmap object containing image path , position return hmbitmap; }catch (exception e) { e.printstacktrace(); } return null; } @override protected void onpostexecute(hashmap<string, object> result) { // getting path downloaded image string path = (string) result.get("flag"); // getting position of downloaded image int position = (integer) result.get("position"); // getting adapter of listview simpleadapter adapter = (simpleadapter ) mlistview.getadapter(); // getting hashmap object @ specified position of listview hashmap<string, object> hm = (hashmap<string, object>) adapter.getitem(position); // overwriting existing path in adapter hm.put("flag",path); // noticing listview dataset changes adapter.notifydatasetchanged(); } } @override public boolean oncreateoptionsmenu(menu menu) { //getmenuinflater().inflate(r.menu.menu_main, menu); return true; } }
do have class variable named adapter ? seems choosecategory.this.adapter not local variables adapter = new simpleadapter(getbasecontext(), countries, r.layout.restaurant_list, from, to);
you should name class variable madapter.
Comments
Post a Comment