在ListView中隐藏页脚视图?

时间:2010-11-30 19:40:28

标签: android listview

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

loadingView.setVisibility(View.GONE);

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

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

13 个答案:

答案 0 :(得分:84)

您可以在 addHeaderView()之后拨打addFooterView() / setAdapter() ,只要您至少调用其中一种方法即可。这是Google的一个相当糟糕的设计决定,所以我filed an issue。将其与removeFooterView()结合使用即可获得我的解决方案。

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

答案 1 :(得分:37)

尝试将页脚高度设置为0px或1px,然后再将其隐藏。或者,将页脚视图包裹在wrap_content高度FrameLayout中并隐藏/显示内部视图,使FrameLayout可见;高度应该适当包裹。

答案 2 :(得分:5)

在我的情况下,addFooterView / removeFooterView()导致一些文物。 我找到了其他解决方案。我使用FrameLayout作为FooterView。当我想添加Footer时,我调用了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();

答案 3 :(得分:4)

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

答案 4 :(得分:3)

在我的项目中运作良好:

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);

答案 5 :(得分:2)

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

android:layout_height="wrap_content" 
ViewGroup中的

包含"加载更多"按钮。不必是FrameLayout,请参阅下面的简单工作 - 使用LinearLayout的示例。

两个图像都显示一直滚动到底部的屏幕。第一个有一个可见的页脚,包裹着"加载更多"按钮。第二张图片显示,如果您将按钮的可见性设置为GONE,则页脚会崩溃。

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

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

listView with visible footer listView with footer gone

照常执行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"/>

答案 6 :(得分:2)

这应该是Android的错误。

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

你现在可以将视图设置为VISIBLE或GONE或其他东西,而不是父布局。它对我有用。

答案 7 :(得分:0)

使用

footer.removeAllViews();

这不会删除页脚但会冲洗孩子。 你再次不得不重新填充孩子。可以查看

footer.getChildCount()<2

答案 8 :(得分:0)

我还发现可以调用onContentChanged()(如果您使用ListActivity)强制重新创建ListView,如果我需要在HeaderView后添加setAdapter()打电话,但这是非常难看的黑客。

答案 9 :(得分:0)

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

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

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/helper/ListViewWithLoadingIndicatorHelper.java - Helper使得可以使用这些功能而无需从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。您可以直接使用此类或从中扩展。

答案 10 :(得分:0)

我有一个小的黑客方法来解决这个问题到处都是。 将列表视图和页脚视图(只是子布局)放在像LinnearLayout这样的父布局中,请记住listview下面的footerview。

控制器此页脚视图消失,可见性像正常视图。做完了!

答案 11 :(得分:0)

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

listView.addFooterView(Utils.b);

然后点击按钮,我删除了视图

listView.removeFooterView(Utils.b);

每当我遇到异步时,我都会添加页脚,而theus则没有重复的条目。我可以检查计数,所以就像这样,

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

答案 12 :(得分:-1)

如果要删除ListView中的页脚,请致电

listView.addFooterView(new View(yourContext)); 

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