Android:在列表视图的顶部创建视图并与列表视图一起滚动

我有一个明显可滚动的列表视图.列表视图包含一些表单问题.一旦用户提交表单,我们就会在列表视图的顶部放置一个类似邮票的自定义视图(并阻止用户回答问题,但这并不重要).

标记应显示在列表视图的顶部(如屏幕顶部),并且可以与列表视图相同的速度滚动,即当最初位于其下方的列表视图项目消失在屏幕顶部时,它应该消失.滚动.

知道怎么做到这一点?

最佳答案
我找到了解决方案.不确定它是否太优雅,但它的工作原理会离开它,除非有人提出更好的东西.

我想与列表一起滚动的视图是一个自定义视图,它必须知道列表视图.所以我在它上面实现了一个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,它是如何在列表视图中计算滚动位置.

转载注明原文:Android:在列表视图的顶部创建视图并与列表视图一起滚动 - 代码日志