gpt4 book ai didi

android - FastScroller 只滚动回第一个元素,而不是标题 View

转载 作者:IT王子 更新时间:2023-10-28 23:32:02 24 4
gpt4 key购买 nike

我在 ListView 中启用了快速滚动,它有一个不可选择的 headerview。如果您向下滚动列表并将快速滚动拇指拖到顶部,则列表只会滚动回第一个元素,但不会滚动到标题 View 。拖动列表,按预期工作。

截图1:截图中的红色区域是标题 View 。
屏幕截图2:如果您将拇指拖到顶部,您只会到达第一个元素,并且标题 View 仍在上方。

ListView lv = (ListView) findViewById(R.id.listView);
lv.addHeaderView(getLayoutInflater().inflate(R.layout.view,null), null, false);

 

<ListView 
android:layout_height="fill_parent"
android:id="@+id/listView"
android:layout_width="fill_parent"
android:fastScrollEnabled="true"
></ListView>

我创建了一个演示项目: https://github.com/mikegr/fastscroll-bug

为什么拖动拇指不能滚动回顶部?

Red area is a header view dragging thumb does not go back to top

最佳答案

这是 FastScroller 的故意行为。当您在 ListView 上调用 setAdapter 时,如果设置了任何 header ,则适配器将包装在 HeaderViewListAdapter 中;这就是为什么您必须在 setAdapter 之前调用 addHeaderView。然后,在 FastScroller 代码中,我们看到:

    if (adapter instanceof HeaderViewListAdapter) {
mListOffset = ((HeaderViewListAdapter)adapter).getHeadersCount();
adapter = ((HeaderViewListAdapter)adapter).getWrappedAdapter();
}

即获取偏移量并使用底层适配器。 mListOffset 然后用于设置使用快速滚动条滚动到的顶部位置。那么这种包装实际上发生在哪里呢?正如预期的那样,直到 ListView.addHeaderView,我们看到:

    if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) {
mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter);
} else {
mAdapter = adapter;
}

所以我们肯定在寻找正确的地方。现在,听起来您的目标是不让您的快速拇指的列表标题具有偏移行为,而是有一个带有标题的普通列表。为此,(根据我们对代码的了解)有 FastScroller.mListOffset = 0 就足够了。这仅在 getSectionsFromIndexer 中设置,在 init 中无条件调用,并且仅在 mListAdapter == null 时有条件地在其他几个函数中调用。 mListAdapter 只有在 onSectionsChanged 被调用时才为 null,所以我们暂时忽略该路径。

经过大量挖掘,并使用各种反射钩子(Hook),我可以说没有办法做到这一点,甚至有点 future 兼容。您可以使用反射将 HeaderViewListAdapter 换成一个关于其标题计数等的;但这很脆弱。类似地,您可以将(包可见)FastScroller 子类化为具有您自己行为的一个;但是 mListOffset 被广泛引用,而不是通过 getter,所以这比平时更丑陋。基本上,您会遇到这样一个事实,即系统不能完全按照您想要的方式工作。

我不愿将此称为错误,因为从代码中可以清楚地看出这是故意的行为。您是否考虑过让列表的第一个元素只是一个特殊的第一个元素(如果需要记账,可能使用自定义 WrapperListAdapter 很像 HeaderViewListAdapter),而不是使用头机制?

关于android - FastScroller 只滚动回第一个元素,而不是标题 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7875899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com