部分ListView标头的同步滚动

时间:2013-10-09 14:51:54

标签: android android-listview

这个问题非常具体,我在下面的文章中详细介绍了我要做的事情(列表视图):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.

更新10/10/13

我取得了一些进展。以下代码将我在屏幕上的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();的问题始终会解析为相同的值。

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

更新10/11/13

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

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

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

我必须尽快去上班,因为我还没有完全达到预期的效果,我不会将此标记为已回答。希望我能在第二天或第二天坐下来完成这项任务。我仍然愿意接受有关更好的方法的建议。

1 个答案:

答案 0 :(得分:2)

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

首先,谢谢@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