android - filter for custom ArrayAdapter doesn't setting up -
i use filter custom adapter. adapter class looks :
public class contactadaper extends arrayadapter<contactitem> implements filterable{ view view; contactholder holder = null; int color = 0; context context; int layoutresourceid; public static int rowheight = 0; private viewswitcher switcher; list<contactitem> contacts = null; list<contactitem> filtredcontacts = null; map<contactitem, view> contactviewmap = contactsviewmapsingletone.getinstance().getorderviewmap(); private filter filter; public contactadaper(context context, int layoutresourceid,list<contactitem> contacts) { super(context, layoutresourceid, contacts); this.layoutresourceid = layoutresourceid; this.context = context; this.filtredcontacts = contacts; } @override public contactitem getitem(int arg0) { return contacts.get(arg0); } @override public long getitemid(int arg0) { return arg0; } @override public filter getfilter() { if (filter == null) filter = new contactfilter(); return filter; } /** * метод для привязки элементов ui к данным конкретного контакта */ @override public view getview(int position, view convertview, viewgroup parent) { view row = convertview; view = row; if(row == null) { layoutinflater inflater = (layoutinflater)this.context.getsystemservice(context.layout_inflater_service); row = inflater.inflate(r.layout.contact_item, parent, false); holder = new contactholder(); holder.contacticon = (imageview)row.findviewbyid(r.id.contacticon); holder.contactname = (customtextview)row.findviewbyid(r.id.contactname); holder.contactnumber = (customtextview)row.findviewbyid(r.id.contactnumber); holder.contactdays = (customtextview)row.findviewbyid(r.id.contactdays); row.settag(holder); } else { holder = (contactholder)row.gettag(); } contactitem contact = filtredcontacts.get(position); try{ if (contact.getcontactgroup()!=null) holder.contacticon.setbackgroundresource(contact.getcontactgroup().geticon()); else holder.contacticon.setbackgroundresource(contact.geticon()); holder.contactname.settext(contact.getname()); holder.contactnumber.settext(contact.getnumber()); holder.contactdays.settext(integer.tostring(contact.getdays())); } catch(exception e) { e.printstacktrace(); } contactviewmap.put(contact,row); return row; } static class contactholder { imageview contacticon; customtextview contactname; customtextview contactnumber; customtextview contactdays; } @suppresslint("defaultlocale") private class contactfilter extends filter { @override protected filterresults performfiltering(charsequence constraint) { filterresults results = new filterresults(); string prefix = constraint.tostring().tolowercase(); if (prefix == null || prefix.length() == 0) { arraylist<contactitem> list = new arraylist<contactitem>(filtredcontacts); results.values = list; results.count = list.size(); } else { final arraylist<contactitem> list = new arraylist<contactitem>(); synchronized (this) { list.addall(filtredcontacts); } int count = list.size(); final arraylist<contactitem> nlist = new arraylist<contactitem>(count); (int i=0; i<count; i++) { final contactitem pkmn = list.get(i); if(pkmn.getname().tolowercase(locale.getdefault()).contains(constraint)) nlist.add(pkmn); } results.values = nlist; results.count = nlist.size(); } return results; } @suppresswarnings("unchecked") @override protected void publishresults(charsequence constraint, filterresults results) { filtredcontacts = (arraylist<contactitem>)results.values; notifydatasetchanged(); clear(); for(int = 0, l = filtredcontacts.size(); < l; i++) { add(filtredcontacts.get(i)); } notifydatasetinvalidated(); } } } but problem filtering doesn't execute. adapter setting properly, without filtering. added contancts_list.settextfilterenabled(true); didn't help. possible solution ?
my problem in wrong arraylist adapter using. modified solution, works me:
public class contactadaper extends arrayadapter<contactitem> implements filterable{ view view; contactholder holder = null; int color = 0; context context; int layoutresourceid; public static int rowheight = 0; private viewswitcher switcher; list<contactitem> contacts = null; list<contactitem> filtredcontacts = null; frequentlyusedmethods faq; sparsearray<string> labels; map<contactitem, view> contactviewmap = contactsviewmapsingletone.getinstance().getorderviewmap(); private filter filter; public contactadaper(context context, int layoutresourceid,list<contactitem> contacts, sparsearray<string> labels) { super(context, layoutresourceid, contacts); this.layoutresourceid = layoutresourceid; this.context = context; this.contacts = new arraylist<contactitem>(); this.contacts.addall(contacts); this.filtredcontacts = new arraylist<contactitem>(); this.filtredcontacts.addall(contacts); this.labels = labels; faq = new frequentlyusedmethods(context); } @override public contactitem getitem(int arg0) { return contacts.get(arg0); } @override public long getitemid(int arg0) { return arg0; } @override public filter getfilter() { if (filter == null) filter = new contactfilter(); return filter; } @override public view getview(int position, view convertview, viewgroup parent) { view row = convertview; view = row; if(row == null) { layoutinflater inflater = (layoutinflater)this.context.getsystemservice(context.layout_inflater_service); row = inflater.inflate(r.layout.contact_item, parent, false); holder = new contactholder(); holder.contact_label=(textview)row.findviewbyid(r.id.contact_label); holder.contacticon = (imageview)row.findviewbyid(r.id.contacticon); holder.contactname = (customtextview)row.findviewbyid(r.id.contactname); holder.contactnumber = (customtextview)row.findviewbyid(r.id.contactnumber); holder.contactdays = (customtextview)row.findviewbyid(r.id.contactdays); row.settag(holder); } else { holder = (contactholder)row.gettag(); } contactitem contact = filtredcontacts.get(position); try{ if (contact.getdays()==0) { this.remove(contact); faq.deletecontact(contact); } else { if (contact.getcontactgroup()!=null) holder.contacticon.setbackgroundresource(contact.getcontactgroup().geticon()); else holder.contacticon.setbackgroundresource(contact.geticon()); holder.contactname.settext(contact.getname()); holder.contactnumber.settext(contact.getnumber()); holder.contactdays.settext(integer.tostring(contact.getdays())); if (labels.get(position)!=null) { holder.contact_label.setvisibility(view.visible); holder.contact_label.settext(labels.get(position)); } else holder.contact_label.setvisibility(view.invisible); } } catch(exception e) { e.printstacktrace(); } contactviewmap.put(contact,row); return row; } public sparsearray<string> getsparselabelsarray() { return this.labels; } public list<contactitem> getitems() { return filtredcontacts; } public map<contactitem, view> getviewcontactbinditems() { return contactviewmap; } static class contactholder { textview contact_label; imageview contacticon; customtextview contactname; customtextview contactnumber; customtextview contactdays; } @suppresslint("defaultlocale") private class contactfilter extends filter { @override protected filterresults performfiltering(charsequence constraint) { filterresults results = new filterresults(); string prefix = constraint.tostring().tolowercase(); if (prefix == null || prefix.length() == 0) { results.values = contacts; results.count = contacts.size(); } else { final arraylist<contactitem> list = new arraylist<contactitem>(); synchronized (this) { list.addall(contacts); } filtredcontacts.clear(); int count = list.size(); (int i=0; i<count; i++) { final contactitem pkmn = list.get(i); if(pkmn.getname().tolowercase(locale.getdefault()).contains(constraint)) { log.i("found pref",pkmn.tostring() ); filtredcontacts.add(pkmn); } } for(int = 0, l = filtredcontacts.size(); < l; i++) { log.i("filtered list",filtredcontacts.get(i).tostring()); } results.values = filtredcontacts; results.count = filtredcontacts.size(); } return results; } @suppresswarnings("unchecked") @override protected void publishresults(charsequence constraint, filterresults results) { filtredcontacts = (arraylist<contactitem>)results.values; notifydatasetchanged(); clear(); for(int = 0, l = filtredcontacts.size(); < l; i++) { add(filtredcontacts.get(i)); } notifydatasetchanged(); } } }
Comments
Post a Comment