android - why am i getting Attempt to invoke interface method 'int java.util.List.size()' on a null object reference? -
this question has answer here:
- what nullpointerexception, , how fix it? 12 answers
enter code here`
public class mainactivity extends appcompatactivity {
private recyclerview recyclerview; private albumadapter adapter; public list<album> list; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); toolbar toolbar = (toolbar) findviewbyid(r.id.toolbar); setsupportactionbar(toolbar); recyclerview = (recyclerview) findviewbyid(r.id.recycler_view); new movieasynctask().execute(""); adapter = new albumadapter(this, list); recyclerview.setlayoutmanager(new gridlayoutmanager(this, 2)); recyclerview.setadapter(adapter); } public class movieasynctask extends asynctask<string,void,list<album> > { public list<album> getmoviedatafromjson(string str) { list<album> albumarraylist = new arraylist<>(); string imageurilink = "http://image.tmdb.org/t/p/w342/"; final string release_date = "release_date"; final string rating = "vote_average"; final string poster_path = "poster_path"; try { jsonobject jsonobject = new jsonobject(str); jsonarray jsonarray = jsonobject.getjsonarray("results"); for(int i=0;i<jsonarray.length();i++) { jsonobject jsonobject1 = jsonarray.getjsonobject(i); string releasedate = jsonobject1.getstring(release_date); string rating = jsonobject1.getdouble(rating)+"/10"; string image = imageurilink+jsonobject1.getstring(poster_path); albumarraylist.add(new album(rating,releasedate,image)); } string size = jsonarray.length()+" item"; log.v("size of albumlist = ",size); return albumarraylist; } catch (jsonexception j) { j.printstacktrace(); } return null; } @override protected list<album> doinbackground(string... params) { bufferedreader reader = null; httpurlconnection httpurlconnection = null; string readjson ; final string sortby = "sort_by"; final string appid_param = "api_key"; try { string movieuri = "https://api.themoviedb.org/3/discover/movie?"; uri builduri = uri.parse(movieuri).buildupon().appendqueryparameter(sortby,"popularity.desc") .appendqueryparameter(appid_param,buildconfig.movie_api_key).build(); url url = new url(builduri.tostring()); log.v("log_tag",builduri.tostring()); httpurlconnection = (httpurlconnection)url.openconnection(); httpurlconnection.setrequestmethod("get"); httpurlconnection.connect(); inputstream inputstream = httpurlconnection.getinputstream(); stringbuffer stringbuffer = new stringbuffer(); if(inputstream==null) { return null; } reader = new bufferedreader(new inputstreamreader(inputstream)); string line; while ((line = reader.readline()) != null) { // since it's json, adding newline isn't necessary (it won't affect parsing) // make debugging *lot* easier if print out completed // buffer debugging. stringbuffer.append(line + "\n"); } if(stringbuffer==null) { return null; } readjson = stringbuffer.tostring(); return getmoviedatafromjson(readjson); }catch (ioexception i) { i.printstacktrace(); } { if(httpurlconnection!=null) { httpurlconnection.disconnect(); } if(reader!=null) { try { reader.close(); }catch(ioexception i) { i.printstacktrace(); } } } return null; } @override protected void onpostexecute(list<album> albumlist) { if(!albumlist.isempty()) { super.onpostexecute(albumlist); list = albumlist; } } }
}
public class albumadapter extends recyclerview.adapter {
private context mcontext; private list<album> albumlist; public class myviewholder extends recyclerview.viewholder { public textview rating, releasedate; public imageview thumbnail, overflow; public myviewholder(view view) { super(view); rating = (textview) view.findviewbyid(r.id.title); releasedate = (textview) view.findviewbyid(r.id.count); thumbnail = (imageview) view.findviewbyid(r.id.thumbnails); overflow = (imageview) view.findviewbyid(r.id.overflow); } } public albumadapter(context mcontext1, list<album> albumlist1) { mcontext = mcontext1; albumlist = albumlist1; } @override public myviewholder oncreateviewholder(viewgroup parent, int viewtype) { view view = layoutinflater.from(mcontext).inflate(r.layout.album_card, parent, false); return new myviewholder(view); } @override public void onbindviewholder(final myviewholder holder, int position) { album album = albumlist.get(position); holder.rating.settext(album.getrating()); holder.releasedate.settext(album.getreleasedate()+" songs "); picasso.with(mcontext).load(album.getthumbnail()).into(holder.thumbnail); log.v("image_url",album.getthumbnail()); holder.overflow.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { showpopup(holder.overflow); } }); } /** * showing popup menu wher tapping on 3 dots */ private void showpopup(view view) { popupmenu popupmenu = new popupmenu(mcontext,view); menuinflater inflater = popupmenu.getmenuinflater(); inflater.inflate(r.menu.menu_album,popupmenu.getmenu()); popupmenu.setonmenuitemclicklistener(new popupmenu.onmenuitemclicklistener() { @override public boolean onmenuitemclick(menuitem item) { switch (item.getitemid()) { case r.id.action_add_favourite : toast.maketext(mcontext,"add favourite",toast.length_short).show(); return true; case r.id.action_play_next : toast.maketext(mcontext,"play next",toast.length_short).show(); return true; } return false; } }); } @override public int getitemcount() { return albumlist.size(); }
}
exception
11-13 15:07:00.587 26661-26661/com.example.sanket3125.cardgridviewexample e/androidruntime: fatal exception: main process: com.example.sanket3125.cardgridviewexample, pid: 26661 java.lang.nullpointerexception: attempt invoke interface method 'int java.util.list.size()' on null object reference @ com.example.sanket3125.cardgridviewexample.albumadapter.getitemcount(albumadapter.java:106) @ android.support.v7.widget.recyclerview.dispatchlayoutstep1(recyclerview.java:3225) @ android.support.v7.widget.recyclerview.onmeasure(recyclerview.java:2837) @ android.view.view.measure(view.java:18811) @ android.widget.relativelayout.measurechildhorizontal(relativelayout.java:716) @ android.widget.relativelayout.onmeasure(relativelayout.java:462) @ android.view.view.measure(view.java:18811) @ android.view.viewgroup.measurechildwithmargins(viewgroup.java:5952) @ android.support.design.widget.coordinatorlayout.onmeasurechild(coordinatorlayout.java:700) @ android.support.design.widget.headerscrollingviewbehavior.onmeasurechild(headerscrollingviewbehavior.java:90) @ android.support.design.widget.appbarlayout$scrollingviewbehavior.onmeasurechild(appbarlayout.java:1364) @ android.support.design.widget.coordinatorlayout.onmeasure(coordinatorlayout.java:765) @ android.view.view.measure(view.java:18811) @ android.view.viewgroup.measurechildwithmargins(viewgroup.java:5952) @ android.widget.framelayout.onmeasure(framelayout.java:194) @ android.support.v7.widget.contentframelayout.onmeasure(contentframelayout.java:135) @ android.view.view.measure(view.java:18811) @ android.view.viewgroup.measurechildwithmargins(viewgroup.java:5952) @ android.widget.linearlayout.measurechildbeforelayout(linearlayout.java:1465) @ android.widget.linearlayout.measurevertical(linearlayout.java:748) @ android.widget.linearlayout.onmeasure(linearlayout.java:630) @ android.view.view.measure(view.java:18811) @ android.view.viewgroup.measurechildwithmargins(viewgroup.java:5952) @ android.widget.framelayout.onmeasure(framelayout.java:194) @ android.view.view.measure(view.java:18811) @ android.view.viewgroup.measurechildwithmargins(viewgroup.java:5952) @ android.widget.linearlayout.measurechildbeforelayout(linearlayout.java:1465) @ android.widget.linearlayout.measurevertical(linearlayout.java:748) @ android.widget.linearlayout.onmeasure(linearlayout.java:630) @ android.view.view.measure(view.java:18811) @ android.view.viewgroup.measurechildwithmargins(viewgroup.java:5952) @ android.widget.framelayout.onmeasure(framelayout.java:194) @ com.android.internal.policy.phonewindow$decorview.onmeasure(phonewindow.java:2645) @ android.view.view.measure(view.java:18811) @ android.view.viewrootimpl.performmeasure(viewrootimpl.java:2127) @ android.view.viewrootimpl.measurehierarchy(viewrootimpl.java:1243) @ android.view.viewrootimpl.performtraversals(viewrootimpl.java:1535) @ android.view.viewrootimpl.dotraversal(viewrootimpl.java:1134) @ android.view.viewrootimpl$traversalrunnable.run(viewrootimpl.java:6045) @ android.view.choreographer$callbackrecord.run(choreographer.java:860) @ android.view.choreographer.docallbacks(choreographer.java:672) @ android.view.choreographer.doframe(choreographer.java:608) @ android.view.choreographer$framedisplayeventreceiver.run(choreographer.java:846) @ android.os.handler.handlecallback(handler.java:739) @ android.os.handler.dispatchmessage(handler.java:95) @ android.os.looper.loop(looper.java:148) @ android.app.activitythread.main(activitythread.java:5441) @ java.lang.reflect.method.invoke(native method) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:738) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:628)
you need initialize list variable in oncreate() before using in adapter.
new movieasynctask().execute(""); list = new arraylist<album>(); adapter = new albumadapter(this, list);
also, once have results in onpostexecute() method, need tell adapter reload list :
@override protected void onpostexecute(list<album> albumlist) { if(albumlist != null && !albumlist.isempty()) { super.onpostexecute(albumlist); list = albumlist; adapter.notifydatasetchanged(); } }
Comments
Post a Comment