2013-07-19 4 views
-1

한 가지 문제는 requireSelection을 false로 설정하는 것입니다. 목록에서 모든 항목을 선택하면 목록에 여전히 selectedAndShowsCaret이 하나 있습니다. 이 예제의 경우 호버 색상이 노란색이고 선택된 색상이 빨간색이고 selectedAndShowsCaret이 파란색입니다.스파크 목록 ItemRenderer select 상태 문제

는 또 다른 문제는 심지어 비워 selectedIndices를 설정되어 selectedItems를은 여전히 ​​업데이트 할 수 없습니다.

<?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/mx" 

    xmlns:components="components.*" 

    creationComplete="init()" 

    > 

    <fx:Script> 

     <![CDATA[ 

      import mx.collections.ArrayCollection; 
      [Bindable] 
      private var _dataProvider:ArrayCollection; 

      private function init():void { 
       generateList(); 
      } 

      private function generateList():void { 
       var items:Array = []; 

       for (var i:int = 0; i<3; i++) { 
        items.push(i); 
       } 

       _dataProvider = new ArrayCollection(items); 

      } 

      private function selectAllChange():void { 

       var selected:Boolean = selectAll.selected; 

       var result:Vector.<int> = new Vector.<int>(); 

       var count:int = _dataProvider.length; 

       for (var i:int = 0; i< count; i++) { 

        result[i] = i; 

       } 

       selected ? list.selectedIndices = result : list.selectedIndices = new Vector.<int>(); 

       //NOTE: when all the items is selected, the selectedItems is still empty 

       trace(list.selectedItems.length); 

      } 

     ]]> 

    </fx:Script> 

    <s:layout> 

     <s:VerticalLayout horizontalAlign="center"/> 

    </s:layout> 

    <s:CheckBox id="selectAll" label="Select All" change="selectAllChange()"/> 

    <components:CustomerList 

     id="list" 

     borderColor="#000000" 

     contentBackgroundColor="#cccccc" 

     requireSelection="false" 

     dataProvider="{_dataProvider}" 

     allowMultipleSelection="true" 

     itemRenderer="components.itemRenderer.DemoItemRenderer" 

     > 

     <components:layout> 

      <s:VerticalLayout paddingLeft="10" paddingRight="10"/> 

     </components:layout> 

    </components:CustomerList> 

</s:Application> 

DemoItemRenderer :

<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 

       xmlns:s="library://ns.adobe.com/flex/spark" 

       width="50" height="100" 

       autoDrawBackground="false" 

       > 

    <s:states> 

     <s:State name="normal" /> 

     <s:State name="hovered" /> 

     <s:State name="selected" /> 

     <s:State name="dragging"/> 

     <s:State name="normalAndShowsCaret" stateGroups="caret" /> 

     <s:State name="hoveredAndShowsCaret" stateGroups="caret" /> 

     <s:State name="selectedAndShowsCaret" stateGroups="caret" /> 

    </s:states> 



    <fx:Script> 

     <![CDATA[ 

      override public function set data(value:Object):void { 
       super.data = value; 
       if (data == null){ 
        return; 
       } 
       txt.text = String(data); 
      } 

      override protected function getCurrentRendererState():String { 

       currentState = super.getCurrentRendererState(); 

       trace(currentState); 

       return super.getCurrentRendererState(); 
      } 
     ]]> 

    </fx:Script> 

    <!--selected: red, selectedAndShowsCaret: blue, hovered: yellow--> 

    <s:Rect width="100%" height="100%" includeIn="selected, selectedAndShowsCaret"> 
     <s:fill> 
      <s:SolidColor color.selected="#ff0000" color.selectedAndShowsCaret="#00ffff"/> 
     </s:fill> 
    </s:Rect> 

    <s:Rect width="100%" height="100%" includeIn="hovered"> 
     <s:fill> 
      <s:SolidColor color="#ffff00"/> 
     </s:fill> 
    </s:Rect> 

    <s:Label color="#000000" id="txt" horizontalCenter="0" verticalCenter="0" visible.dragging="false"/> 

</s:ItemRenderer> 

답변

1
모두 선택 확인란을 선택 취소 selectedItems.length 여전히 3.

enter image description here

은 다음이 될 때 다음 3 개 항목이 코드입니다

두 번째 질문에 대한이 selectAll() 함수는 나를 위해 작동합니다 :

 protected function selectAll():void{ 

      if(select.selected){      
       var indexVector:Vector.<int> = new Vector.<int>(); 
       for(var i:int= 0; i<list.dataProvider.length;i++) 
       {   
        indexVector.push(i); 
       }     


       list.selectedIndices = indexArray; 
       list.addEventListener(FlexEvent.UPDATE_COMPLETE, list_updateCompleteHandler); 


      } else { 
       list.selectedIndex = -1; 
       list.addEventListener(FlexEvent.UPDATE_COMPLETE, list_updateCompleteHandler); 

      } 


     } 

     private function list_updateCompleteHandler(event:FlexEvent):void{ 
      list.removeEventListener(FlexEvent.UPDATE_COMPLETE, list_updateCompleteHandler); 
      trace(list.selectedItems); 
     } 
+0

이 문제를 해결할 수 있습니다. 감사. – jason