在ListView中隐藏页脚视图?


78

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

loadingView.setVisibility(View.GONE);

不幸的是,尽管它确实隐藏了视图,但为它留下了空间。也就是说,我最后有一个很大的空白,以前是“正在加载”消息的地方。我该如何正确隐藏此视图?

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

Answers:


84

看来你被允许的呼叫addHeaderView()/addFooterView() setAdapter()只要你调用这些方法至少一次一个之前。Google做出的设计决定相当糟糕,因此我提了一个问题。结合使用removeFooterView(),您将得到我的解决方案。

我获得的其他两个答案+1,它们是有效的(而且可能更正确)解决方案。我的是最简单的,我喜欢简单,因此我将自己的回答标记为已接受。


6
这似乎不适用于标题。我可以在setAdapter之后添加页脚,但不能添加页眉。
cottonBallPaws 2010年

1
+1可节省巨大的头痛。我想知道我要花多长时间才能确定在设置适配器之前必须添加页脚。(哑巴)
Ross Hambrick

我注意到,当您删除底部滚动条时,滚动位置将重置,因此,当您滚动过度时->在完成滚动结束之前便已删除页脚,它会跳回到列表的末尾。你碰到这个吗?
Vadim Peretokin 2012年

没关系,我遇到了与littleFluffyKitty一样的问题。必须使用自定义适配器。
Vadim Peretokin

好答案,简单!+100向Google提交问题。
Tomasz 2012年

37

隐藏页脚之前,尝试将其高度设置为0px或1px。或者,将页脚视图包装在wrap_content高处,FrameLayout然后隐藏/显示内部视图,从而保持FrameLayout可见状态;然后高度应正确包裹。


您如何强制设置视图的高度?我尝试了setMinimumHeight(0); 隐藏之前,但似乎不起作用。我已将其设置为GONE,但单元格的空间仍然留着。
莫里斯

height和width是布局参数,因此必须使用新的width / height为视图设置LayoutParameters对象。看到这样的答案:stackoverflow.com/a/2767142/59058。基本上,宽度,高度和边距是真正适用于视图容器的属性,而不是视图本身,因此您可以使用父链接的LayoutParameter对象来定义它们。
Yoni Samlan

我认为这不适用于标题,我在附加的标题为getLayoutParams()的标题上为null。
Vadim Peretokin

5

在我的情况下,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

在我的项目中效果很好:

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


2

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

android:layout_height="wrap_content" 

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

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

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

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"/>


2

这应该是Android的错误。

您无需动态删除或添加页脚视图。您只需要创建一个未指定高度的父级Layout(从xml文件中对其进行充气或以编程方式创建它),然后添加要隐藏或显示在其中的视图即可。

现在,您可以将视图(而不是父布局)设置为VISIBLE或GONE或其他。这个对我有用。


0

用过的

footer.removeAllViews();

这不会删除页脚,但会冲洗子级。您再次必须重新填充孩子。可以检查

footer.getChildCount()<2

0

我还发现,如果需要在调用后添加到它们中,可以调用onContentChanged()(如果使用ListActivity)来强制重新创建,但这是非常难看的技巧。ListViewHeaderViewsetAdapter()


0

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

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

https://github.com/Cyber​​Eagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/helper/ListViewWithLoadingIndicatorHelper.java 帮助程序可以使用功能没有扩展自SimpleListViewWithLoadingIndicator。

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 。您可以直接使用此类或从其扩展。


0

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

控制器此页脚视图不见了,可见性像正常视图一样。并做了!


0

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

listView.addFooterView(Utils.b);

然后在按钮上单击,删除视图,

listView.removeFooterView(Utils.b);

每当我碰到异步时,我都会添加页脚,因此这里没有重复的条目。我也可以检查计数,所以就这样,

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

-1

当您只想在ListView调用中删除页脚时

listView.addFooterView(new View(yourContext)); 

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


1
文档说:“如果多次调用addFooterView,则视图将按照添加顺序出现。”
max4ever 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.