I'd try using XMLListCollection instead of ArrayCollection

From: flexcoders@yahoogroups.com [mailto:[EMAIL PROTECTED] On Behalf Of anuj 
sharma
Sent: Tuesday, December 09, 2008 5:05 PM
To: flexcoders@yahoogroups.com
Subject: Re: [flexcoders] Filtering the List Entries depending upon the text 
entered in text Input box


Sorry Guys
I posted another mail in the group. I thought it was working but it is not 
going through each node, it is just comparing with the id of the first node of 
my XML , Below is the code , I apologize for jumping to the conclusion that it 
is working as initially it seems like. I am doing somethign wrong which makes 
my code not to loop through each and every node but just matching it with the 
id of the first node of my XML,
Please help me guys to resolve this problem

//XML File
<devices>
<device id="uuid:

ac14231535625133346546">
<attributes>
<attribute name="Flex"/>
<attribute name="monitor">monitoring</attribute>
<attribute name="version">2.0</attribute>
<attribute name="location">location</attribute>
<attribute name="friendly-name">Camera1</attribute>
<attribute name="type">AIR</attribute>
</attributes>
<schedules/>
</device>
</devices>
/**********************CODE*********************/
//This is REST CALL
<mx:HTTPService id="devicesXML" method="GET" resultFormat="e4x"
result="devicesXMLHandler(event)" showBusyCursor="true">
</mx:HTTPService>
//THis makes call to server
devicesXML.url="http://"+IP+"/config/devices";;
//Thid function is called when values are retreived
private function devicesXMLHandler(event:ResultEvent):void
{
devicesList = event.result.device;

//Checks every device
for each (var devicesInPool:* in devicesList) {
var deviceName:String = [EMAIL PROTECTED];
//var label:[EMAIL PROTECTED];
devicesInList.push(deviceName);
filteredDevices=new ArrayCollection(devicesInList);

nvrsInPoolList.dataProvider = filteredDevices;
filteredDevices.filterFunction=processFilter;
}

//This function calls for assigning label for the entries in the List
box named nvsInPoolList

private function assignFriendlyName(item:Object):String
{
//Checks every device
for each (var devicesID:* in devicesList) {
var deviceName:String = [EMAIL PROTECTED];
//Checks if the current deviceID matches the current item, if so
it will search its attributes
if(deviceName == item.toString()) {
var devicesText:XMLList =
devicesID.child("attributes").child("attribute");
//Checks every attribute tag for each device
for each (var attributesFriendlyName:* in devicesText) {
//Checks if the attribute name is friendly-name
if([EMAIL PROTECTED] == 'friendly-name') {
var friendlynameText:String = attributesFriendlyName.toString();
return friendlynameText;
}
}

}
}
return item.toString();
}
//Filtering Data in the Device List
private function processFilter(item:Object):Boolean
{
return
String(item).toUpperCase().indexOf(filterText.toUpperCase()) >= 0;
}
//Tracking the typed Camera Name
private function doChange():void
{
if(txtSearch.text!=null)
{
this.filterText=txtSearch.text;
this.filteredDevices.refresh();
}
}

<mx:List id="nvrsInPoolList" allowMultipleSelection="true"
dragMoveEnabled="true" dragEnabled="true" dropEnabled="true"
y="105" x="17" height="462" width="294"/>

<mx:TextInput id="txtSearch" x="17" y="75" change="doChange()"/>

On Wed, Dec 3, 2008 at 5:31 PM, anuj181 <[EMAIL PROTECTED]<mailto:[EMAIL 
PROTECTED]>> wrote:
Hi All
This is somehow regarding the question I have asked few weeks back.
Unfortunately I have to stop this task at that time and now need to
work on that. My need is that I have some entries in the List as an
arrayCollection and there is text input box and I like to have list to
filter the data as soon as user starts typing text. I have attached
the so far developed code. I need as soon as user types On, the list
below should only show first entry which is 'One-Device'. I attached
the code but it is not working as I want. This is going to be just my
dummy working prototype and once this module has been made working
then i am going to merge this module into my Main Project.

Also if anyone has any better idea about how to figure this thing out
that will be great and instead of arrayColection if we can achieve the
same function laity that would be helpful too.
Thanks a lot
Anuj

/******************CODE****************************/
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml";
layout="absolute"
initialize="init()"
width="100%" height="100%"
horizontalScrollPolicy="off">
<mx:Script>
<![CDATA[

import mx.managers.PopUpManager;
import mx.effects.DefaultTileListEffect;
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;
import mx.collections.ArrayCollection;
import mx.effects.easing.Elastic;

[Bindable]
public var ac:ArrayCollection = new
ArrayCollection(["One-Device","Two-Device","Three-Device","Four-Device","Five-Device","Six-Device"]);

[Bindable]
public var filterText:String = '';

private function doChange():void
{
this.filterText = txtSearch.text;
this.ac.refresh();
}

private function init():void
{
ac.filterFunction = processFilter;
}
private function processFilter(item:Object):Boolean
{
var result:Boolean=false;
if(!DevicesList.labelField.length ||
DevicesList.labelField.toUpperCase().indexOf(this.filterText.toUpperCase())>=0)
result=true;

return result;
}
private function seeLabel(evt:Event):void
{
var alrt:Alert=Alert.show(evt.currentTarget.toString());
}

]]>
</mx:Script>
<mx:List x="74" y="228" width="229" height="238" dataProvider="{ac}"

id="DevicesList"></mx:List>
<mx:TextInput x="74" y="198" id="txtSearch" change="doChange()"/>

</mx:Application>


Reply via email to