android - Changing text of a TextView that's inside an ArrayAdapter by pressing a Button within the same adapter -
this first question here in stackoverflow. please correct me if i'm doing wrong. so.. here go:
i'm trying create onclicklistener of button inside arrayadapter changes text of textview within same layout. what's happening is: when click button, changes text of more 1 textview. it's this: if press first button of list, changes text of 5h, 9th, 13th..... why thath happening?
i'd have onclicklistener changes text of textview located on samelayout.
ps: when "button" it's "imageview"
the adapter's code:
public class productadapter extends arrayadapter<produtc> { public productadapter (context context, arraylist<product> products) { super(context, 0, products); } @override public view getview (final int position, view convertview, viewgroup parent) { final viewholder viewholder; final product product = getitem(position); if (convertview == null) { convertview = layoutinflater.from(getcontext()).inflate(r.layout.layout_sliders, parent, false); viewholder = new viewholder(); viewholder.textviewproductindex = (textview) convertview.findviewbyid(r.id.textviewindex); viewholder.textviewproductname = (textview) convertview.findviewbyid(r.id.textviewproductname); viewholder.textviewquantity = (textview) convertview.findviewbyid(r.id.textviewquantity); viewholder.imageviewadd = (imageview) convertview.findviewbyid(r.id.buttonadd); viewholder.imageviewfill = (imageview) convertview.findviewbyid(r.id.buttonfill); viewholder.imageviewcheck = (imageview) convertview.findviewbyid(r.id.buttoncheck); convertview.settag(viewholder); } else { viewholder = (viewholder) convertview.gettag(); } if (produto != null) { viewholder.textviewproductindex.settext(product.getproductindex()); viewholder.textviewproductname.settext(product.getproductname()); viewholder.imageviewadd.settag(position); viewholder.imageviewfill.settag(position); viewholder.imageviewcheck.settag(position); viewholder.textviewproductindex.settag(position); viewholder.textviewproductname.settag(position); viewholder.textviewquantity.settag(position); viewholder.imageviewadd.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { viewholder.textviewquantity.settext("testing"); } }); } return convertview; } class viewholder { private textview textviewproductindex; private textview textviewproductname; private textview textviewquantity; private imageview imageviewadd; private imageview imageviewfill; private imageview imageviewcheck; }}
other doubts:
-what have pass on settag()?
-should handle clicklisteners after setapdapter on onitemclicklistener of listview instead?
there 3 issues raised here. let me try explain way.
a) on view reusability.
say have 100x products in array. 5x products displayed on screen @ point in time. 5x layouts inflated listview. reused scroll (note im simplifying little ignoring caching mechanisms).
what happens if set color on "1st view" orange 1st product. time 6th product reuses "1st view", still orange.
you need set property boolean stated 100x products, can set color of view based on property, each time come view.
b) settag optional. useful if see answer question c).
c) there 2 ways set onclick listview. - 1st way set onclick each view everytime appear. if scroll 1st product 100th product, have set 100 times. when scroll up, need create onclick() each view because have been overridden scroll.
a 2nd way create shared clicker. can set each view. 1 instance of listener made
final onclicklistener listener = new onclicklistener() { void onclick(view view) { product product = (product)view.gettag(); // somethign } }
try this
import android.content.context; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.imageview; import android.widget.textview; public class productadapter extends arrayadapter<product> { private final layoutinflater inflater; private context mcontext; private arraylist<product> mproducts; final string[] switch = new string[2] { "on", "off" }; public productadapter(context context, arraylist<product> products) { super(context, 0, products); this.mcontext = context; this.mproducts = products; inflater = mcontext.getlayoutinflater(); } public class viewholder { private final textview textviewproductindex; private final textview textviewproductname; private final textview textviewquantity; private final imageview imageviewadd; private final imageview imageviewfill; private final imageview imageviewcheck; private byte selected = 0; public viewholder(view view) { this.mtextviewproductindex = (textview) v.findviewbyid(r.id.textviewindex); this.mtextviewproductname = (textview) v.findviewbyid(r.id.textviewproductname); this.mtextviewquantity = (textview) v.findviewbyid(r.id.textviewquantity); this.mimageviewadd = (imageview) v.findviewbyid(r.id.buttonadd); this.mimageviewfill = (imageview) v.findviewbyid(r.id.buttonfill); this.mimageviewcheck = (imageview) v.findviewbyid(r.id.buttoncheck); view.settag(this); } } @override public view getview(final int position, view convertview, viewgroup parent) { if (convertview == null) { convertview = inflater.inflate(r.layout.layout_sliders, parent); new viewholder(convertview); } final viewholder holder = (viewholder) convertview.gettag(); holder.textviewproductindex.settext(mproducts.get(position).getproductindex()); holder.textviewproductname.settext(mproducts.get(position).getproductname()); holder.imageviewadd.setonclicklistener(listener); holder.mtextviewquantity(switch[holder.selected]); return convertview; } final onclicklistener listener = new onclicklistener() { void onclick(view view) { final viewholder holder = (viewholder) convertview.gettag(); holder.selected ^= 1; holder.mtextviewquantity.settext(switch[holder.selected]); } } }
another way set in itemclicklistener of listview. however, theres less flexibility in compared 2nd way above.
hope helps
Comments
Post a Comment