【问题标题】:Synchronous scrolling of a partial ListView Header部分 ListView Header 的同步滚动
【发布时间】: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
  • 感谢您的链接,这为研究打开了一些新的大门。还没解决,不过我有一些新的想法。

标签: android android-listview


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    相关资源
    最近更新 更多