我有一个实现expandable list activity
的班级
在XML代码中(或者我可以在java中执行),我将fastScrollEnabled
设置为true
。这样做可以实现快速滚动。但快速滚动仅适用于列表的顶部。就像我可以使用fastscroll拇指栏滚动整个列表,但只能在滚动条的顶部工作。它与整个列表不成比例。我可以将拇指栏拖动到列表的底部,但它不会滚动,因为listview
已经滚动到底部,因为它的奇怪行为只能在列表的顶部工作。
令我感到困惑的是,如果需要,我可以尝试澄清更多......
我实现了自定义BaseExpandableListAdapter.
答案 0 :(得分:5)
我刚刚找到一种解决方法来阻止系统显示这种错误的行为。
有两种方案使用不同的代码使SectionIndexer
起作用。
第一种情况是您使用FastScrollbar-Thumb导航到下一部分。假设这些组是您的部分,实现SectionIndexer
的覆盖方法将如下所示:
@Override
public int getPositionForSection(int section) {
return section;
}
// Gets called when scrolling the list manually
@Override
public int getSectionForPosition(int position) {
return ExpandableListView.getPackedPositionGroup(
expandableListView
.getExpandableListPosition(position));
}
第二种情况是您手动滚动列表并且快速滚动条根据部分而不是所有项目移动。因此代码如下:
@Override
public int getPositionForSection(int section) {
return expandableListView.getFlatListPosition(
ExpandableListView.getPackedPositionForGroup(section));
}
// Gets called when scrolling the list manually
@Override
public int getSectionForPosition(int position) {
return ExpandableListView.getPackedPositionGroup(
expandableListView
.getExpandableListPosition(position));
}
正如人们可以看到,如果没有进一步采用,这两种行为就无法发挥作用。
使其兼顾的解决方法是在有人每手滚动(即通过触摸滚动)时捕捉到这种情况。这可以通过使用适配器类实现OnScrollListener
接口并将其设置为ExpandableListView
来完成:
public class MyExpandableListAdapter extends BaseExpandableListAdapter
implements SectionIndexer, AbsListView.OnScrollListener {
// Your fields here
// ...
private final ExpandableListView expandableListView;
private boolean manualScroll;
public MyExpandableListAdapter(ExpandableListView expandableListView
/* Your other arguments */) {
this.expandableListView = expandableListView;
this.expandableListView.setOnScrollListener(this);
// Other initializations
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
this.manualScroll = scrollState == SCROLL_STATE_TOUCH_SCROLL;
}
@Override
public void onScroll(AbsListView view,
int firstVisibleItem,
int visibleItemCount,
int totalItemCount) {}
@Override
public int getPositionForSection(int section) {
if (manualScroll) {
return section;
} else {
return expandableListView.getFlatListPosition(
ExpandableListView.getPackedPositionForGroup(section));
}
}
// Gets called when scrolling the list manually
@Override
public int getSectionForPosition(int position) {
return ExpandableListView.getPackedPositionGroup(
expandableListView
.getExpandableListPosition(position));
}
// Your other methods
// ...
}
为我修复了这个错误。
答案 1 :(得分:1)