Android:使位于ListView顶部的视图与ListView一起滚动

8
我有一个可滚动的listview。该listview包含一些表单问题。一旦用户提交表单,我们会在listview顶部放置一个类似邮戳的自定义视图(并阻止用户回答问题,但这里不重要)。
邮戳应出现在listview的顶部(即屏幕顶部),并且应以与listview相同的速度滚动,即当滚动时,它应在最初位于其下方的listview项消失在屏幕顶部时消失。
你有什么想法如何实现这个?
2个回答

6

我找到了一个解决方案。不确定它是否太优雅,但它能正常工作,所以除非有人提出更好的解决方案,否则我就保留它。

我想要与列表一起滚动的视图是自定义视图,它必须知道关于列表视图的信息。因此,我在自定义视图上实现了一个setListView(ListView listView)方法:

private int scrollY; //1
private Map<Integer, Integer> listViewItemHeights = new Hashtable<>();
public void setListView(final ListView listView) {
    listView.setOnScrollListener(new OnScrollListener() {  //2
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {} //3

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //4
            View c = listView.getChildAt(0);
            if (c != null) {
                int oldScrollY = scrollY;
                scrollY = -c.getTop();

                listViewItemHeights.put(listView.getFirstVisiblePosition(), c.getHeight());
                for (int i = 0; i < listView.getFirstVisiblePosition(); ++i) {
                    if (listViewItemHeights.get(i) != null)
                        scrollY += listViewItemHeights.get(i);
                }
                scrollBy(0, scrollY - oldScrollY);
            }
        }
    });
}

评论1:这是一个变量,它让我跟踪当前的滚动位置。

评论2:设置一个新的滚动监听器,以便让我的自定义视图知道列表何时滚动。

评论3:在这种情况下不需要实现此操作。

评论4:这就是魔法发生的地方。请注意,在最后,我通过scrollY - oldScrollY滚动了我的视图,让我从这一点开始解释。oldScrollY是保留的滚动位置,scrollY是新的滚动位置。我需要滚动它们之间的差异。至于如何计算scrollY,我参考了我的答案:Android getting exact scroll position in ListView,这是在列表视图中计算滚动位置的方法。


5

如果您想要在屏幕顶部显示视图,可以添加头视图,将自定义布局绑定为listview的头部布局。这样您就可以像滚动listview一样滚动了...

View headerview = ((LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.track_footer_view, null, false);
    listview.addHeaderView(headerview);

嗨,谢谢你的回答。我需要在ListView中将顶部行“盖章”,所以我不能将该视图放在标题中。 - Maria
你可以通过创建两个自定义布局来实现,在第一个位置绑定第一个布局,对于其余的则绑定第二个布局。因此,你需要在绑定到BaseAdapter中的数组中添加必要的值。 - Sanket Kachhela
问题是我不希望印章出现在第一个位置的顶部。我的列表中行的高度可能不同,印章可能会跨越前三个或更多位置。 - Maria
@SanketKachhela 感谢您的答案,我想在我的列表视图顶部添加一个imageView和标题(textView),并且可以与列表视图一起滚动。我将它们都添加到了我的列表视图头中,它像魅力一样工作,您救了我的一天。 - Ankit
如何通过XML执行相同的操作? - Shajeel Afzal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接