我有ListView
。当用户一直滚动到底部时,它背后的数据是从10到30个项目的互联网中获取的。为了表明它正在加载更多项目,我使用addFooterView()
添加了一个显示“正在加载...”消息和一个微调器的简单视图。现在,当我没有数据(没有更多数据要提取)时,我想要隐藏该消息。我试着这样做:
loadingView.setVisibility(View.GONE);
不幸的是,虽然这确实隐藏了视图,但它为它留下了空间。即我最终得到一个空白区域,其中“加载”消息曾经是。我怎样才能正确隐藏这个视图?
我无法使用removeFooterView()
因为我可能需要再次显示它,在这种情况下我无法再次调用addFooterView()
,因为ListView
上已经设置了适配器,设置适配器后,您无法呼叫addHeaderView()
/ addFooterView()
。
答案 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初始化
// 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));
它将添加一个虚拟空视图,它不会保留任何空间