gpt4 book ai didi

android - 部分 ListView header 的同步滚动

转载 作者:太空宇宙 更新时间:2023-11-03 10:21:51 25 4
gpt4 key购买 nike

这个问题非常具体,我正在尝试做的事情(使用 ListView )在以下文章中有非常详细的描述:http://www.pushing-pixels.org/2011/07/18/android-tips-and-tricks-synchronized-scrolling.html

感谢@kaushal trivedi 提供的链接

详细信息:我有一个正在处理的 android 应用程序,它使用带有自定义适配器的 ListView 。 ListView 包含一个非固定高度的自定义 header 。另请注意,列表项的高度也是可变的。我的目标是模仿最新的 gmail 应用程序中产生的效果(作为示例),当您查看电子邮件并滚动到标题时,它会粘在屏幕顶部操作栏的正下方,并且内容会继续显示在它下面滚动。我想做的是将标题的下半部分粘贴到屏幕顶部。

我最初的想法是创建一个固定在所需位置的不可见 View ,当用户滚动到或超过该位置时,使 View 可见。这个逻辑中的问题是我需要精确的像素滚动高度,经过多次尝试我确定很难做到。我遇到的确切问题是,从我收集到的信息中不可能检索 onScroll 事件中的像素级 Y 滚动,我只能检索 onScrollStateChanged 事件中的值。如上所述,这将无法实现所需的功能。

使用 onScroll 事件“int firstVisibleItem、int visibleItemCount、int totalItemCount”参数也不是一个选项,因为我想要“粘贴”的内容不是列表项的大小,而是列表项的一小部分可变高度标题的大小。

是否有正确的方法来实现这种效果?我目前的 minSDK 级别是 10。

13 年 10 月 10 日更新

我取得了一些进展。以下代码将我在屏幕上的 Y 位置 float View 与 ListView 同步。 b 是我作为示例设置的 View 。

注意:这用于 ListView 的 onScroll 事件中。

View c = view.getChildAt(0);
if (c != null) {
int currY = c.getTop();
int diffY = currY - lastY;

lastY = currY;
b.setTop(b.getTop() + diffY);
}

现在的问题是,正如我之前所说,我的列表的标题高度不固定。所以我需要获取标题的高度并将偏移量应用于“b”以将其放置在 float 在列表上方的列表标题的底部。

这是我迄今为止尝试过的代码。

 header.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

我们这里的问题 header.getMeasuredHeight(); 无论实际高度有多高,它总是解析为相同的值。

我知道在显示之前我无法获得高度。有没有一种方法可以获取该值并在渲染后设置偏移量?

13 年 10 月 11 日更新

我今天早上一醒来就回答了我的最后一个问题。

View.measure() 代码返回高度时。它似乎是 View 的默认高度,假设没有文本(最终会拉伸(stretch) View )。所以我使用下面的事件来监听 View 何时显示,然后记录它的实际高度(这与我希望的完全一样:))

ViewTreeObserver vto = header.getViewTreeObserver();      
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
b.setY(header.getMeasuredHeight() - 80); //80 is a temp offset
}
});

我马上就要上类了,由于我还没有完全达到预期的效果,所以我暂时不会将此标记为已回答。希望我能在接下来的一两天内坐下来完成这项工作。我仍然愿意接受有关更好的方法的建议。

最佳答案

好的,经过大量时间和研究,我找到了问题的答案。

首先,感谢@kaushal 提供此链接:http://www.pushing-pixels.org/2011/07/18/android-tips-and-tricks-synchronized-scrolling.html

我的解决方案最终变得有些复杂。因此,我没有尝试在这里描述它,而是制作了一个示例应用程序并将其发布在这里:https://github.com/gh123man/Partial-Header-ListView-Scroll-Sync

包含解决方案代码的特定文件在这里:https://github.com/gh123man/Partial-Header-ListView-Scroll-Sync/blob/master/src/com/example/partialheaderlistviewscrollsync/MainActivity.java

关于android - 部分 ListView header 的同步滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19275453/

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