在 ListView 中隐藏页脚视图? ?

我有一个 ListView。它背后的数据是从互联网上获取的,每当用户滚动到底部时,就以10-30个项目的集合形式获取。为了表明它正在加载更多的项目,我使用 addFooterView()添加了一个简单的视图,其中显示了一个“ Loading...”消息和一个 spinner。现在,当我没有数据(没有更多的数据可以获取)时,我想隐藏这条消息。我试着这么做:

loadingView.setVisibility(View.GONE);

不幸的是,虽然这确实隐藏了视图,但却为它留下了空间。也就是说,我得到了一个很大的空白区域,而这个空白区域原来是“加载”信息。我怎样才能正确地隐藏这个视图呢?

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

39167 次浏览

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

Droid-Fu 库有一个类,设计用于加载页脚 show 和 hide: ListAdapterWithProgress

似乎您可以调用 addHeaderView()/addFooterView() 之后 setAdapter(),只要您至少调用其中一个方法一次 之前。这是一个相当糟糕的设计决定从谷歌,所以我 提交了一份文件。结合这与 removeFooterView()和你有我的解决方案。

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

二手货

footer.removeAllViews();

这不删除页脚,但冲洗儿童。 你又要重新繁殖孩子了,可以过来看看

footer.getChildCount()<2

我还发现,可以调用 onContentChanged()(如果你使用 ListActivity) ,以强制重新创建 ListView,如果我需要添加 HeaderView到他们后,setAdapter()调用,但它是非常丑陋的黑客。

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

listView.addFooterView(new View(yourContext));

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

我已经创建了一个 ListView 来处理这个问题。它还有一个选项,可以使用我创建的 Endless ScrollListener 来处理无穷无尽的列表视图,这个列表视图加载数据,直到没有更多的数据可以加载。

你可以在这里看到这些类:

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 - Listener that starts loading data when the user is about to reach the bottom of the ListView.

Https://github.com/cybereagle/openprojects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/view/simplelistviewwithloadingindicator.java - The EndlessListView. You can use this class directly or extend from it.

in my case addFooterView / removeFooterView() cause some artefacts. And I found other solution. I used FrameLayout as FooterView. And when I want to add Footer I called mFrameFooter.addView(myFooter); and mFrameFooter.removeAllViews(); for remove.

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

正如@YoniSamlan 指出的,它可以通过一种简单的方式实现

android:layout_height="wrap_content"

在包含“ LoadMore”按钮的 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"/>

它应该是 Android 的一个 bug。

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

您可以设置视图,但不是父布局,可见或消失或其他东西现在。对我有用。

我有小黑客的方式来解决这个问题的任何地方。 将 listview 和 footer 视图(只是子布局)放在父布局中,如 LinearLayout,记住 listview 下面的 footerview。

Controller this footer view gone and visibility like nomal view. And done!

在我的项目中效果很好:

1. 首先添加页脚视图

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

2. 设置能见度

SetVisiability (View.GONE) ; SetPadd (0,0,0,0) ;

3、设置隐形

SetVisiability (View.GONE) ; SetPadd (0,-1 * mFooterView.getHeight () ,0,0) ;

first I am adding my footer to the listview,like this

listView.addFooterView(Utils.b);

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

listView.removeFooterView(Utils.b);

我每次触发异步时都会添加页脚这样就不会有重复的条目了我还可以检查一下计数,就像这样,

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