【问题标题】:Hide footer view in ListView?在 ListView 中隐藏页脚视图?
【发布时间】:2010-11-30 19:40:27
【问题描述】:

我有一个ListView。它背后的数据是从互联网上获取的,每当用户一直滚动到底部时,都会以 10-30 项为一组。为了表明它正在加载更多项目,我使用addFooterView() 添加了一个简单的视图,该视图显示了“正在加载...”消息和一个微调器。现在,当我没有数据(没有更多数据要获取)时,我想隐藏该消息。我试着做:

loadingView.setVisibility(View.GONE);

不幸的是,虽然这确实隐藏了视图,但它为它留出了空间。 IE。我最终得到了一个很大的空白空间,其中“正在加载”消息曾经是。我怎样才能正确地隐藏这个视图?

我不能使用removeFooterView(),因为我可能需要再次显示它,在这种情况下我不能再次调用addFooterView(),因为ListView上已经设置了一个适配器,你不能设置适配器后调用addHeaderView()/addFooterView()

【问题讨论】:

    标签: android listview


    【解决方案1】:

    您似乎可以调用addHeaderView() / addFooterView() after setAdapter(),只要您before至少调用其中一种方法。这是谷歌的一个相当糟糕的设计决定,所以我filed an issue。将此与removeFooterView() 结合起来,您就有了我的解决方案。

    +1 对于我得到的其他两个答案,它们是有效的(并且可以说是更正确的)解决方案。然而,我的答案是最简单的,而且我喜欢简单,所以我会将自己的答案标记为已接受。

    【讨论】:

    • 这似乎不适用于标题。我可以在 setAdapter 之后添加页脚,但不能添加页眉。
    • +1 用于节省巨大的头痛。我想知道我需要多长时间才能弄清楚您必须在设置适配器之前添加页脚。 (哑)
    • 我注意到当你移除底部的滚动位置时,滚动位置会被重置,所以当你过度滚动时 -> 在完成过度滚动之前删除页脚,它会跳回到列表的末尾.你遇到过这个吗?
    • 没关系,我遇到了和 littleFluffyKitty 一样的问题。将不得不使用自定义适配器。
    • 很好的答案,简单! +100 向 Google 提交问题。
    【解决方案2】:

    在隐藏之前尝试将页脚的高度设置为 0px 或 1px。或者,将页脚视图包裹在wrap_content 高度FrameLayout 中并隐藏/显示内部视图,使FrameLayout 可见;那么高度应该正确包装。

    【讨论】:

    • 如何强制设置视图的高度?我试过 setMinimumHeight(0);在隐藏之前,但似乎不起作用。我已将其设置为 GONE,但仍保留单元格的空间。
    • 高度和宽度是布局参数,因此您必须为具有新宽度/高度的视图设置 LayoutParameters 对象。请参阅此 SO 答案:stackoverflow.com/a/2767142/59058。基本上,宽度、高度和边距是真正适用于视图容器的属性,而不是视图本身,因此您使用父链接的 LayoutParameter 对象来定义它们。
    • 我认为这不适用于标头,我在附加的标头上获得了 null 并调用了 getLayoutParams()。
    【解决方案3】:

    在我的情况下 addFooterView / removeFooterView() 会导致一些伪影。 我找到了其他解决方案。我使用 FrameLayout 作为 FooterView。当我想添加页脚时,我调用了 mFrameFooter.addView(myFooter);和 mFrameFooter.removeAllViews();删除。

    FrameLayout frameLayout = new FrameLayout(this);
    listView.addFooterView(frameLayout);
    ......
    ......
    //For adding footerView
    frameLayout.removeAllViews();
    frameLayout.addView(mFooterView);
    //For hide FooterView
    frameLayout.removeAllViews();
    

    【讨论】:

    • 像魅力一样工作。这应该是公认的答案:)
    【解决方案4】:

    Droid-Fu 库有一个设计用于显示和隐藏加载页脚的类:ListAdapterWithProgress

    【讨论】:

    • 有一个用法示例,这个答案会获得更多的选票。
    【解决方案5】:

    在我的项目中运行良好:

    1.先添加页脚视图

    mListView.addFooterView(mFooterView); mListView.setAdapter(mAdapter);

    2.设置可见性

    mFooterView.setVisibility(View.GONE); mFooterView.setPadding(0, 0, 0, 0);

    3.设置隐身

    mFooterView.setVisibility(View.GONE); mFooterView.setPadding(0, -1*mFooterView.getHeight(), 0, 0);

    【讨论】:

      【解决方案6】:

      正如@YoniSamlan 指出的那样,它可以通过简单的方式实现。你必须指定

      android:layout_height="wrap_content" 
      

      在包含“加载更多”按钮的 ViewGroup 中。不必是 FrameLayout,请参见下面的使用 LinearLayout 的简单工作示例。

      两张图片都显示了一个一直滚动到底部的屏幕。第一个有一个可见的页脚,围绕“加载更多”按钮。第二张图片显示,如果您将按钮的可见性设置为 GONE,则页脚会折叠。

      您可以通过更改可见性再次显示页脚(在一些回调中):

      loadMore.setVisibility(View.VISIBLE);  // set to View.GONE to hide it again
      

      照常执行listView初始化

          // Find View, set empty View if needed
          mListView = (ListView) root.findViewById(R.id.reservations_search_results);
          mListView.setEmptyView(root.findViewById(R.id.search_reservations_list_empty));
      
          // Instantiate footerView using a LayoutInflater and add to listView
          footerView = ((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE))
                  .inflate(R.layout.load_more_footer_view, null, false);
          // additionally, find the "load more button" inside the footer view
          loadMore = footerView.findViewById(R.id.load_more);
          loadMore.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View view) {
                  fetchData();
              }
          });
      
          // add footer view to the list
          mListView.addFooterView(footerView);
      
          // after we're done setting the footerView, we can setAdapter
          adapter = new ReservationsArrayAdapter(getActivity(), R.layout.list_item_reservations_search, reservationsList);
          mListView.setAdapter(adapter);
      

      load_more_footer_view.xml

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="wrap_content">
      
      <Button
          android:id="@+id/load_more"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:layout_margin="9dp"
          android:gravity="center"
          android:layout_gravity="center"
          android:background="@drawable/transparent_white_border"
          android:textColor="@android:color/white"
          android:text="@string/LOAD_MORE"/>
      

      【讨论】:

        【解决方案7】:

        应该是安卓的bug。

        您无需动态删除或添加页脚视图。您只需要创建一个未指定高度的父布局(从 xml 文件膨胀它或以编程方式创建它),然后添加您想要隐藏或显示的视图。

        您现在可以将视图设置为 VISIBLE 或 GONE 或其他内容,但不能设置父布局。它对我有用。

        【讨论】:

          【解决方案8】:

          二手

          footer.removeAllViews();
          

          这不会删除页脚,但会刷新子项。 您再次必须重新填充孩子。可以查看

          footer.getChildCount()<2
          

          【讨论】:

            【解决方案9】:

            我还发现可以调用onContentChanged()(如果您使用ListActivity)来强制重新创建ListView,如果我需要在setAdapter() 调用之后添加HeaderView 给他们,但这是非常丑陋的hack。

            【讨论】:

              【解决方案10】:

              我创建了一个 ListView 来处理这个问题。它还可以选择使用我创建的 EndlessScrollListener 来处理无限列表视图,它会加载数据直到没有更多数据要加载。

              您可以在此处查看这些课程:

              https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/helper/ListViewWithLoadingIndicatorHelper.java - 无需从 SimpleListViewWithLoadingIndicator 扩展即可使用功能的帮助器。

              https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/listener/EndlessScrollListener.java - 当用户即将到达 ListView 底部时开始加载数据的侦听器。

              https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/view/SimpleListViewWithLoadingIndicator.java - EndlessListView。你可以直接使用这个类,也可以从它扩展。

              【讨论】:

                【解决方案11】:

                我有一个小技巧可以在任何地方解决这个问题。 将 listview 和 footer view(只是子布局)放在父布局中,如 LinnearLayout,记住 listview 下面的 footerview。

                控制器这个页脚视图消失了,可见性就像普通视图一样。完成了!

                【讨论】:

                  【解决方案12】:

                  首先我将页脚添加到列表视图中,像这样

                  listView.addFooterView(Utils.b);
                  

                  然后单击按钮,我删除视图,

                  listView.removeFooterView(Utils.b);
                  

                  我每次点击异步时都会添加页脚,而且我们没有重复的条目。我也可以检查计数,就像这样,

                  if(listView.getFooterViewsCount() > 0){//if footer is added already do something}
                  

                  【讨论】:

                    【解决方案13】:

                    当您想删除ListView 中的页脚时,只需调用

                    listView.addFooterView(new View(yourContext)); 
                    

                    它将添加一个不会保留任何空间的虚拟空视图

                    【讨论】:

                    • 文档说“如果 addFooterView 被多次调用,视图将按照它们添加的顺序出现。”
                    猜你喜欢
                    • 1970-01-01
                    • 2012-07-11
                    • 2011-10-13
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-02-06
                    • 1970-01-01
                    • 2015-03-21
                    相关资源
                    最近更新 更多