2011-08-20 10 views
34

Przyjrzałem się wielu samouczkom, aby listy miały alfabetyczne litery na boku (jak lista kontaktów), ale wszystkie zdają się używać klasy ListActivity i/lub dane z bazy danych, gdy używam tylko ListView (bez specjalnej aktywności) i ArrayList danych. Czy ktoś wie, w jaki sposób mogę zaimplementować tę funkcję alfabetycznego przewijania na liście kontaktów dla mojego własnego ListView?Jak wyświetlać listy alfabetyczne na stronie Android ListView

Edited Ponownie

Śledziłem this tutorial, co myślałem, że wreszcie to działało, ale nadal jestem coraz zmuszony blisko.

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

W kamerze LogCat jest napisane: java.lang.RuntimeException: Unable to resume activity {(package of another app I made) android.app.SuperNotCalledExcpetion. Myślałem, że to było naprawdę dziwne, ponieważ nie odwołuję się do tej innej aplikacji w tej, z którą pracuję. Próbowałem odinstalować tę inną aplikację, nadal mam wymuszone zamknięcie, ale mogłem zobaczyć, co powiedział LogCat, ponieważ nie zaktualizowano.

Finał Edit

Oto kod roboczych. Przepraszamy za opublikowanie czegoś takiego jak 9 miesięcy opóźnienia.

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

Edit: getSectionForPosition jest ważne, jeśli chcesz, aby Twój scroller pojawiają się w odpowiednim miejscu podczas przewijania. Zwrócenie tylko 1 (lub 0) mówi, że przewijasz tylko w pierwszej (lub drugiej) sekcji, która spowoduje niewłaściwą pozycję wałka (w większości wychodzi z ekranu). Dodany kod zwraca odpowiednią sekcję, aby scroller mógł się dowiedzieć, gdzie faktycznie jest.

+0

Czy istnieje powód, dla którego nie chcesz używać ListActivity? Czy możesz utworzyć link do samouczków, o których mówisz? –

+0

substring (0, 0)? –

+0

, aby uzyskać pierwszą literę słowa –

Odpowiedz

21

Zapomniałem utworzyć instancję alphaIndexer. Działa teraz idealnie.

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

Czy możesz dodać końcowy działający kod, proszę? – akd

+0

@Pat: Witam, chcę też, aby ostatnia robocza wersja demonstracyjna została ukończona. Dzięki. –

+0

@akdurmus przepraszam za długie opóźnienie. –

3

Jeśli dobrze Cię rozumiem, chcesz ustawić fastScrollEnabled=true, a to da ci mały kciuk po prawej stronie. Jeśli chcesz dodać pływającą literę, taką jak ta w kontaktach, jest świetny przykład w projekcie APIDemos w List9.java (http://www.devdaily.com/java/jwarehouse/android-examples/platforms/android-2/samples/ApiDemos/src/com/example/android/apis/view/List9.java.shtml)

+0

Myślę, że oni proszą o faktycznie widząc A, B, C, itp., podobnie jak w interfejsie użytkownika listy kontaktów na telefonie iPhone. Niestandardowy typ widgetu paska przewijania. –

+0

Podczas przewijania istnieje sekcja i widoczne okno dialogowe. A fastScrollEnabled jest ustawione na true w ListView. –

Powiązane problemy