2012-11-28 52 views
20

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

我也尝试设置可见性去,它不会消失...

我该怎么办?

在此先感谢

回答

0

如果您正在使用addHeaderView(),你不能在这之后删除你的头。

所以,不要使用addHeaderView()。相反,创建您自己的适配器,将您主要的Views视图与您的标题混合。虽然我的 MergeAdapter将无法处理您的具体情况,你可以用它来查看 的混合多行源的概念:

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

+0

可以删除头视图如果你有一个变量指向头,看到此链接:http://stackoverflow.com/a/39286390/1817569 – Hamid

48

试试下述方法..

的Android ListView#addHeaderViewListView#addFooterView方法很奇怪:在设置ListView的适配器之前,必须添加页眉和页脚视图,以便ListView可以考虑页眉和页脚 - 否则将会发生异常。在这里,我们添加一个进度条(微调)作为headerView:

//微调是一个进度条

listView.addHeaderView(spinner); 

我们希望能够显示和隐藏微调的意愿,但删除它完全是危险的,因为我们从来没有能够在不破坏ListView中再次添加它 - 记住,我们不能addHeaderView我们已经经过它的适配器:

listView.removeHeaderView(spinner); //dangerous! 

让我们躲吧!结果也很难。只隐藏微调器视图本身会产生一个空的,但仍然可见的标题区域。

现在试图隐藏微调:

spinner.setVisibility(View.GONE); 

结果:头区域仍然有一个丑陋的空间可见:

解决的办法是把进度在LinearLayout中包含它的内容,并隐藏内容。这样,当它的内容是隐藏的,导致headerView在技术上仍然存在包装的LinearLayout会崩溃,但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); 

现在标题从视图中消失。顶部没有更多丑陋的空间!

+2

+1太棒了 - 我 – Dori

+0

伟大的伟大工程工作,伟大的方式来解释整个过程。 –

+0

额外公斤脑的男人 – Sayka

14

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

有了这个简单的技巧,你就能无缝删除/添加页眉

我添加一个空LinearLayoutorientation vertical和高度wrap_content,作为唯一的标题视图(让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 

你的想法....希望它可以帮助!

+0

这非常有效。 –

1

哪里drawerLogoView是我headerview,这里是我做的:

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

我遇到这个问题在一个稍微伪装的场景中:我所处理的ListView来自PreferenceFragment,并且头部表示PreferenceCategory。所以,我设置ListView的自由受到严重限制。但有两种方法(部分受到本页其他答案的启发)。一种方法是将自定义布局添加到我的PreferenceCategory中(使用extends android.preference.PreferenceCategory的类,请参阅Custom PreferenceCategory Headings)。但是,我发现了一个更简单的解决方法:在这个PreferenceCategory第一选择,我重写onCreateView()

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

的问题是,你总是创建一个新的对象,当你做:

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

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