【发布时间】:2013-10-09 14:51:53
【问题描述】:
这个问题非常具体,我正在尝试做的事情(使用列表视图)在下面的文章中进行了非常详细的描述:http://www.pushing-pixels.org/2011/07/18/android-tips-and-tricks-synchronized-scrolling.html
感谢@kaushal trivedi 提供链接
详情: 我有一个正在开发的 android 应用程序,它使用带有自定义适配器的列表视图。 Listview 包含一个非固定高度的自定义标题。另请注意,列表项的高度也是可变的。我的目标是模仿最新的 gmail 应用程序中产生的效果(例如),当您查看电子邮件并滚动到标题时,它会粘在操作栏下方的屏幕顶部,并且内容继续在它下面滚动。我想做的是将标题的下半部分粘贴到屏幕顶部。
我最初的推理是创建一个固定在所需位置的不可见视图,当用户滚动到或超过该位置时,使视图可见。这个逻辑中的问题是我需要精确的像素滚动高度,经过多次尝试,我确定很难做到。我遇到的确切问题是,不可能从我收集的内容中检索 onScroll 事件中的像素级 Y 滚动,我只能检索 onScrollStateChanged 事件中的值。如上所述,这将无法实现所需的功能。
使用 onScroll 事件“int firstVisibleItem, int visibleItemCount, int totalItemCount”参数也不是一个选项,因为我想要“粘贴”的内容不是列表项的大小,而是一小部分可变高度标题的大小。
有没有正确的方法来实现这个效果?我目前的 minSDK 等级是 10。
2013 年 10 月 10 日更新
我取得了一些进展。以下代码将我在屏幕上的 Y 位置浮动视图与列表视图同步。 b 是我作为示例设置的视图。
注意:这用于列表视图的onScroll 事件。
View c = view.getChildAt(0);
if (c != null) {
int currY = c.getTop();
int diffY = currY - lastY;
lastY = currY;
b.setTop(b.getTop() + diffY);
}
现在的问题是,正如我之前所说,我的 List 的标题是非固定高度。所以我需要获取标题的高度并将偏移量应用于“b”以将其放置在列表标题的底部浮动列表上方。
这是迄今为止我尝试过的代码。
header.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
无论实际高度有多高,我们header.getMeasuredHeight(); 的问题总是解决为相同的值。
我知道在显示之前我无法获得高度。有没有办法在渲染后获取该值并设置偏移量?
2013 年 10 月 11 日更新
我今天早上一醒来就回答了我的最后一个问题。
当View.measure() 代码返回一个高度时。假设没有文本(最终会拉伸视图),它似乎是视图的默认高度。所以我使用下面的事件来监听视图何时显示,然后记录它的实际高度(这完全符合我的希望:))
ViewTreeObserver vto = header.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
b.setY(header.getMeasuredHeight() - 80); //80 is a temp offset
}
});
我马上就要上班了,由于我还没有完全达到预期的效果,所以我不会将其标记为已回答。希望我能在接下来的一两天内坐下来完成这件事。我仍然愿意接受有关更好方法的建议。
【问题讨论】:
-
如果你从 listView 中删除这个标题视图并将它添加到一个封闭的 LinearLayout 中,整个实现将变得非常简单。
-
标题仍然需要随着列表视图滚动到一个点。你的建议还有可能吗?
-
看看这个链接可能对你有帮助。plus.google.com/u/0/+RomanNurik/posts/1Sb549FvpJt
-
感谢您的链接,这为研究打开了一些新的大门。还没解决,不过我有一些新的想法。