android - Issues with personal listView Adapter -
i'm having troubles using own adapter class creating listview delimiter. i'm beginner in android development can't fix alone.
i want create listview same layout seen on web site, , want items alphabetically ordered.
so create 2 adapter, 1 adding delimiters, , other 1 handling specific layout of each item.
the class listemusiccontainer
arraylist sorted alphabetically name.
each 1 works fine separately, when try out both, runtime error.
the error doesn't appear when application starts, when try scroll (so guess i'm good).
i don't why error when scrolling. how can solved?
here adapter use create listview delimiter
abstract public class musicadapter extends baseadapter{ abstract protected view getheaderview(string caption, int index, view convertview, viewgroup parent); private list<section> sections = new arraylist<section>(); private static int type_section_header = 0; public musicadapter() { super(); } public void addsection(string caption, itemadapter adapter){ sections.add(new section(caption, adapter)); } public object getitem(int position){ (section section : this.sections){ if (position == 0){ return section; } int size = section.adapter.getcount() + 1; if (position < size){ return section.adapter.getitem(position - 1); } position -= size; } return null; } public int getcount(){ int total = 0; (section section : this.sections){ total += section.adapter.getcount() + 1; } return total; } public int getitemviewtype(int position){ int typeoffset = type_section_header + 1; (section section : this.sections) { if (position == 0) { return (type_section_header); } int size = section.adapter.getcount() + 1; if (position < size) { return (typeoffset + section.adapter .getitemviewtype(position - 1)); } position -= size; typeoffset += section.adapter.getviewtypecount(); } return -1; } public boolean areallitemsselectable(){ return false; } public boolean isenabled(int position) { return (getitemviewtype(position) != type_section_header); } @override public view getview(int position, view convertview, viewgroup parent){ int sectionindex = 0; (section section : this.sections){ if (position == 0){ return (getheaderview(section.caption, sectionindex, convertview, parent)); } int size = section.adapter.getcount() + 1; if (position < size){ return (section.adapter.getview(position - 1, convertview, parent)); } position -= size; sectionindex++; } return null; } @override public long getitemid(int position){ return position; } class section { string caption; itemadapter adapter; section(string caption, itemadapter adapter) { this.caption = caption; this.adapter = adapter; } } }
and here 1 use each item :
public class itemadapter extends baseadapter{ private listemusiccontainer<music> mlist; private layoutinflater minflater; public itemadapter(context context, listemusiccontainer<music> musics){ minflater = layoutinflater.from(context); mlist = musics; } @override public int getcount() { return mlist.size(); } @override public object getitem(int position) { return position; } @override public long getitemid(int position) { return position; } @override public view getview(int position, view convertview, viewgroup parent) { viewholder holder; if (convertview == null){ convertview = minflater.inflate(r.layout.list_item, null); holder = new viewholder(); holder.nom = (textview) convertview.findviewbyid(r.id.nomalbum); holder.genre = (textview) convertview.findviewbyid(r.id.genrealbum); convertview.settag(holder); } else{ holder = (viewholder) convertview.gettag(); } holder.nom.settext(mlist.getitem(position).getnom()); holder.genre.settext(mlist.getitem(position).getgenre()); return convertview; } static class viewholder{ textview nom; textview genre; } }
here how initialize layout :
public class testview extends listactivity { /** called when activity first created. */ private listview mlistview; private static string[] items; private xmldataparser mparser; private listemusiccontainer<music> mlist; private musicadapter madapter = new musicadapter() { protected view getheaderview(string caption, int index, view convertview, viewgroup parent) { textview result = (textview) convertview; if (convertview == null) { result = (textview) getlayoutinflater().inflate( r.layout.header, null); } result.settext(caption); return (result); } }; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); mparser = new xmldataparser(); mlist = mparser.parsexml(this); listemusiccontainer<music> groupe = new listemusiccontainer<music>(); string currletter = null; (int = 0; < mlist.size(); i++){ if (!mlist.getitem(i).getlabel().equalsignorecase(currletter) && currletter != null){ madapter.addsection(mlist.getitem(i).getlabel().touppercase(), new itemadapter(this, groupe)); groupe = new listemusiccontainer<music>(); currletter = mlist.getitem(i).getlabel(); } if (currletter == null){ currletter = mlist.getitem(i).getlabel(); } groupe.adddata(mlist.getitem(i)); } setlistadapter(madapter); } }
edit : in logcat, here got in logcat when running application :
i/activitymanager( 42): displayed activity com.view/.testview: 1480 ms (total 1480 ms) d/dalvikvm( 975): gc_external_alloc freed 1214 objects / 78504 bytes in 96ms d/androidruntime( 975): shutting down vm w/dalvikvm( 975): threadid=1: thread exiting uncaught exception (group=0x4 001d800) e/androidruntime( 975): fatal exception: main e/androidruntime( 975): java.lang.nullpointerexception e/androidruntime( 975): @ com.view.itemadapter.getview(itemadapter.java :51) e/androidruntime( 975): @ com.view.musicadapter.getview(music adapter.java:91) e/androidruntime( 975): @ android.widget.abslistview.obtainview(abslist view.java:1294) e/androidruntime( 975): @ android.widget.listview.makeandaddview(listvi ew.java:1727) e/androidruntime( 975): @ android.widget.listview.filldown(listview.jav a:652) e/androidruntime( 975): @ android.widget.listview.fillgap(listview.java :623) e/androidruntime( 975): @ android.widget.abslistview.trackmotionscroll( abslistview.java:2944) e/androidruntime( 975): @ android.widget.abslistview.ontouchevent(absli stview.java:2065) e/androidruntime( 975): @ android.widget.listview.ontouchevent(listview .java:3315) e/androidruntime( 975): @ android.view.view.dispatchtouchevent(view.jav a:3766) e/androidruntime( 975): @ android.view.viewgroup.dispatchtouchevent(vie wgroup.java:897) e/androidruntime( 975): @ android.view.viewgroup.dispatchtouchevent(vie wgroup.java:936) e/androidruntime( 975): @ android.view.viewgroup.dispatchtouchevent(vie wgroup.java:936) e/androidruntime( 975): @ android.view.viewgroup.dispatchtouchevent(vie wgroup.java:936) e/androidruntime( 975): @ com.android.internal.policy.impl.phonewindow$ decorview.superdispatchtouchevent(phonewindow.java:1671) e/androidruntime( 975): @ com.android.internal.policy.impl.phonewindow. superdispatchtouchevent(phonewindow.java:1107) e/androidruntime( 975): @ android.app.activity.dispatchtouchevent(activ ity.java:2086) e/androidruntime( 975): @ com.android.internal.policy.impl.phonewindow$ decorview.dispatchtouchevent(phonewindow.java:1655) e/androidruntime( 975): @ android.view.viewroot.handlemessage(viewroot. java:1785) e/androidruntime( 975): @ android.os.handler.dispatchmessage(handler.ja va:99) e/androidruntime( 975): @ android.os.looper.loop(looper.java:123) e/androidruntime( 975): @ android.app.activitythread.main(activitythrea d.java:4627) e/androidruntime( 975): @ java.lang.reflect.method.invokenative(native method) e/androidruntime( 975): @ java.lang.reflect.method.invoke(method.java:5 21) e/androidruntime( 975): @ com.android.internal.os.zygoteinit$methodanda rgscaller.run(zygoteinit.java:868) e/androidruntime( 975): @ com.android.internal.os.zygoteinit.main(zygot einit.java:626) e/androidruntime( 975): @ dalvik.system.nativestart.main(native method) w/activitymanager( 42): force finishing activity com.view/.testview
Comments
Post a Comment