- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我在 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
为什么拖动拇指不能滚动回顶部?
最佳答案
这是 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/
是否可以将 fastScroll 设置在左侧而不是右侧?喜欢这里:http://smartphoneblogging.com/wp-content/gallery/asus-eeepad-transf
我有一个 ListView,我需要始终启用 FastScroll 的可见性。问题是,当列表项 很少(比如只有 2 或 3)并且很容易显示在屏幕上时,显然它们无法滚动。但是 FastScroll 仍在屏
我有一个实现可扩展列表 Activity 的类。 在 XML 代码中(或者我可以在 java 中完成),我将 fastScrollEnabled 设置为 true。这确实可以实现快速滚动。但快速滚动仅
左侧图像 - 这是我需要的 Fast Scroll Thumb(小)尺寸。 右图 - 这是我得到的尺寸(非常大)。 MyFragment.xml style.xml @
我想为我的历史列表使用 FastScroll 并为部分使用日期,但是警报对话框(显示联系人中的字母)不会拉伸(stretch)以适应文本的大小(我想在那里显示月份和日期)。 如何调整它的大小? 最佳答
我在 ListView 中启用了快速滚动,它有一个不可选择的 headerview。如果您向下滚动列表并将快速滚动拇指拖到顶部,则列表只会滚动回第一个元素,但不会滚动到标题 View 。拖动列表,按预
我有一个 ListView,左侧有图像,中间有标题和副标题,右侧有一个 ImageButton(此按钮右侧没有任何边距)。 我为此 ListView 启用了快速滚动。当我尝试单击右侧的 ImageB
我创建了一个使用 FastScroll 的 ListView。 (见图片)当用户单击以下任何按钮(即所有轨道、艺术家、专辑)时,每次调用以下自定义 ArrayAdater ArrayAdapter a
请帮助我在这 2 天里感到震惊。我想在联系人应用程序/下图中实现一个带有 fastscroll 和 albhabet 索引器的 ListView。我正在使用 SimpleAdapter 来填充 Lis
我的应用程序全部采用橙色主题,但 ScrollBar/FastScroll 显示为绿色。我尝试了很多搜索,但找不到任何方法来改变这一点。它只是保持原样。 我找到了一个“android:fastScro
我想在联系人应用程序中实现一个带有 fastscroll 和 albhabet 索引器的 ListView。我正在使用 SimpleAdapter 来填充 ListView。从图中可以看出,通过从右侧
我创建了自己的适配器 - 实现 ListAdapter。我在 XML 中检查了 fastScrollEnabled:android:fastScrollEnabled="true"。 但是,当绘制列表
我是一名优秀的程序员,十分优秀!