Android:在ListView Scroll的顶部与ListView一起查看



我有一个listView,显然可以滚动。ListView包含一些表单问题。用户提交表单后,我们将类似邮票的自定义视图放在listView的顶部(并防止用户回答问题,但这并不重要)。

邮票应出现在ListView的顶部(如屏幕顶部),并且可以以与ListView相同的速度滚动,即,当最初在其下方的ListView项目消失时,它应该消失滚动时的屏幕。

任何想法如何实现?

我找到了一个解决方案。不确定它是否太优雅,但是它可以工作,所以除非有人提出更好的东西。

我想滚动与列表一起滚动的视图是自定义视图,必须了解列表视图。因此,我在其上实现了一个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在ListView中获得了精确的滚动位置,这是在列表视图中计算滚动位置的方式。

对于顶部屏幕的视图,您可以添加Headerview,因此将Coustom布局绑定为ListView的HeaderLayout ..因此,您的滚动与ListView相同...

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

相关内容

  • 没有找到相关文章

最新更新