Выделите алфавит в списке (ArrayCollection dataProvider) (переход по алфавиту) - PullRequest
0 голосов
/ 04 октября 2011

Надеюсь, это легко, но иногда это означает, что во флексах это невозможно, и я довольно долго искал, но безрезультатно.

Скажем, у меня есть список (СПИСОК № 1) исполнителей:

2Pac Adele Amerie Beyonce Jason Aldean Shakira The Trews

У меня также есть список (LIST # 2) со значениями #, AZ - как мне создать алфавитный переход?

Так что еслипользователь щелкнул «A» в СПИСОКЕ № 2, который автоматически прокрутил бы до «Адель» в верхней части СПИСКА № 1 - не фильтровать, поэтому он / она может прокручивать вверх, чтобы просмотреть 2Pac, или вниз, чтобы просмотреть The Tews, если они не были впока нет.

Это стандартный список Spark Flex с ArrayCollection в качестве dataProvider - поле исполнителя называется: "title" вместе с уникальным полем id, которое невидимо для пользователя.

Спасибо!

Пожалуйста, смотрите комментарии к ответу маркера для обсуждения словаря, которое может быть быстрее в некоторых случаях.Ниже приведен код (НЕ ПОДТВЕРЖДАЕТСЯ ЕГО БЫСТРО! ПОЖАЛУЙСТА, ТЕСТ):

private function alphabet_listChange(evt:IndexChangeEvent) : void {
            var letter:String;
            letter = evt.currentTarget.selectedItems[0].toString();
            trace(currentDictionary[letter]);
            ui_lstLibraryList.ensureIndexIsVisible(currentDictionary[letter]);
        }

        public function createAlphabetJumpDictionary() : Dictionary {

            //alphabetArray is a class level array containing, A-Z;
            //alphabetDictionary is a class level dictionary that indexes A-z so alphabetDictionary["A"] = 0 and ["X"] = 25

            var currentIndexDict:Dictionary = new Dictionary; //Dictionary is like an array - just indexed for quick searches - limited to key & element

            var searchArray:Array = new Array;
            searchArray = currentArrayCollection.source; //currentArrayCollection is the main array of objects that contains the titles.

            var currentIndex:Number; //Current index of interation
            var currentAlphabetIndex:Number = 0; //Current index of alphabet

            for (currentIndex = 0; currentIndex < searchArray.length; currentIndex++) {

                var titleFirstLetter:String = searchArray[currentIndex].title.toString().toUpperCase().charAt(0);

                if (titleFirstLetter == alphabetArray[currentAlphabetIndex]) {
                    currentIndexDict[titleFirstLetter] = currentIndex;
                    trace(titleFirstLetter + " - " + currentIndex);
                    currentAlphabetIndex++;
                } else if (alphabetDictionary[titleFirstLetter] > alphabetDictionary[alphabetArray[currentAlphabetIndex]]) {
                    trace(titleFirstLetter + " - " + currentIndex);
                    currentIndexDict[titleFirstLetter] = currentIndex;
                    currentAlphabetIndex = Number(alphabetDictionary[titleFirstLetter] + 1);
                }
            }

            return currentIndexDict;
        }

        private function build_alphabeticalArray() : Array {
            var alphabetList:String;
            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 = new Array;
            alphabetArray = alphabetList.split(".");
            return alphabetArray;
        }

        private function build_alphabetDictionary() : Dictionary {              
            var tmpAlphabetDictionary:Dictionary = new Dictionary;
            for (var i:int=0; i < alphabetArray.length; i++) {
                tmpAlphabetDictionary[alphabetArray[i]] = i;
                trace(alphabetArray[i] + " - " + i);
            }
            return tmpAlphabetDictionary;
        }

        private function buildCurrentDictionary() : void {
            trace("Collection Changed");
            currentDictionary = new Dictionary;
            currentDictionary = createAlphabetJumpDictionary();
        }

Ответы [ 2 ]

1 голос
/ 04 октября 2011

В списке Flex Spark есть очень удобный метод, который называется ensureIndexIsVisible(index).Обратитесь к справочной документации Flex .Все, что вам нужно сделать, это найти индекс первого исполнителя для соответствующей выбранной буквы алфавита:

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;
}
0 голосов
/ 04 октября 2011

Вы можете перебрать свой провайдер данных из списка исполнителей и проверить, начинается ли имя исполнителя с выбранного алфавита из второго списка.Когда соответствующий исполнитель найден, задайте для индекса выбранного списка исполнителей значение, которое вы получаете при переборе данных.

...