2011-10-04 62 views
0

希望這很容易,但有時這意味着它在flex中不可能,我已經搜索了一些無濟於事。滾動到列表中的字母表(ArrayCollection dataProvider)(字母跳轉)

說我有一個表(表#1)的藝術家:

2Pac的 阿黛爾 艾蜜蕊 碧昂絲 傑森·奧爾德恩 夏奇拉 的Trews

我也有一個表(表#2)具有值#,AZ - 我將如何創建字母跳轉?

因此,如果用戶點擊LIST#2中的「A」,它將自動滾動到LIST#1頂部的「Adele」 - 不過濾,因此他/她可以向上滾動查看2Pac或向下查看提示他們是否還沒有看到。

它是一個標準的Flex Spark List,帶有一個ArrayCollection作爲dataProvider - 藝術家字段被稱爲:「title」以及用戶不可見的唯一id字段。

謝謝!

請查看關於標記答案的評論,以便在某些情況下可能會更快速地查找字典。請參見下面的代碼(未證實ITS更快請測試!):

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(); 
     } 

回答

1

Flex Spark列表有一個非常方便的方法,稱爲ensureIndexIsVisible(index)。檢查Flex reference documentation。所有你需要做的就是找到第一個藝術家對所選擇的相應字母開頭索引:

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

「你所要做的就是找到相應的選定字母的第一位藝術家的索引」 - 這是我遇到困難的部分。這將如何呢? –

+0

謝謝弗拉基米爾,我有同樣的想法,現在正在使用它。我希望有一種不同的方法來解決這個問題 - 一個沒有使用循環的長列表可能會導致一個問題 - 這是在移動設備上不幸的。 –

+0

更快的方法是在加載藝術家時創建一個字典,然後通過字典檢索藝術家索引。 –

0

可以遍歷您的藝術家列表數據提供商,並檢查藝術家的名字用拼音選擇從列表中有兩個開始。找到相應的藝術家時,將藝術家列表選定索引設置爲您從迭代數據中獲得的值。

+0

如果你不想得到的第一個選中的藝術家,而是獲得定位到相應的字母開頭,向下滾動一下,然後選擇? –

+0

如果它的成千上萬的項目,那麼它將需要一段時間... –

+0

我將此作爲代碼提示添加。祝你成爲一名程序員! –