需求:根據某種需要,可能需要動態調整listview的頁首頁尾,譬如將header作為顯示板使用。
痛點:listView.addHeaderView()方法必須在setAdapter()方法前調用,否則就會拋異常。至於為什麼會拋異常,查看下ListView的原始碼即可發現。因此,在設定HeaderView之後又想將headerView移除或者隱藏,則需要繞很大的彎子:將adapter儲存起來-移除headerView-(或者更換headerview)-再將adapter設定上去。
隱藏headerview思路:使用View.GONE屬性進行隱藏
嘗試1.itemView結構如下:
<LinearLayout android:id="@+id/item_root" android:layout_width="fill_parent" android:layout_height="50dip" android:orientation="vertical" ><TextView android:id="@+id/tv_1" /><TextView android:id="@+id/tv_2" /></LinearLayout >
此時,有如下邏輯:
ListView listView = xxxx; listView.addHearderView(item_root); listView.setAdapter(adapter); adapter.add(xxxxx);添加資料 item_root.setVisibility(View.GONE);
按道理,最後一句應該可以起到隱藏headerView的目的,但實際效果(魅族MX上測試發現),item_root的地方的確沒有控制項了,但item_root佔用的50dip高度還在,即原來headerView的地方變成了一片空白地區!和View.INVISIBILE效果一樣了,汗死!
繼續嘗試如下,修改itemView的結構:
<LinearLayout android:id="@+id/item_root" android:layout_width="fill_parent" android:layout_height="50dip" android:orientation="vertical" > <LinearLayout android:id="@+id/item_container"<TextView android:id="@+id/tv_1" /><TextView android:id="@+id/tv_2" /> </LinearLayout></LinearLayout >
此結構較之前的結構增加了一個多餘的Layout(item_container)來囊括item內部控制項。此時,如果在item_container .setVisibility(View.GONE)則可以完美實現隱藏HeaderView的目的!
結論:View.GONE屬性貌似不作用在根Layout上。
結論:View.GONE屬性貌似不作用在根Layout上。
新的問題:
如果在item_root上使用了Shape背景,且此背景存在MinSize,那麼此方法又失效了。。。
規避處理:如果的確必須要在HeaderView上添加背景background的話,那麼請將background設定在item_container上吧,不要設定在item_root上,如此就可以規避新的問題了。
sam:在4.0中測試,可直接通過動態removeHeaderView和addHeaderView來動態設定表頭,但在2.2中則會報錯,所以為了使程式能有通用性,只能使用以上這種折衷的辦法。
轉自:http://blog.sina.com.cn/s/blog_70b9730f01014sgm.html