2012-11-28 60 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 
}