从listView中删除标题

我在尝试从listView删除标题时遇到了一些问题。 起初我使用addHeaderView()来添加它,但是当我改为另一个布局时我希望它消失但removeHeaderView()不起作用……

我也试过设置GONE的可见性,但它并没有消失……

我能做什么?

提前致谢

尝试下面提到的方法..

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

// spinner是一个ProgressBar

 listView.addHeaderView(spinner); 

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

 listView.removeHeaderView(spinner); //dangerous! 

所以,让我们隐藏吧! 结果certificate这也很难。 只是隐藏微调器视图本身会导致一个空的但仍然可见的标题区域。

现在尝试隐藏微调器:

 spinner.setVisibility(View.GONE); 

结果:标题区域仍然可见,空间很大:

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

     

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

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

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

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

现在标题从视图中消失了。 顶部没有更难看的空间!

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

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

我添加了一个空的LinearLayout ,其orientation vertical ,高度wrap_content ,作为唯一的Header View(让mListView成为目标listView ):

  LinearLayout mCustomHeaders=new LinearLayout(context); mCustomHeaders.setOrientation(LinearLayout.VERTICAL); mListView.addHeaderView(mCustomHeaders); mListView.setAdapter (.......) 

Thenafter,我可以在任何地方随机添加随机内容作为标题,即使列表已满:

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

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

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

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

问题是,当您执行以下操作时,始终要创建新对象:

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

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

您可以检查标头计数是否> 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 } 

如果您使用的是addHeaderView(),则无法在此之后删除标题。

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

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

我在稍微伪装的情况下遇到了这个问题:我正在处理的ListView来自PreferenceFragment,标题代表一个PreferenceCategory。 因此,我设置ListView的自由受到严重限制。 但有两种方法(部分受到本页其他答案的启发)。 一种是将自定义布局添加到我的PreferenceCategory(使用extends android.preference.PreferenceCategory的类,请参阅自定义PreferenceCategory标题 )。 但我find了一个更简单的解决方法:对于此PreferenceCategory中的第一个Preference,我重写onCreateView()

 @Override public View onCreateView(ViewGroup parent) { parent.setTop(-parent.getChildAt(0).getTop()); return super.onCreateView(parent); }