Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex 是否可以使灵活列表控件中的项不可选择?_Apache Flex_Actionscript 3 - Fatal编程技术网

Apache flex 是否可以使灵活列表控件中的项不可选择?

Apache flex 是否可以使灵活列表控件中的项不可选择?,apache-flex,actionscript-3,Apache Flex,Actionscript 3,是否可以使列表控件中的项不可选择?如果是,这将如何实现 到目前为止,我试过一件事。我所做的是在FlexEvent.data_更改事件中使用自定义项呈现程序来检查data属性中的值。如果未设置该值,我尝试将项目渲染器的可选属性设置为false。不幸的是,这似乎不起作用 有什么想法吗?我可以在下面添加一个分隔符组件。下面是一个示例,其中去掉了渲染器逻辑,保留了可选择性逻辑: package com.example.ui { import flash.events.MouseEvent; impor

是否可以使列表控件中的项不可选择?如果是,这将如何实现

到目前为止,我试过一件事。我所做的是在FlexEvent.data_更改事件中使用自定义项呈现程序来检查data属性中的值。如果未设置该值,我尝试将项目渲染器的可选属性设置为false。不幸的是,这似乎不起作用


有什么想法吗?

我可以在下面添加一个分隔符组件。下面是一个示例,其中去掉了渲染器逻辑,保留了可选择性逻辑:

package com.example.ui  {
import flash.events.MouseEvent;
import flash.ui.Keyboard;

import mx.controls.List;
import mx.controls.listClasses.IListItemRenderer;

public class MyList extends List
{
    public function MyList()
    {
        super();
    }


    /** Override mouse navigation */
    protected override function mouseEventToItemRenderer(event:MouseEvent):IListItemRenderer {
        var row:IListItemRenderer = super.mouseEventToItemRenderer(event);

        if (row != null && isSelectable(row.data)) {
            return null;
        }
        return row;
    }

    /** Override keyboard navigation */
    protected override function moveSelectionVertically(code:uint, shiftKey:Boolean, ctrlKey:Boolean):void {
        super.moveSelectionVertically(code, shiftKey, ctrlKey);

        if (code == Keyboard.DOWN && isSeparatorData(selectedItem)) {
            caretIndex++;
        }
        if (code == Keyboard.UP && isSeparatorData(selectedItem)) {
            caretIndex--;
        }
        finishKeySelection();           
    }

    /**
     * Define this mechanism in a way that makes sense for your project.
     */
    protected function isSelectable(data:Object):Boolean {
        return data != null && data.hasOwnProperty("type") && data.type == "separator";
    }

}
}

另一种更好地处理可滚动列表和连续分隔符的方法(仍不完善):

    protected override function moveSelectionVertically(code:uint, shiftKey:Boolean, ctrlKey:Boolean):void {
        super.moveSelectionVertically(code, shiftKey, ctrlKey);

        var newCode:uint = singleLineCode(code);
        var item:Object = selectedItem;
        var itemChanged:Boolean = true;

        while (!isNaN(newCode) && itemChanged && isSeparatorData(item)) {
            super.moveSelectionVertically(newCode, shiftKey, ctrlKey);
            itemChanged = (item === selectedItem);
            item = selectedItem;
        }
    }

    private function singleLineCode(code:uint):uint {
        switch (code) {
        case Keyboard.UP:
        case Keyboard.PAGE_UP:
            return Keyboard.UP;
            break;
        case Keyboard.DOWN:
        case Keyboard.PAGE_DOWN:
            return Keyboard.DOWN;
            break;
        default:
            return NaN;
            break;                              
        }
        return code;
    }

所以我想出了自己的解决办法。它与您的类似,似乎可以做到这一点,并覆盖所有的基础,除了破解向上和向下翻页键。我之所以说hack,是因为我不确定它是否以与列表控件相同的方式处理caretIndex的增加或减少。基本上,它只是手动将caretIndex设置为下一个可选项之前的索引,并将keycode更改为简单的向上或向下

protected function disabledFilterFunction( data:Object ):Boolean
{
    return ( data != null && data.data == null );
}

override protected function mouseEventToItemRenderer( event:MouseEvent ):IListItemRenderer
{
    var item:IListItemRenderer = super.mouseEventToItemRenderer( event );

    if( item && item.data && disabledFilterFunction( item.data ) )
        return null;

    return item;
}

override protected function moveSelectionVertically( code:uint, shiftKey:Boolean, ctrlKey:Boolean ):void
{
    var i:int;
    var newIndex:int;

    switch( code )
    {
        case Keyboard.UP:
            newIndex = getPreviousUnselectableIndex( caretIndex - 1 );
            break;

        case Keyboard.DOWN:
            newIndex = getNextUnselectableIndex( caretIndex + 1 );
            break;

        case Keyboard.HOME:
            newIndex = getFirstSelectableIndex();
            code = Keyboard.UP;
            break;

        case Keyboard.END:
            newIndex = getLastSelectableIndex();
            code = Keyboard.DOWN;
            break;

        case Keyboard.PAGE_UP:
        {
            newIndex = Math.max( getFirstSelectableIndex(), getPreviousUnselectableIndex( caretIndex - ( rowCount - 2 ) ) );
            code = Keyboard.UP;
            break;
        }

        case Keyboard.PAGE_DOWN:
        {
            newIndex = Math.min( getLastSelectableIndex(), getNextUnselectableIndex( caretIndex + ( rowCount - 1 ) ) );
            code = Keyboard.DOWN;
            break;
        }
    }

    if( newIndex > -1 && newIndex < collection.length )
    {
        caretIndex = newIndex;
        super.moveSelectionVertically( code, shiftKey, ctrlKey );
    }
}

private function getFirstSelectableIndex():int
{
    var result:int = -1;

    for( var i:int = 0; i < collection.length; i++ )
    {
        if( !disabledFilterFunction( collection[i] ) )
        {
            result = i + 1;
            break;
        }
    }

    return result;
}

private function getLastSelectableIndex():int
{
    var result:int = -1;

    for( var i:int = collection.length - 1; i > -1; i-- )
    {
        if( !disabledFilterFunction( collection[i] ) )
        {
            result = i - 1;
            break;
        }
    }

    return result;
}

private function getPreviousUnselectableIndex( startIndex:int ):int
{
    var result:int = -1;

    for( var i:int = startIndex; i > -1; i-- )
    {
        if( !disabledFilterFunction( collection[i] ) )
        {
            result = i + 1;
            break;
        }
    }

    return result;
}

private function getNextUnselectableIndex( startIndex:int ):int
{
    var result:int = collection.length;

    for( var i:int = startIndex; i < collection.length; i++ )
    {
        if( !disabledFilterFunction( collection[i] ) )
        {
            result = i - 1;
            break;
        }
    }

    return result;
}
受保护函数disabledFilterFunction(数据:对象):布尔值
{
返回(数据!=null&&data.data==null);
}
重写受保护的函数MouseeEventToItemRenderer(事件:MouseeEvent):IListItemRenderer
{
var item:IListItemRenderer=super.mouseeventtoitemdrenderer(事件);
if(item&&item.data&&disabledFilterFunction(item.data))
返回null;
退货项目;
}
覆盖受保护的函数MoveSelectionVertical(代码:uint,shiftKey:Boolean,ctrlKey:Boolean):无效
{
变量i:int;
var-newIndex:int;
开关(代码)
{
case Keyboard.UP:
newIndex=getPreviousUnselectableIndex(caretIndex-1);
打破
case Keyboard.DOWN:
newIndex=getNextUnselectableIndex(caretIndex+1);
打破
case.HOME:
newIndex=getFirstSelectableIndex();
code=Keyboard.UP;
打破
case.END:
newIndex=getLastSelectableIndex();
code=Keyboard.DOWN;
打破
case Keyboard.PAGE\u UP:
{
newIndex=Math.max(getFirstSelectableIndex(),getPreviousUnselectableIndex(caretIndex-(rowCount-2));
code=Keyboard.UP;
打破
}
case KEYBORD.PAGE_向下:
{
newIndex=Math.min(getLastSelectableIndex(),getNextUnselectableIndex(caretIndex+(rowCount-1));
code=Keyboard.DOWN;
打破
}
}
if(newIndex>-1&&newIndex-1;i--)
{
if(!disabledFilterFunction(集合[i]))
{
结果=i-1;
打破
}
}
返回结果;
}
私有函数getPreviousUnselectableIndex(startIndex:int):int
{
var结果:int=-1;
对于(变量i:int=startIndex;i>-1;i--)
{
if(!disabledFilterFunction(集合[i]))
{
结果=i+1;
打破
}
}
返回结果;
}
私有函数getNextUnselectableIndex(startIndex:int):int
{
var结果:int=collection.length;
for(var i:int=startIndex;i
我只是想增加我的两种感觉。我也在想同样的事情(如何将列表设置为不可选择),我意识到spark组件数据组正好可以做到这一点。当然,您需要使用flex 4,但是如果您是,并且想知道我是否可以将列表设置为不可选择,我建议使用数据组。

我可以通过分别在caretIndex++和caretIndex之前执行verticalScrollPosition++和verticalScrollPosition来解决第一个/最后一个项目不可选择的问题(在上面Michael链接的示例中)。我不敢相信修复这么简单,但它是

我自己也在寻找解决方案,下面是我提出的解决方案。请注意,我使用的是火花列表。我希望有人觉得这有帮助

  • 实现更改和更改的事件处理程序
  • 将选择设置为-1,并将requireSelection设置为false,以便不选择任何内容
  • 构建数据提供程序时,根据需要启用/禁用项
  • 在更改处理程序中提供一些逻辑,以便在未启用或不应选择事件时调用“preventDefault”
  • 示例:抄袭我的实现,我在其中构建自己的项目并使用平铺布局

    <s:List id="myListView"
        itemRenderer="spark.skins.spark.DefaultComplexItemRenderer"
        horizontalCenter="0"
        verticalCenter="0"
        borderVisible="false"
        dataProvider="{myItems}"
        change="changeHandler(event)" changing="changingHandler(event)"
        requireSelection="false"
        selectedIndex="-1" >
        <s:layout>
            <s:TileLayout verticalGap="0" />
        </s:layout>
    </s:List>
    <fx:script>
        <![CDATA[
            import mx.collections.ArrayCollection;            
            import spark.events.IndexChangeEvent;
    
            [Bindable]
            public var myItems = new ArrayCollection;
    
    
            protected function startup():void {
                // Here's where you'd build up your items if they
                // need to be built dynamically.
            }
    
            protected function changeHandler(event:IndexChangeEvent):void
            {
                var currentIndx:int = event.currentTarget.selectedIndex;
                var selectedItem:UIComponent = event.currentTarget.selectedItem as UIComponent;
    
                // Do whatever you need to do on selection here
            }
    
            protected function canMicrophoneChange(event:IndexChangeEvent):void
            {
                var currentIndx:int = event.currentTarget.selectedIndex;
                var selectedItem:UIComponent = event.currentTarget.selectedItem as UIComponent;
    
                // This will cancel the select if the item was not enabled.
                if (selectedItem.enabled == false) event.preventDefault();
            }
        ]]>
    </fx:script>
    

    这部分起作用。它似乎没有说明列表是可滚动的。例如,假设列表的集合/数据提供程序中有20项,而列表行数(可变行)为10。因此,将呈现滚动条。然后假设集合中的索引9(第一次查看列表时最后可见的行项目)是一个分隔符。如果您使用箭头键在列表中向下移动,列表将选择索引9处的分隔符。很好,我们到目前为止还没有在可滚动列表中使用此分隔符。它也没有处理连续的分离器(不太可能用于分离器,但是