部分索引器获取位置 returns 0 的部分
section indexer get section for position returns 0
在我的项目中,我有 class 扩展 ArrayAdapter<String>
并实现 SectionIndexer
。在实现方法 getPositionForSection
和 getSectionForPosition
时,我发现了一些奇怪的行为。
为什么段索引器在 getSectionForPosition
returns 0 时正常工作?
public int getSectionForPosition(int position) {
return 0;
}
许多教程中都使用了此实现,例如:
http://androidopentutorials.com/android-listview-fastscroll/
http://www.survivingwithandroid.com/2012/12/android-listview-sectionindexer-fastscroll.html
文档说
Given a position within the adapter, returns the index of the
corresponding section within the array of section objects.
所以如果我的列表有 5 个以字母 "A" 开头的项目和一些以字母 "B" 开头的项目,那么 getSectionForPosition(5) 应该 return 1.
虽然 sectionIndexer
的基本功能(拉动滚动条滑块时滚动部分索引)不受影响,但在方法 getSectionForPosition
中返回常量可能会导致滚动条出现错误行为在列表中滑动时定位(例如,滚动条移出 y 轴上的 window)。
显然,这种不当行为仅在列表或单个部分超过特定长度时才会发生,因此对于较短的列表,索引器似乎可以正常工作(但实际上并非如此)。在上述方法中多次返回常量时,我在较大的列表中遇到了这种不当行为,并通过以正确的方式实现 getSectionForPosition
来修复它。
但是,由于其他人可能会对它感兴趣,所以我可以提供该方法的示例实现。让 azIndexer
成为一个 HashMap
包含我的索引的正确 section -> position
映射,并且 listItems
成为适配器安排的项目。下面构建一个 position -> sectionIndex
映射存储在 positionIndexer
.
List<Integer> values = new ArrayList();
for (int i : azIndexer.values()) {
values.add(i);
}
values.add(listItems.size()-1);
Collections.sort(values);
int k = 0;
int z = 0;
for(int i = 0; i < values.size()-1; i++) {
int temp = values.get(i+1);
do {
positionIndexer.put(k, z);
k++;
} while(k < temp);
z++;
}
然后将在 getSectionForPosition
方法中使用:
@Override
public int getSectionForPosition(int position) {
return positionIndexer.get(position);
}
您的回调方法 getPositionForSection(int section) 需要被实现,以将 setSelection 使用的正确位置提供给 return 您希望在触摸右侧的 SectionIndexer 时滚动的正确位置。
确保你这样做
this.setSelection(((SectionIndexer) getAdapter()) .getPositionForSection(currentPosition));
您需要实现两个回调方法
@Override
public Object[] getSections() {
Log.d("ListView", "Get sections");
String[] sectionsArr = new String[sections.length()];
for (int i=0; i < sections.length(); i++)
sectionsArr[i] = "" + sections.charAt(i);
return sectionsArr;
}
最后的回调和你在这里完成
@Override
public int getPositionForSection(int section){
Log.d("ListView", "Get position for section");
for (int i=0; i < this.getCount(); i++) {
String item = this.getItem(i).toLowerCase();
if (item.charAt(0) == sections.charAt(section))
return i;
}
return 0;
}
在我的项目中,我有 class 扩展 ArrayAdapter<String>
并实现 SectionIndexer
。在实现方法 getPositionForSection
和 getSectionForPosition
时,我发现了一些奇怪的行为。
为什么段索引器在 getSectionForPosition
returns 0 时正常工作?
public int getSectionForPosition(int position) {
return 0;
}
许多教程中都使用了此实现,例如:
http://androidopentutorials.com/android-listview-fastscroll/
http://www.survivingwithandroid.com/2012/12/android-listview-sectionindexer-fastscroll.html
文档说
Given a position within the adapter, returns the index of the corresponding section within the array of section objects.
所以如果我的列表有 5 个以字母 "A" 开头的项目和一些以字母 "B" 开头的项目,那么 getSectionForPosition(5) 应该 return 1.
虽然 sectionIndexer
的基本功能(拉动滚动条滑块时滚动部分索引)不受影响,但在方法 getSectionForPosition
中返回常量可能会导致滚动条出现错误行为在列表中滑动时定位(例如,滚动条移出 y 轴上的 window)。
显然,这种不当行为仅在列表或单个部分超过特定长度时才会发生,因此对于较短的列表,索引器似乎可以正常工作(但实际上并非如此)。在上述方法中多次返回常量时,我在较大的列表中遇到了这种不当行为,并通过以正确的方式实现 getSectionForPosition
来修复它。
但是,由于其他人可能会对它感兴趣,所以我可以提供该方法的示例实现。让 azIndexer
成为一个 HashMap
包含我的索引的正确 section -> position
映射,并且 listItems
成为适配器安排的项目。下面构建一个 position -> sectionIndex
映射存储在 positionIndexer
.
List<Integer> values = new ArrayList();
for (int i : azIndexer.values()) {
values.add(i);
}
values.add(listItems.size()-1);
Collections.sort(values);
int k = 0;
int z = 0;
for(int i = 0; i < values.size()-1; i++) {
int temp = values.get(i+1);
do {
positionIndexer.put(k, z);
k++;
} while(k < temp);
z++;
}
然后将在 getSectionForPosition
方法中使用:
@Override
public int getSectionForPosition(int position) {
return positionIndexer.get(position);
}
您的回调方法 getPositionForSection(int section) 需要被实现,以将 setSelection 使用的正确位置提供给 return 您希望在触摸右侧的 SectionIndexer 时滚动的正确位置。
确保你这样做
this.setSelection(((SectionIndexer) getAdapter()) .getPositionForSection(currentPosition));
您需要实现两个回调方法
@Override
public Object[] getSections() {
Log.d("ListView", "Get sections");
String[] sectionsArr = new String[sections.length()];
for (int i=0; i < sections.length(); i++)
sectionsArr[i] = "" + sections.charAt(i);
return sectionsArr;
}
最后的回调和你在这里完成
@Override
public int getPositionForSection(int section){
Log.d("ListView", "Get position for section");
for (int i=0; i < this.getCount(); i++) {
String item = this.getItem(i).toLowerCase();
if (item.charAt(0) == sections.charAt(section))
return i;
}
return 0;
}