android fastScroll只覆盖部分列表吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (46)

在XML代码中(或者我可以用java来完成),我设置fastScrollEnabledtrue。这可以确保快速滚动。但快速滚动只能在列表的顶部显示。就像我可以使用fastscroll thumb bar滚动整个列表,但只能在滚动条的顶部部分中工作。这与整个列表不相称。我可以将拇指条拖动到列表的底部,但它不会滚动,因为listview它已经滚动到底部了,因为它的奇怪行为只能在列表的顶部工作。

提问于
用户回答回答于

这是快速滚动条中的一个错误。它不适合ExpandableListView

用户回答回答于

我刚刚发现了一种解决方法,以防止系统显示此错误行为。

有两种情况使用不同的代码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
    // ...
}

扫码关注云+社区