2013-02-01 80 views
3

我正在處理字典應用程序。我有一個快速滾動啓用列表視圖和實現SectionIndexer的適配器。當我與中國的字典工作,我有更多的部分則與西歐語言的工作,並有一個小問題時:ListView快速滾動條錯誤

,如果我停止快速滾動,雖然滾動條是可見的使用 默認滾動我開始「快速滾動滾動條」會立刻移動到 的另一個位置(頂部的某處),只有當我將幾乎得到 到列表的末尾時,它纔會開始移動到我的位置,同時速度也會提高很多 。

是否有這種行爲的原因?如果有什麼方法可以在使用默認滾動時隱藏快速滾動條(但不禁用快速滾動)?

+0

我發現這個bug類似於http://code.google.com/p/android/issues/detail?id=33293原因是getSectionForPosition&getPositionForSection方法的錯誤實現,但我根本不明白如何執行權利 – Lingviston

回答

0

以爲我會在這裏張貼,希望它不是太晚。

注意:這不是使用AlphabetIndexer,我不認爲使用三個集合來管理列表是一個好主意,雖然它很簡單,並解釋了這個概念。

下面是如何使用回調一個基本的例子:

public LinkedHashMap<Integer,String> sectionList = new LinkedHashMap<Integer,String>(); 
public HashMap<Integer,Integer> sectionPositions = new HashMap<Integer, Integer>(); 
public HashMap<Integer,Integer> positionsForSection = new HashMap<Integer, Integer>(); 

當你有你「位置」陣列(預購),這將創建三個包含HashMap跟蹤的東西,很簡單的實現,很容易閱讀:

if(locations != null && locations.size() > 0) { 
    //Iterate through the contacts, take the first letter, uppercase it, and use that as a key to reference the alphabetised list constructed above. 
    for(int i = 0; i < locations.size(); i++) { 
     String startchar =locations.get(i).getStartCharacterForAlphabet(); 

     if(startchar != null) { 
      if(sectionList.containsValue(startchar) == false) { 
       sectionList.put(Integer.valueOf(i),startchar); 
       positionsForSection.put(Integer.valueOf(sectionList.size() - 1), Integer.valueOf(i)); 
      } 
     } 

     sectionPositions.put(Integer.valueOf(i), sectionList.size() - 1); 
    } 
} 

這裏是三個回調:

@Override 
public int getPositionForSection(int section) { 
    return positionsForSection.get(Integer.valueOf(section)).intValue(); 
} 

@Override 
public MyLocation getItem(int position) { 
    if(locations.size() > position) { 
     return locations.get(position); 
    } 

    return null; 
} 

@Override 
public int getSectionForPosition(int position) { 
    return sectionPositions.get(Integer.valueOf(position)).intValue(); 
} 

希望它有幫助!