2011-08-20 65 views
34

我已經看過很多教程,讓ListView在側面有字母(如聯繫人列表),但他們似乎都使用ListActivity類, /或來自數據庫的數據,而我只是使用ListView(無特殊活動)和數據的ArrayList。有誰知道我可以如何在我自己的ListView的聯繫人列表中實現字母滾動功能?如何在Android ListView上顯示字母字母

編輯再次

我跟着this tutorial,而且我認爲他將最終使其工作,但我仍然得到強制關閉。

class AlphabeticalAdapter extends ArrayAdapter<String> implements SectionIndexer 
{ 
    private HashMap<String, Integer> alphaIndexer; 
    private String[] sections; 

    public AlphabeticalAdapter(Context c, int resource, List<String> data) 
    { 
     super(c, resource, data); 
     for (int i = 0; i < data.size(); i++) 
     { 
      String s = data.get(i).substring(0, 1).toUpperCase(); 
      alphaIndexer.put(s, i); 
     } 

     Set<String> sectionLetters = alphaIndexer.keySet(); 
     ArrayList<String> sectionList = new ArrayList<String>(sectionLetters); 
     Collections.sort(sectionList); 
     sections = new String[sectionList.size()]; 
     sectionList.toArray(sections); 

    } 

    public int getPositionForSection(int section) 
    { 
     return alphaIndexer.get(sections[section]); 
    } 

    public int getSectionForPosition(int position) 
    { 
     return 1; 
    } 

    public Object[] getSections() 
    { 
     return sections; 
    } 
} 

在LogCat中,它表示java.lang.RuntimeException: Unable to resume activity {(package of another app I made) android.app.SuperNotCalledExcpetion。我認爲這很奇怪,因爲我並沒有在我正在使用的那個應用程序中引用其他應用程序。我試圖卸載其他應用程序,仍然強迫關閉,但我可以看到LogCat所說的內容,因爲它沒有更新。

最後編輯

這裏是工作的代碼。對不起,發佈了一些類似逾期9個月的內容。

class AlphabeticalAdapter extends ArrayAdapter<String> implements SectionIndexer 
{ 
    private HashMap<String, Integer> alphaIndexer; 
    private String[] sections; 

    public AlphabeticalAdapter(Context c, int resource, List<String> data) 
    { 
     super(c, resource, data); 
     alphaIndexer = new HashMap<String, Integer>(); 
     for (int i = 0; i < data.size(); i++) 
     { 
      String s = data.get(i).substring(0, 1).toUpperCase(); 
      if (!alphaIndexer.containsKey(s)) 
       alphaIndexer.put(s, i); 
     } 

     Set<String> sectionLetters = alphaIndexer.keySet(); 
     ArrayList<String> sectionList = new ArrayList<String>(sectionLetters); 
     Collections.sort(sectionList); 
     sections = new String[sectionList.size()]; 
     for (int i = 0; i < sectionList.size(); i++) 
      sections[i] = sectionList.get(i); 
    } 

    public int getPositionForSection(int section) 
    { 
     return alphaIndexer.get(sections[section]); 
    } 

    public int getSectionForPosition(int position) 
    { 
     for (int i = sections.length - 1; i >= 0; i--) { 
      if (position >= alphaIndexer.get(sections[ i ])) { 
       return i; 
      } 
     } 
     return 0; 
    } 

    public Object[] getSections() 
    { 
     return sections; 
    } 
} 

編輯:如果你希望你的滾動條出現在正確的地方,而你正在滾動getSectionForPosition是很重要的。僅返回1(或0)表示您只是在第一個(或第二個)部分中滾動,這將導致滾動條位置錯誤(大多數情況下不在屏幕上)。添加的代碼返回適當的部分,以便Scroller可以知道它的實際位置。

+0

是否有你不想使用ListActivity的原因?你能鏈接到你說的教程嗎? –

+0

substring(0,0)? –

+0

得到這個詞的第一個字母 –

回答

21

我忘了實例化alphaIndexer。現在完美運作。

class AlphabeticalAdapter extends ArrayAdapter<String> implements SectionIndexer 
{ 
    private HashMap<String, Integer> alphaIndexer; 
    private String[] sections; 

    public AlphabeticalAdapter(Context c, int resource, List<String> data) 
    { 
     super(c, resource, data); 
     alphaIndexer = new HashMap<String, Integer>(); 
     for (int i = 0; i < data.size(); i++) 
     { 
      String s = data.get(i).substring(0, 1).toUpperCase(); 
      if (!alphaIndexer.containsKey(s)) 
       alphaIndexer.put(s, i); 
     } 

     Set<String> sectionLetters = alphaIndexer.keySet(); 
     ArrayList<String> sectionList = new ArrayList<String>(sectionLetters); 
     Collections.sort(sectionList); 
     sections = new String[sectionList.size()]; 
     for (int i = 0; i < sectionList.size(); i++) 
      sections[i] = sectionList.get(i); 
    } 

    public int getPositionForSection(int section) 
    { 
     return alphaIndexer.get(sections[section]); 
    } 

    public int getSectionForPosition(int position) 
    { 
     return 1; 
    } 

    public Object[] getSections() 
    { 
     return sections; 
    } 
} 
+0

您能否添加最終的工作代碼? – akd

+0

@Pat:你好,我也想要最後的工作演示,如果你已經完成了。謝謝。 –

+0

@akdurmus對於長時間的延遲感到抱歉。 –

3

如果我理解正確,你想設置fastScrollEnabled=true,那會給你右邊的小拇指滾輪。如果你想添加一個像聯繫人那樣的浮動字母,List9.java中的APIDemos項目中有一個很好的例子(http://www.devdaily.com/java/jwarehouse/android-examples/platforms/android-2/samples/ApiDemos/src/com/example/android/apis/view/List9.java.shtml

+0

我認爲他們要求實際上看到A,B,C,類似於iPhone聯繫人列表UI。自定義滾動條窗口部件類型的東西。 –

+0

滾動期間有一個部分和一個可見的對話框。並且在ListView上將fastScrollEnabled設置爲true。 –