【问题标题】:Android: Make view on top of listview scroll together with the listviewAndroid:使列表视图顶部的视图与列表视图一起滚动
【发布时间】:2012-10-30 12:15:42
【问题描述】:

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

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

知道如何实现吗?

【问题讨论】:

    标签: android android-listview android-custom-view android-scroll


    【解决方案1】:

    我找到了解决方案。不确定它是否过于优雅,但它可以工作,所以除非有人想出更好的东西,否则它会离开它。

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

    【讨论】:

      【解决方案2】:

      对于顶部屏幕的视图,您可以添加 headerview,以便将自定义布局绑定为 listview 的 headerlayout..所以您的滚动与 listview 相同...

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

      【讨论】:

      • 您好,感谢您的回答。我需要将列表视图中的顶行“标记”,所以我不能将该视图放在标题中。
      • 你可以通过创建两个自定义布局和第一个 positon.bind 第一个布局和第二个布局来实现所有其余部分.. 所以你必须在数组中添加你在 baseadapter 中绑定的必要值跨度>
      • 问题是我不需要邮票出现在第一个位置的顶部。在我的列表中,行的高度可能不同,印章可能会超过前三个左右。
      • @SanketKachhela 感谢您的回答,我想在我的列表视图顶部添加一个图像视图和标题(文本视图),并且可以使用列表视图滚动。我在我的列表视图的标题中添加了两者,它就像魅力一样,你拯救了我的一天。
      • 如何通过 XML 做同样的事情?
      猜你喜欢
      • 1970-01-01
      • 2013-08-24
      • 1970-01-01
      • 2013-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-17
      相关资源
      最近更新 更多