android - Edit Text in custom List View Loses Value on Scroll -
i know it's duplicate question, didn't find proper answer. in custom list-view having 2 textview , 1 editext, when inserted value in edit text , scroll loss value of edited text. , when pass string value adapter through list adapter show blank edit text.
here adapter code:
class createadapter extends arrayadapter<string> { string[] stritecode=null; string[] stritem; string[] strquantity,text; context context; int temp; createadapter(context context, string[] stritemcode, string[] stritem, string[] strqauntity) { super(context, r.layout.create_list_item, r.id.txtitemcode, stritemcode); this.context = context; this.stritecode = stritemcode; this.stritem = stritem; this.strquantity = strqauntity; text= new string[stritem.length]; } public view getview(int position, view convertview, viewgroup parent) { viewholder holder = null; temp=position; layoutinflater minflater = (layoutinflater) context .getsystemservice(activity.layout_inflater_service); if (convertview == null) { holder = new viewholder(); convertview = minflater .inflate(r.layout.create_list_item, parent, false); holder.txtitecode = (textview) convertview .findviewbyid(r.id.txtitemcode); holder.txtitem = (textview) convertview .findviewbyid(r.id.txtitem); holder.editquantity = (edittext) convertview .findviewbyid(r.id.editcreatequantity); holder.editquantity.settag(position); convertview.settag(holder); } else { holder = (viewholder) convertview.gettag(); } holder.editquantity.addtextchangedlistener(new textwatcher() { @override public void ontextchanged(charsequence s, int start, int before, int count) { text[temp] = s.tostring(); } @override public void beforetextchanged(charsequence s, int start, int count, int after) { } @override public void aftertextchanged(editable s) { } }); holder.txtitecode.settext(stritecode[position]); holder.txtitem.settext(stritem[position]); holder.editquantity.settext(text[temp]); return convertview; } class viewholder { textview txtitecode; textview txtitem; edittext editquantity; } }
i'm working on past 3 days, how can fix problem?
in addition of comments possibly using scrollview, real issue code how listview's adapter reusing views in conjunction textwatcher(s).
every single time row needs displayed, getview() method on position called. adapter can, , will, reuse actual views you've inflated in previous traversals save memory.
that thing, going have consequences when you're working edittexts , textwatchers.
first, holder.editquantity.addtextchangelistener() going keep adding new textwatcher on every layout pass. that's bad , partly responsible issue.
secondly, once view being reused, you're changing text on after setting textwatcher, trigger both old (if there one) , new textwatchers' ontextchanged() methods , change stored values, in turn messing views.
if want go listview/adapter route this, solution have global textwatcher variable, remove textwatcher view before setting text in getview() (so doesn't fire events when don't want to), , re-adding after you've set text. however, since can't keep creating new textwatchers (as prevent removing old ones experience same issue messed values), you'll need way link appropriate position in text[], since won't able point getview() method. however, can set edittext's focuschangelistener determine when view has focus (ie. it's being edited) , set appropriate editing position that)
e.g.
private int editingposition = 0; private textwatcher watcher = new textwatcher() { public void ontextchanged(charsequence s, int start, int before, int count) { text[editingposition] = s.tostring(); } public void beforetextchanged(charsequence s, int start, int count, int after) { } public void aftertextchanged(editable s) { } }; public view getview(int position, view convertview, viewgroup parent) { // before fine holder.editquantity.removetextchangedlistener(watcher); holder.editquantity.settext(text[temp]); holder.editquantity.setonfocuschangelistener(new onfocuschangelistener() { public void onfocuschange(view v, boolean hasfocus) { if(hasfocus) editingposition = position; } }); holder.editquantity.addtextchangedlistener(watcher); // rest good, make sure remove call setting edittext's text @ end return convertview; }
Comments
Post a Comment