在ListView中隐藏页脚视图?

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

 loadingView.setVisibility(View.GONE); 

不幸的是,虽然这确实隐藏了这个观点,但它留下了空间。 即我结束了一个大的空白处,“加载”消息曾经是。 我怎样才能正确地隐藏这个观点呢?

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

看来你可以在addFooterView() 之后调用addHeaderView() / addFooterView() setAdapter() ,只要你至less调用一次这些方法之一。 这是Google的一个相当差的devise决定,所以我提出了一个问题 。 结合这个removeFooterView() ,你有我的解决scheme。

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

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

在我的情况下addFooterView / removeFooterView()导致一些文物。 而我find了其他解决scheme。 我使用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(); 

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

在我的项目中运作良好:

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

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

 android:layout_height="wrap_content" 

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

这两个图像显示一直滚动到底部的屏幕。 首先有一个可见的页脚,围绕“加载更多”button。 第二张图片显示,如果将button的可见性设置为“通过”,则页脚会崩溃。

您可以通过更改可见性再次显示页脚(在某个callback中):

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

listView与可见页脚listView与页脚走了

像往常一样执行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的错误。

您不需要dynamic删除或添加页脚视图。 您只需要创build一个未指定的高度父布局(或者从XML文件充气或编程创build它),然后添加您要隐藏或显示您的视图。

而且你可以设置视图,但不是父级布局,可见或无效或其他现在。 这个对我有用。

当你想要删除ListView中的页脚只需调用

 listView.addFooterView(new View(yourContext)); 

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

用过的

 footer.removeAllViews(); 

这并不删除页脚,但冲刷小孩。 你再次必须重新填充儿童。 可以通过检查

 footer.getChildCount()<2 

我也发现可能调用onContentChanged() (如果您使用ListActivity )强制重新创buildListView如果我需要在setAdapter()调用后添加HeaderView给他们,但它是非常丑陋的黑客。

我已经创build了一个处理这个ListView。 它还可以select使用我创build的EndlessScrollListener来处理无尽的列表视图,该列表视图会加载数据,直到没有更多的数据加载。

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

https://github.com/Cyber​​Eagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/helper/ListViewWithLoadingIndicatorHelper.java – 帮手,使之有可能使用没有从SimpleListViewWithLoadingIndicator扩展的function。

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

https://github.com/Cyber​​Eagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/view/SimpleListViewWithLoadingIndicator.java – EndlessListView。 你可以直接使用这个类,或者直接使用这个类。

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

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

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

 listView.addFooterView(Utils.b); 

然后点击button,我删除了视图,

 listView.removeFooterView(Utils.b); 

每当我打到asynchronous时,我都会添加页脚,而且他们没有重复的input。我可以检查计数,所以就像这样,

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