Actionscript 3 滚动到列表中的字母表(ArrayCollection数据提供程序)(字母表跳转)

Actionscript 3 滚动到列表中的字母表(ArrayCollection数据提供程序)(字母表跳转),actionscript-3,apache-flex,actionscript,air,Actionscript 3,Apache Flex,Actionscript,Air,希望这很容易,但这有时意味着在flex中是不可能的,我已经搜索了很多,但都没有结果 假设我有一份艺术家名单(名单1): 2Pac 阿黛尔 艾蜜蕊 碧昂丝 杰森-阿尔丁 夏奇拉 树 我还有一个列表(列表#2),其中包含值#,a-Z-如何创建字母跳转 因此,如果用户单击列表2中的“a”,会自动滚动到列表顶部的“Adele”#1-不过滤,这样他/她可以向上滚动到查看2Pac,或者向下滚动到查看尚未在视图中的TEW 这是一个标准的Flex Spark列表,其中ArrayCollection作为数据提供程

希望这很容易,但这有时意味着在flex中是不可能的,我已经搜索了很多,但都没有结果

假设我有一份艺术家名单(名单1):

2Pac 阿黛尔 艾蜜蕊 碧昂丝 杰森-阿尔丁 夏奇拉 树

我还有一个列表(列表#2),其中包含值#,a-Z-如何创建字母跳转

因此,如果用户单击列表2中的“a”,会自动滚动到列表顶部的“Adele”#1-不过滤,这样他/她可以向上滚动到查看2Pac,或者向下滚动到查看尚未在视图中的TEW

这是一个标准的Flex Spark列表,其中ArrayCollection作为数据提供程序-艺术家字段称为“title”,同时还有一个用户不可见的唯一id字段

谢谢

有关词典的讨论,请参阅标记回答上的注释,在某些情况下可能更快。代码见下文(尚未确认其速度更快!请测试):

private function alphabet\u listChange(evt:IndexChangeEvent):无效{
var字母:字符串;
letter=evt.currentTarget.selectedItems[0].toString();
跟踪(当前字典[字母]);
ui_lsLibraryList.ensureIndexIsVisible(当前字典[字母]);
}
公共函数createAlphabetJumpDictionary():Dictionary{
//alphabetArray是一个类级数组,包含a-Z;
//alphabetDictionary是一个类级字典,索引a-z,因此alphabetDictionary[“a”]=0和[“X”]=25
var currentIndexDict:Dictionary=new Dictionary;//Dictionary就像一个数组-只是为了快速搜索而索引-仅限于key&element
var searchArray:Array=新数组;
searchArray=currentArrayCollection.source;//currentArrayCollection是包含标题的对象的主数组。
var currentIndex:Number;//当前交互索引
var currentAlphaoIndex:Number=0;//字母表的当前索引
对于(currentIndex=0;currentIndexalphabetDictionary[alphabetArray[currentAlphabetIndex]]{
跟踪(标题标题标题+“-”+当前索引);
currentIndexDict[titleFirstLetter]=当前索引;
当前字母索引=数字(字母字典[titleFirstLetter]+1);
}
}
返回电流指数;
}
私有函数build_AlphacalArray():数组{
var-alphabetList:字符串;
alphabetList=“A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z”;
alphabetArray=新阵列;
alphabetArray=alphabetList.split(“.”);
返回字母数组;
}
私有函数build_alphabetDictionary():Dictionary{
var tmpAlphabetDictionary:Dictionary=新字典;
for(变量i:int=0;i
您可以迭代艺术家列表数据提供程序,并检查艺术家名称是否以列表2中选定的字母开头。找到相应的艺术家后,将艺术家列表所选索引设置为从迭代数据中获得的值。

Flex Spark列表有一个非常方便的方法,称为
确保索引可见(index)
。检查一下。您所要做的就是为相应的选定字母找到第一位艺术家的索引:

public function findAlphabetJumpIndex():Number
{
    var jumpToIndex:Number;
    var selectedLetter:String = alphabethList.selectedItem;
    for (var i:int=0; i < artists.length; i++)
    {
        var artistName:String = artists.getItemAt(i);
        var artistFirstLetter:String = artistName.toUpperCase().charAt(0);
        if (artistFirstLetter == selectedLetter)
        {
            jumpToIndex = i;
            break;
        }
    }
    return jumpToIndex;
}
公共函数findAlphabetJumpIndex():编号
{
var jumpToIndex:编号;
var selectedLetter:String=alphabethList.selectedItem;
for(变量i:int=0;i
如果您不想选择第一位艺术家,而是想定位到相应的字母,向下滚动一点,然后选择怎么办?我将添加此作为代码提示。祝你成为程序员好运!“你所要做的就是为相应的选定字母找到第一个艺术家的索引”-这是我遇到困难的部分。你会怎么做?谢谢弗拉基米尔,我也有同样的想法,这就是我现在正在使用的。我希望有一种不同的方法来实现这一点-一种不使用循环的方法,因为较长的列表可能会导致问题-不幸的是,这是在移动设备上。更快的方法是在加载艺术家时创建一个字典,然后通过字典检索艺术家索引。您建议订阅数组集合的集合\u更改事件以创建字典(很抱歉,我不知道dictionary类)?这是一个好主意-在每个集合上\u更改事件以更新字典。
public function findAlphabetJumpIndex():Number
{
    var jumpToIndex:Number;
    var selectedLetter:String = alphabethList.selectedItem;
    for (var i:int=0; i < artists.length; i++)
    {
        var artistName:String = artists.getItemAt(i);
        var artistFirstLetter:String = artistName.toUpperCase().charAt(0);
        if (artistFirstLetter == selectedLetter)
        {
            jumpToIndex = i;
            break;
        }
    }
    return jumpToIndex;
}