android - 部分 ListView header 的同步滚动

标签 android android-listview

这个问题非常具体,我正在尝试做的事情(使用 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/

相关文章:

android - 如何使用mobileservice从sql azure获取时间戳(行版本)到android

android - notifydataSetChanged更新ListView,必须要用runOnUiThread?

android - 无法在android的 ListView 中获取点击的行号

Android:如何测量 ListView 的总高度

android - 用户如何突出显示街道的一部分并将其上传到自定义 map 服务器?

android - 如何在 Android 中对齐表格内容

android - 发现多个文件具有独立于操作系统的路径 'lib/armeabi-v7a/libRSSupport.so'

android - 登录然后 ListView 的基本方法

android - 如何在 ListView 中显示来自mysql的多行数据?

android - ListView 将底行切成两半