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.
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? –
substring (0, 0)? –
, aby uzyskać pierwszą literę słowa –