2009-08-12 4 views
1

나는 내가 <s:List> 구성 요소를 사용하여 XML 파일 인 것으로 dataProvider을 지정하려면 어도비 플래시 빌더 4<s:List> 구성 요소의 dataProvider를 XML 파일로 설정하려면 어떻게해야합니까?

의 최신 베타 버전을 가지고있다.

그러나 많은 연구 (labs.adobe.com에서 doc 링크를 보는 것을 포함하여) 후에, 나는 아직도 그것을하는 방법을 이해할 수 없다.

XML 파일은 다음과 같이 보일 것입니다 :

<?xml version="1.0" encoding="ISO-8859-1"?> 
<imageList> 
    <image location="path/to/file1.jpg" /> 
    <image location="path/to/file2.jpg" /> 
    <image location="path/to/file3.jpg" /> 
</imageList> 
+0

XML을 네트워크를 통해로드 한 다음 List 또는 DataGrid에 표시하겠습니까? –

+0

기본적으로 클라이언트를 구성 파일로 사용하여 구성 요소에 나타날 이미지를 지정할 수 있습니다. –

답변

0

내 원래 목표는 내 클라이언트가 자신을 유지 할 수있는 SWF 외부 XML 파일을 가지고 있었다 따라서 그들은 표시된 이미지를 제어 할 수 있습니다.

제가 게시 한 첫 번째 대답은 제가 생각했던 해결책이 아니 었습니다 : fx:XML을 사용하면 XML 파일의 내용이 실제로 SWF로 컴파일되므로 컴파일 후에 변경할 수 없습니다.

그래서 제임스 솔루션을 구현했습니다.

은 XML 파일은 다음과 같다 :

<?xml version="1.0" encoding="ISO-8859-1"?> 

<images> 
    <image source="path/to/image1.jpg" /> 
    <image source="path/to/image2.jpg" /> 
    <image source="path/to/image3.jpg" /> 
    <image source="path/to/image4.jpg" /> 
</images> 

MXML :

<?xml version="1.0" encoding="utf-8"?> 

<s:Group 
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/halo" 
    > 

    <fx:Script> 
     <![CDATA[ 
      import mx.events.FlexEvent; 

      protected function lstImages_creationCompleteHandler(event : FlexEvent) : void 
      { 
       dpHttpService.send(); 
      } 

     ]]> 

    </fx:Script> 

    <fx:Declarations> 

     <mx:HTTPService 
      id="dpHttpService" 
      url="images.xml" 
     /> 

    </fx:Declarations> 

    <s:List 
     id="lstImages" 
     dataProvider="{dpHttpService.lastResult.images.image}" 
     width="100%" 
     itemRenderer="path.to.render.ImageRenderer" 
     skinClass="path.to.skins.ListSkin" 
     > 

     <s:layout> 
      <s:HorizontalLayout gap="2" /> 
     </s:layout> 

    </s:List> 

</s:Group> 

그리고 이미지 렌더러에서

, 나는 다음과 같은 데이터를 참조하십시오

<mx:Image 
    id="imgRendered" 
    source="{data.source}" 
/> 

정말 이 솔루션에 대한 유용한 점은 전체에 http:// 개의 참조를 넣을 수 있다는 것입니다. 다른 사이트 (물론 crossdomain.xml 기억).

실제로 images.xml 파일은 다른 서버에있을 수 있습니다.

+0

이상한 - 왜이 답변이 도움이되지 않는 것으로 표시되었는지 잘 모르겠습니다. 어떤 추측인가? 혼란스러워. –

+0

제임스가 기고 한 대답을 기반으로 할 때 자신의 답변을 가장 잘 선택한 것으로 사람들이 생각하는 것 같습니다. 상관없이 유용한 대답이기 때문에 표시하고 있습니다. – Turadg

0

당신은 XMLListCollection에 클래스를 사용해야합니다. 당신이 목록에서 이미지를 표시하려면

<s:List dataProvider="{new XMLListCollection(data.image)}" labelField="@location"/> 
+0

외부 XML 파일의 내용을로드 할 수 있습니까? –

+0

XML을 XMLListCollection으로 변환합니다. XML 소스는 관련이 없습니다. –

2

, 당신은은 URLLoader를 사용하는 XML을로드 바인딩 가능한 변수에 저장하고 목록에 데이터 공급자로 그를 할당해야합니다. 목록은 원하는대로보기를 사용자 정의 할 수있는 mx : itemrenderer를 사용해야합니다.

실제 코드가 someting이

<fx:Script> 
    <![CDATA[ 
     import mx.collections.XMLListCollection; 
     import mx.collections.IList; 
     import mx.controls.Image; 

     private var loader : URLLoader = new URLLoader(); 

     [Bindable] 
     private var xml : XMLList; 

     private function init() : void 
     { 
      this.loader.addEventListener(Event.COMPLETE, onComplete); 
      this.loader.load(new URLRequest("data.xml")); 
     } 

     private function onComplete(evt : Event) :void 
     { 
      this.loader.removeEventListener(Event.COMPLETE, onComplete); 
      this.xml = new XML(this.loader.data).image; 
     } 

    ]]> 
</fx:Script> 

<mx:List id="list" width="200" height="500" dataProvider="{xml}"> 
    <mx:itemRenderer> 
     <fx:Component> 
      <mx:Image width="200" height="200" source="{[email protected]}" /> 
     </fx:Component> 
    </mx:itemRenderer> 
</mx:List> 

+0

이것이 작동하는지 잘 모르겠습니다 - 저는 구성 요소를 사용하고 있으며 IList 인터페이스를 구현하는 dataProvider 만 허용합니다. 원본 게시물을 다시 읽으면 구성 요소를 사용하고 있는지 분명하지 않습니다. –

-1

음과 같이 간다, 나는 하나 개의 솔루션을 발견했다.

MXML은 다음과 같이 표시됩니다 같은

<fx:Declarations> 

    <fx:XML 
     id="dpXml" 
     source="path/to/images.xml" 
    /> 

    <mx:XMLListCollection 
     id="dpXmlListCollection" 
     source="{dpXml.image}" 
    /> 

</fx:Declarations> 

<s:List 
    id="lstImages" 
    dataProvider="{dpXmlListCollection}" 
    itemRenderer="path.to.render.ImageRenderer" 
    skinClass="path.to.skins.ListSkin" 
    > 

    <s:layout> 
     <s:HorizontalLayout gap="2" /> 
    </s:layout> 

</s:List> 

그리고 images.xml을 : 모든 응답을

<?xml version="1.0" encoding="ISO-8859-1"?> 
<images> 
    <image> 
     <location>path/to/image1.jpg</location> 
    </image> 
    <image> 
     <location>path/to/image2.jpg</location> 
    </image> 
    <image> 
     <location>path/to/image3.jpg</location> 
    </image> 
</images> 

많은 감사를!

매트

+0

Ack. 이 솔루션은 XML 파일을 결과 SWF에 포함시키는 것처럼 보이므로 코드가 릴리스되면 구성 할 수 없습니다. 다음에 James Ward의 솔루션을 살펴 보겠습니다. –

2

당신이 네트워크를 통해 XML 파일을로드 할 경우, 당신은 할 수 있습니다 :

<?xml version="1.0" encoding="utf-8"?> 
<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/halo"> 

    <fx:Declarations> 
     <mx:HTTPService id="srv" url="http://ws.jamesward.com/images.xml"/> 
    </fx:Declarations> 

    <s:applicationComplete> 
     srv.send(); 
    </s:applicationComplete> 

    <s:List dataProvider="{srv.lastResult.images.image}" width="100%" height="100%"> 
    <s:itemRenderer> 
     <fx:Component> 
     <mx:Image source="{data.source}"/> 
     </fx:Component> 
    </s:itemRenderer> 
    </s:List> 

</s:Application> 
+0

안녕하세요, James. 나는 그것도 잘 줄 것이다 - 깔끔한 해결책처럼 보인다. (필요한 경우 대신 로컬 파일을 사용할 수있다.) –

+0

James, 그 자리에 - 감사합니다. 답장으로 응답을 표시하고 내가 수행 한 방법의 세부 사항을 보여주기 위해 별도의 응답을 만듭니다. –

+0

이상한 - 하나 이상의 답변을 올릴 수없는 것처럼 보입니다. –