android - Custom holder adapter error -
i'm trying implement listview checkbox part of bigger app. when tried start activity, got nullpointer error i'm not able find out what's going wrong.
maybe asynctask doesn't return true value?
here logcat: https://www.dropbox.com/s/p8w9mz7lbofaeja/log.txt?dl=0
and code:
public class listactivity extends activity { /** * xml name list */ private string url; /** * list of products parsed xml */ list<book> products; /** * actual activity */ private activity currentactivity; /** * xml files path */ @suppresslint("sdcardpath") private string folder = "/data/data/com.group7.ule.barcodeshoppinglist/files/"; /** * products list's listview */ listview listview; /** * array lists user can change */ string[] data; @suppresswarnings("unchecked") @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_list); currentactivity = this; // catch xml's name bundle bundle = this.getintent().getextras(); this.url = bundle.getstring("listname"); log.d("listas libros", "estamos en lista:" + url); // available lists // folderadmin folderadmin = new folderadmin(folder); // this.data = folderadmin.getlistsnames(); arraylist<string> lists = database.getinstance(null).getlists(); this.data = new string[lists.size()]; (int = 0; < lists.size(); i++) { data[i] = lists.get(i); } // show elements of list refreshlist(); /***************************** spinner change list **************************/ final spinner availablelists = (spinner) findviewbyid(r.id.listspinner); arrayadapter<string> adaptador = new arrayadapter<string>( currentactivity, android.r.layout.simple_spinner_item, data); adaptador .setdropdownviewresource(android.r.layout.simple_spinner_dropdown_item); log.d("spinner", "set adapter"); availablelists.setonitemselectedlistener(new onitemselectedlistener() { @override public void onitemselected(adapterview<?> arg0, view arg1, int arg2, long arg3) { // if different list selected update view if ((availablelists.getselecteditem().tostring()) .compareto(url) != 0) { url = availablelists.getselecteditem().tostring(); refreshlist(); } } @override public void onnothingselected(adapterview<?> arg0) { } }); // attach adapter spinner. simple adapter availablelists.setadapter(adaptador); // selected list in availablelists.setselection(((arrayadapter<string>) availablelists .getadapter()).getposition(url.substring(0, url.length() - 4))); /***************************** add button **************************/ button addbutton = (button) findviewbyid(r.id.addbutton); log.d("add", "creado boton"); addbutton.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { // call search screen intent intent = new intent(currentactivity, barcodeactivity.class); startactivity(intent); } }); /***************************** remove buton **************************/ button removebutton = (button) findviewbyid(r.id.removebutton); log.d("remove", "creado boton"); removebutton.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { toast.maketext(currentactivity, " eliminando... ", toast.length_long).show(); // selected items , delete them (int = 0; < listview.getcount(); i++) { if (((custombaseadapter) listview.getadapter()).getitem(i) .ischecked()) { // op.removeelement(((custombaseadapter) // listview.getadapter()).getitem(i).gettitle(), url, // currentactivity); } } refreshlist(); } }); /***************************** deselectall button **************************/ button deselectbutton = (button) findviewbyid(r.id.desselectallbutton); log.d("deselectall", "creado boton"); deselectbutton.setonclicklistener(new onclicklistener() { @override public void onclick(view arg0) { log.d("deselec element", "arrancando deseleccionar"); // put checkboxs unchecked (int = 0; < listview.getcount(); i++) { listview.getadapter().getview(i, null, listview); ((custombaseadapter) listview.getadapter()).getholder() .getbookcheckbox().setchecked(false); } // report change adapter ((custombaseadapter) listview.getadapter()) .notifydatasetchanged(); } }); /***************************** selectall button **************************/ button selectbutton = (button) findviewbyid(r.id.selectallbutton); log.d("selectall", "creado boton"); selectbutton.setonclicklistener(new onclicklistener() { @override public void onclick(view arg0) { log.d("selec element", "arrancando seleccionar"); // put checkboxs checked (int = 0; < listview.getcount(); i++) { listview.getadapter().getview(i, null, listview); ((custombaseadapter) listview.getadapter()).getholder() .getbookcheckbox().setchecked(true); } // report change adapter ((custombaseadapter) listview.getadapter()) .notifydatasetchanged(); } }); /***************************** home button **************************/ button homebutton = (button) findviewbyid(r.id.iniciobutton); log.d("home", "creado boton"); homebutton.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { // call initial screen of application intent intent = new intent(currentactivity, mainactivity.class); startactivity(intent); } }); /***************************** select product **************************/ listview = (listview) findviewbyid(r.id.product_list); log.d("seleccionar", "creado boton"); listview.setonitemclicklistener(new onitemclicklistener() { @override public void onitemclick(adapterview<?> parent, view view, int position, long id) { toast.maketext(listactivity.this, products.get(position).getisbn10(), toast.length_short) .show(); // intent intent=new intent(listactivity.this, // elementactivity.class); // bundle bundle = new bundle(); // bundle.putstring("barcode", // products.get(position).getbarcode()); // intent.putextras(bundle); // startactivity(intent); } }); } /** * class in charge of loading xml using asynchronous task * * @author rut * */ private class cargarxmltask extends asynctask<string, integer, boolean> { // asynchronous task load xml in background protected boolean doinbackground(string... params) { // parse xml use product list /* * listaparsersax2 saxparser = new listaparsersax2(params[0], * getapplicationcontext()); products = saxparser.parse(); */ log.d("do backgroun", "arranca"); list<usulibr> listarelacciones = database.getinstance(null) .getusulibr(params[0]); listiterator<usulibr> iterador = listarelacciones.listiterator(); products = new arraylist<>(); while (iterador.hasnext()) { usulibr rel = (usulibr) iterador.next(); book libro = database.getinstance(null) .getbook(rel.getisbn10()); products.add(libro); system.out.println("libro recuperado: " + libro.gettitle()); } log.d("parser", "parseo terminado"); return true; } protected void onpostexecute(boolean result) { log.d("customadapter", "arrancando adaptador"); // 1. pass context , data adapter custombaseadapter adapter = new custombaseadapter(currentactivity, r.layout.product_list_row_layout, products, url); // 2. obtain listview activity_lists.xml listview = (listview) findviewbyid(r.id.product_list); // 3. put adapter list listview.setadapter(adapter); log.d("customadapter", "set adapter"); } /** * method inflates menu, adding items action bar, if * present. * * @param menu * @return true */ @suppresswarnings("unused") public boolean oncreateoptionsmenu(final menu menu) { getmenuinflater().inflate(r.menu.main, menu); return true; } } /** * method reloads xml */ public void refreshlist() { log.d("tarea asincrona", "arrancando"); // carga del xml mediante la tarea asÃncrona cargarxmltask tarea = new cargarxmltask(); tarea.execute(url); } } public class holder { /** * declaration of variables */ private textview bookname; private textview bookamount; private checkbox bookcheckbox; private button bookmorebutton; private button booklessbutton; /** * constructor */ public holder(){ } /** * method returns name´s textview * @return bookname */ public textview getbookname() { return bookname; } /** * method sets name´s textview * @param textview want attach holder */ public void setbookname(textview textview) { this.bookname = textview; } /** * method returns amount´s textview * @return bookamount */ public textview getbookamount() { return bookamount; } /** * method sets amount´s textview * @param bookamount want attach holder */ public void setbookamount(textview bookamount) { this.bookamount = bookamount; } /** * method returns checkbox * @return bookcheckbox */ public checkbox getbookcheckbox() { return bookcheckbox; } /** * method sets row checkbox * @param bookcheckbox want attach holder */ public void setbookcheckbox(checkbox bookcheckbox) { this.bookcheckbox = bookcheckbox; } /** * method returns button increase amount * @return bookmorebutton */ public button getbbokmorebutton() { return bookmorebutton; } /** * method sets button increase amount * @param bookmorebutton want attach holder */ public void setbookmorebutton(button bookmorebutton) { this.bookmorebutton = bookmorebutton; } /** * method returns button decrease amount * @return booklessbutton */ public button getbooklessbutton() { return booklessbutton; } /** * method sets button decrease amount * @param booklessbutton want attach holder */ public void setbooklessbutton(button booklessbutton) { this.booklessbutton = booklessbutton; } } public class custombaseadapter extends baseadapter{ /** * declaration of variables */ private final activity context; private final list<book> bookslist; view v; holder holder = null; private string xmlfile; /** * constructor * @param context activity context * @param textviewresourceid interface element referred * @param objects list of objects display * @param xml xml file objects belong */ public custombaseadapter(activity context, int textviewresourceid, list<book> objects,string xml) { this.context = context; this.bookslist = objects; this.xmlfile=xml; } @override public view getview(final int position, view convertview, viewgroup parent) { v = convertview; if (v == null) { holder = new holder(); log.d("holder", "holder creado, empezando..."); layoutinflater layoutinflater = context.getlayoutinflater(); v = layoutinflater.inflate(r.layout.product_list_row_layout, null); //assign interface elements holder holder.setbookcheckbox((checkbox) (v.findviewbyid(r.id.checkbox))); holder.setbookname((textview) v.findviewbyid(r.id.name_product)); //holder.setproductlessbutton((button) (v.findviewbyid(r.id.substractbutton))); //holder.setproductamount((textview) v.findviewbyid(r.id.amount_product)); //holder.setproductmorebutton((button) (v.findviewbyid(r.id.morebutton))); v.settag(holder); } else { holder = (holder) v.gettag(); } //assign each row corresponding data final book row = getitem(position); typeface font= typeface.createfromasset(context.getassets(), "aidaserifa-condensed.ttf"); holder.getbookname().settypeface(font); holder.getbookname().settext(row.gettitle()); holder.getbookcheckbox().settag(row.gettitle()); holder.getbookcheckbox().setchecked(row.ischecked()); /*****************************change checkbox state**************************/ holder.getbookcheckbox().setoncheckedchangelistener(new oncheckedchangelistener() { @override public void oncheckedchanged(compoundbutton v, boolean ischecked) { //ensures row associated checkbox modify prevent when //we recycle view row changely showed in row restarted.tagg row //essential before setting value of checkbox if (row.gettitle().equals(v.gettag().tostring())) { row.setchecked(ischecked); } } }); /*****************************increasing amount button**************************/ holder.getbbokmorebutton().setonclicklistener(new onclicklistener(){ @override public void onclick(view v) { /* integer change,previous; previous = integer.parseint(row.getamount()); change = previous+1; operation op = new operation(); op.modificar(xmlfile, row.getname(), change.tostring(),context); holder.getproductamount().settext(change.tostring()); log.d("holder", "amout aumentado"); ((listactivity)context).refreshlist(); */ } } ); /*****************************amount down button**************************/ holder.getbooklessbutton().setonclicklistener(new onclicklistener(){ @override public void onclick(view v) { /* integer change,previous; previous = integer.parseint(row.getamount()); //if amount 1 can´t reduced if(previous > 1){ change = previous-1; operation op = new operation(); op.modificar(xmlfile, row.getname(), change.tostring(),context); holder.getproductamount().settext(change.tostring()); log.d("holder", "amount disminuido"); ((listactivity)context).refreshlist(); }else{ toast.maketext(context,"el producto ya tiene la menor cantidad posible",toast.length_long).show(); } */ } }); return v; } @override public int getcount() { return bookslist.size(); } @override public book getitem(int position) { return bookslist.get(position); } @override public long getitemid(int position) { return bookslist.indexof(getitem(position)); } /** * method returns holder * @return holder actual holder of row */ public holder getholder() { return holder; } }
maybe stupid error, thankful.
intent#getextras() can return null, , call bundle.getstring("listname")
may cause of npe
but don't think so.
looking @ logcat there these lines:
05-29 18:39:25.054: d/home(14018): creado boton
05-29 18:39:25.054: d/androidruntime(14018): shutting down vm
looking code logs creado boton
see log here:
... button homebutton = (button) findviewbyid(r.id.iniciobutton); log.d("home", "creado boton"); homebutton.setonclicklistener(new onclicklistener() { ...
the next log is
... listview = (listview) findviewbyid(r.id.product_list); log.d("seleccionar", "creado boton"); listview.setonitemclicklistener(new onitemclicklistener() { ...
but never see seleccionar
in logs, implies code never reaches point. @ code between tags looking object references occur oncreate
(so not code inside setonitemclicklistener
) , 1 see homebutton.setonclicklistener
.
so, i'd npe homebutton
null. seems kinda unlikely there few topics on it.
Comments
Post a Comment