24

尝试从listView. 起初我addHeaderView()用来添加它,但是当我更改为另一个布局时,我希望它消失但removeHeaderView()不起作用......

我还尝试将可见性设置为 GONE 并且它不会消失......

我能做些什么?

提前致谢

4

7 回答 7

52

试试下面提到的方法..

AndroidListView#addHeaderViewListView#addFooterView方法很奇怪:您必须在设置 ListView 的适配器之前添加页眉和页脚视图,以便 ListView 可以考虑页眉和页脚——否则会出现异常。这里我们添加一个 ProgressBar(微调器)作为 headerView:

// spinner 是一个 ProgressBar

listView.addHeaderView(spinner);

我们希望能够随意显示和隐藏该微调器,但完全删除它是危险的,因为我们永远无法在不破坏 ListView 的情况下再次添加它——请记住,我们无法在添加 HeaderView 之后它是适配器:

listView.removeHeaderView(spinner); //dangerous!

所以让我们隐藏它!事实证明这也很难。只是隐藏微调器视图本身会导致一个空的但仍然可见的标题区域。

现在尝试隐藏微调器:

spinner.setVisibility(View.GONE);

结果:标题区域仍然可见,带有丑陋的空间:

解决方案是将进度条放在包装其内容的 LinearLayout 中,并隐藏内容。这样,当它的内容被隐藏时,包装的 LinearLayout 将折叠,导致 headerView 在技术上仍然存在,但 0dip 高:

<LinearLayout 
      xmlns:a="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content">
    <!-- simplified -->
      <ProgressBar
        android:id="@+id/spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/> 
  </LinearLayout>

然后,将布局设置为标题:

spinnerLayout = getLayoutInflater().inflate(R.layout.header_view_spinner, null);
listView.addHeaderView(spinnerLayout);

当我们需要隐藏它时,隐藏布局的内容,而不是布局:

spinnerLayout.findViewById(R.id.spinner).setVisibility(View.GONE);

现在标题从视图中消失了。顶部不再有丑陋的空间!

于 2012-11-28T11:37:47.697 回答
17

大多数人不喜欢使用AddHeaderView,但是我有时发现它非常方便,可以避免修改复杂的适配器,或者如果标题与它们不太相关。

通过这个简单的技巧,您将能够无缝地删除/添加标题

我添加一个空 LinearLayoutorientation vertical, 和 height wrap_content,作为唯一的 Header View (让我们mListView成为目标listView):

 LinearLayout mCustomHeaders=new LinearLayout(context);
 mCustomHeaders.setOrientation(LinearLayout.VERTICAL);

 mListView.addHeaderView(mCustomHeaders);
 mListView.setAdapter (.......)

然后,即使列表已满,我也可以在任何地方将随机内容添加到列表中作为标题:

 mCustomHeaders.add(myHeaderView1);
 mCustomHeaders.add(myHeaderView2);
 mCustomHeaders.add(myHeaderView3);

您还可以随时删除所有标题:

 mCustomHeaders.removeAllViews(); // will erase all headers

你明白了....希望它有所帮助!

于 2014-03-14T01:56:21.497 回答
5

问题是当你这样做时,你总是在创建一个新对象:

 View headerView = someView

所以新视图与已经添加为 listView 标题的视图不同,试试这个:

View headerView = inflater.inflate(R.layout.adapter_datatable_saleitem_header, null, false);
        headerView.setTag(this.getClass().getSimpleName() + "header");
        if (listView.getHeaderViewsCount() > 0) {
            View oldView = listView.findViewWithTag(this.getClass().getSimpleName() + "header");
            if (oldView != null) {
                listView.removeHeaderView(oldView);
            }
        }
于 2015-12-06T17:39:02.570 回答
4

您可以检查标头计数是否> 0,然后删除标头并再次添加。
它对我来说很好。

 View _headerView;
 private void function HandleHeaderView(){
        if(listView.getHeaderViewsCount() > 0)
        {
            listView.removeHeaderView(_headerView);
        }

        /* Add list view header */
        _headerView = GetHeaderView();
        listView.addHeaderView(_headerView);
 }


 private View GetHeaderView()
 {
      View header = getLayoutInflater().inflate(R.layout.header_layout, null);
      // TODO: ...

      return header
 }
于 2016-09-02T07:13:38.550 回答
1

我的标题视图在哪里drawerLogoView,这就是我所做的:

    drawerLogoView = mInflater.inflate(R.layout.navigation_drawer_custom_layout, null);
    mDrawerList.addHeaderView(drawerLogoView,null,false);                
    LinearLayout layOut = ((LinearLayout)drawerLogoView.findViewById(R.id.NavProfilePreviewLayout));
    layOut.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, 0));

这样,它就变得不可见了 :D 要显示它,你可以使用这个:

    LinearLayout layOut = ((LinearLayout)drawerLogoView.findViewById(R.id.NavProfilePreviewLayout));
    layOut.setLayoutParams(newRelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT));
于 2014-04-10T09:16:31.933 回答
0

如果您使用的是 addHeaderView(),那么之后您将无法删除您的标题。

所以,不要使用 addHeaderView()。相反,创建您自己的适配器,将您的主要视图名册与您的标题混合在一起。虽然我的 MergeAdapter 不会处理您的特定情况,但您可以使用它来查看混合多个行源的概念:

https://github.com/commonsguy/cwac-merge

于 2012-11-28T11:29:14.277 回答
0

我在一个稍微伪装的场景中遇到了这个问题:我正在处理的ListView来自PreferenceFragment,并且header代表了一个PreferenceCategory。因此,我设置 ListView 的自由受到了严重限制。但是有两种方法(部分受到此页面上其他答案的启发)。一种是向我的 PreferenceCategory 添加自定义布局(使用该类extends android.preference.PreferenceCategory,请参阅Custom PreferenceCategory Headings)。但我找到了一个更简单的解决方法:对于此 PreferenceCategory 中的第一个 Preference,我覆盖onCreateView()

@Override public View onCreateView(ViewGroup parent) {
    parent.setTop(-parent.getChildAt(0).getTop());
    return super.onCreateView(parent);
}
于 2015-02-17T17:53:55.363 回答