如何在Android ListView的一侧显示字母
我已经看了很多教程,使一个ListView在侧面(如联系人列表)上有字母字母,但他们似乎都使用ListActivity类和/或数据库中的数据,而我只是使用ListView(没有特殊的Activity)和一个数据的ArrayList。 有谁知道我可以如何在我自己的ListView的联系人列表中实现字母滚动function?
再次编辑
我遵循这个教程 ,我认为这个教程终于可以实现,但是我仍然被迫closures。
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
。 我觉得这真的很奇怪,因为我没有在那个我正在使用的应用程序中引用其他应用程序。 我试图卸载其他应用程序,仍然强迫closures,但我可以看到什么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可以知道它的实际位置。
我忘了实例化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; } }
如果我正确理解你,你想设置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 )