actionscript 3 - spark Combobox selection is not visible if list changes -



actionscript 3 - spark Combobox selection is not visible if list changes -

i using spark combobox , filter function filter characters in firstname , lastname. when user types "a" drop downwards list showing filtered items selecting "aram,babu" in drop downwards , showing text "aram,babu" in textinput. if user presses "r", text input displays "aram,babu", drop downwards list selection disappears. hitting come in or clicking mouse outside drop downwards results in wrong item (last item, i.e. "armu,babu") beingness selected.

<?xml version="1.0"?> <s:application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:local="*"> <fx:script><![cdata[ import mx.collections.arraycollection; private function labelfield(item:object):string { if (item && item salesperson && item.lastname && item.firstname) { homecoming item.firstname + "," + item.lastname; } homecoming ""; } private var arr:arraycollection; private var arr1:arraycollection; private var salesper:salesperson; private function getdata():arraycollection { arr1 = new arraycollection(); var salesperson:salesperson = new salesperson(); salesperson.username = "ravi kumar"; salesperson.firstname = "ravi"; salesperson.lastname = "kumar"; var salesperson1:salesperson = new salesperson(); salesperson1.username = "kiran kumar"; salesperson1.firstname = "kiran"; salesperson1.lastname = "kumar"; var salesperson2:salesperson = new salesperson(); salesperson2.username = "james bond"; salesperson2.firstname = "james"; salesperson2.lastname = "bond"; var salesperson3:salesperson = new salesperson(); salesperson3.username = "ravi babu"; salesperson3.firstname = "ravi"; salesperson3.lastname = "babu"; var salesperson4:salesperson = new salesperson(); salesperson4.username = "rakesh babu"; salesperson4.firstname = "rakesh"; salesperson4.lastname = "babu"; var salesperson5:salesperson = new salesperson(); salesperson5.username = "ramesh babu"; salesperson5.firstname = "ramesh"; salesperson5.lastname = "babu"; var salesperson6:salesperson = new salesperson(); salesperson6.username = "aram babu"; salesperson6.firstname = "aram"; salesperson6.lastname = "babu"; var salesperson7:salesperson = new salesperson(); salesperson7.username = "armu babu"; salesperson7.firstname = "armu"; salesperson7.lastname = "babu"; arr1.additem(salesperson); arr1.additem(salesperson1); arr1.additem(salesperson2); arr1.additem(salesperson3); arr1.additem(salesperson4); arr1.additem(salesperson5); arr1.additem(salesperson6); arr1.additem(salesperson7); homecoming arr1; } ]]></fx:script> <s:vgroup width="100%" height="100%"> <local:filtercombo labelfunction="labelfield" dataprovider="{getdata()}"/> </s:vgroup> </s:application> <?xml version="1.0"?> <s:combobox xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" click="clickhandler(event)"> <fx:script> <![cdata[ import mx.collections.arraycollection; import mx.collections.ilist; import spark.events.textoperationevent; private var unfiltereddataprovider:ilist; override public function set dataprovider(value:ilist):void { super.dataprovider = value; unfiltereddataprovider = value; } override protected function textinput_changehandler(event:textoperationevent):void { super.textinput_changehandler(event); if (unfiltereddataprovider arraycollection) { arraycollection(unfiltereddataprovider).filterfunction = filtermatches; arraycollection(unfiltereddataprovider).refresh(); super.dataprovider = new arraycollection(unfiltereddataprovider.toarray()); } } protected function filtermatches(item:object):boolean { if (item && item.lastname && item.firstname) { if (string(item.lastname + item.firstname).tolowercase().indexof(textinput.text.slice(0, textinput.selectionanchorposition).tolowercase()) > -1) { // trace("traderdofilter true") homecoming true; } } homecoming false; } private function clickhandler(event:mouseevent):void { } ]]> </fx:script> </s:combobox>

basically combobox search working based on labelfield, can see combobox framework code.

verify below mentioned function: combobox -> processinputfield(function)

class="snippet-code-html lang-html prettyprint-override">if (itemmatchingfunction != null)//itemmatchingfunction allways null untill assign our callback function matchingitems = itemmatchingfunction(this, textinput.text); else matchingitems = findmatchingitems(textinput.text);//calling default

so need assign our custom callbackfunction itemmatchingfunction(public)

i have made changes in code seek this, has bugs

class="snippet-code-html lang-html prettyprint-override"><?xml version="1.0" encoding="utf-8"?> <s:combobox xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" click="clickhandler(event)"> <fx:script> <![cdata[ import mx.collections.arraycollection; import mx.collections.ilist; import spark.events.textoperationevent; import spark.utils.labelutil; private var unfiltereddataprovider:ilist; namespace mx_internal; override public function set dataprovider(value:ilist):void { super.dataprovider = value; this.itemmatchingfunction = itemmatchingfunction1; } override protected function textinput_changehandler(event:textoperationevent):void { super.textinput_changehandler(event); if (dataprovider arraycollection) { arraycollection(dataprovider).filterfunction = filtermatches; arraycollection(dataprovider).refresh(); } } protected function filtermatches(item:object):boolean { if (item && item.lastname && item.firstname) { if (string(item.lastname +","+ item.firstname).tolowercase().indexof(textinput.text.slice(0, textinput.selectionanchorposition).tolowercase()) > -1) { return true; } } return false; } /** * @private */ // returns array of possible values private function itemmatchingfunction1(comb:combobox,input:string):vector.<int> { // now, select first match var startindex:int; var stopindex:int; var retval:int; var retvector:vector.<int> = new vector.<int>; retval = findstringloop(input, 0, dataprovider.length); if (retval != -1) retvector.push(retval); return retvector; } /** * @private */ function findstringloop(str:string, startindex:int, stopindex:int):number { // seek find item based on start , stop indices. for (startindex; startindex != stopindex; startindex++) { var itmstr:string = itemtolabel(dataprovider.getitemat(startindex)); itmstr = itmstr.substring(0, str.length); if (str == itmstr || str.touppercase() == itmstr.touppercase()) { return startindex; } } return -1; } /** * given info item, homecoming right text renderer * should display while taking <code>labelfield</code> * , <code>labelfunction</code> properties account. * * @param item info item * * @return string representing text display * info item in renderer. * * @langversion 3.0 * @playerversion flash 10 * @playerversion air 1.5 * @productversion flex 4 */ override public function itemtolabel(item:object):string { if (item && item.lastname && item.firstname) return item.lastname +","+ item.firstname; return item[labelfield]; } ]]> </fx:script> </s:combobox>

actionscript-3 flex flex4 flex3 flex4.5

Comments

Popular posts from this blog

java - How to set log4j.defaultInitOverride property to false in jboss server 6 -

c - GStreamer 1.0 1.4.5 RTSP Example Server sends 503 Service unavailable -

Using ajax with sonata admin list view pagination -