Android ListView中headerview的動態(tài)顯示和隱藏的實(shí)現(xiàn)方法
Android ListView中headerview的動態(tài)顯示和隱藏的實(shí)現(xiàn)方法
1.動態(tài)設(shè)置headerview的方法
動態(tài)設(shè)置headerview有兩個(gè)思路。
方法一
將header的布局寫在list item的布局文件中,在adapter中通過判斷position的值是否為0動態(tài)控制其顯示或隱藏。
代碼示例:
item.xml布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/item_selector" android:gravity="center_vertical" android:orientation="vertical" > <include android:id="@+id/view_header" android:layout_width="fill_parent" android:layout_height="wrap_content" layout="@layout/view_header" android:visibility="gone" /> <LinearLayout android:id="@+id/view_item" android:layout_width="match_parent" android:layout_height="67dip" android:gravity="center_vertical" android:minHeight="?android:attr/listPreferredItemHeight" android:orientation="horizontal" > ... </LinearLayout> </LinearLayout>
item.xml中主要分為兩個(gè)部分,上面的view_header是頭header的布局,下面的view_item是普通item的布局,具體的布局內(nèi)容這里省略了。然后在 MyListViewAdapter.Java的getView方法中處理header的顯示問題,如果position為0,則顯示header,隱藏普通的item。如果position大于0,則隱藏header,隱藏普通item。
@Override public View getView(int position, View convertView, ViewGroup parent) ... if (position == 0) { holder.mHeader.setVisibility(View.VISIBLE); holder.mItem.setVisibility(View.GONE); initHeaderView(convertView); } else { holder.mItem.setVisibility(View.VISIBLE); holder.mHeader.setVisibility(View.GONE); initNormalView(convertView); } return convertView;
以此擴(kuò)展,若有兩鐘不同的headview,則新加一個(gè)判斷條件:
if (position == 0) { holder.mHeader.setVisibility(View.VISIBLE); holder.mHeader2.setVisibility(View.GONE); holder.mItem.setVisibility(View.GONE); initHeaderView(convertView); } else if(position == 1){ holder.mHeader.setVisibility(View.GONE); holder.mHeader2.setVisibility(View.VISIBLE); holder.mItem.setVisibility(View.GONE); initHeaderView2(convertView); }else { holder.mItem.setVisibility(View.VISIBLE); holder.mHeader.setVisibility(View.GONE); holder.mHeader2.setVisibility(View.GONE); initNormalView(convertView); }
方法二
使用listview提供的addHeaderView
為了動態(tài)顯示和隱藏header,按照慣例,誤以為直接通過setVisibility中的View.GONE就可以實(shí)現(xiàn)。但是在實(shí)際使用中發(fā)現(xiàn)并不是這樣的。例如:
private View mHeader; mHeader = LayoutInflater.from(this).inflate(R.layout.header, null); //加載footer的布局 mListView.addHeaderView(mHeader);
如果想動態(tài)隱藏這個(gè)header,慣性思維是直接設(shè)置header為gone:(其實(shí)這樣做是不對的)
mHeader.setVisibility(View.GONE); //隱藏header
實(shí)際上,直接設(shè)置GONE后,雖然元素是隱藏了,但是還是占用著那個(gè)區(qū)域,此時(shí)和View.INVISIBILE效果一樣。
解決辦法是,在header布局文件的最外層再套一層LinearLayout/RelativeLayout,這里稱為headerParent。隱藏時(shí)隱藏mHeader,而不是headerParent。
view_header.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mHeaderparent" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#FFFFFF" android:gravity="center" android:orientation="vertical" > <LinearLayout android:id="@+id/mHeader" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center"> ... </LinearLayout> </LinearLayout>
加載header和headerParent的布局:
MainActivity.java中關(guān)鍵代碼展示
private View mHeader; //header private View mHeaderParent; //header的最外面再套一層LinearLayout mHeaderParent = LayoutInflater.from(getActivity()).inflate(R.layout.headerparent_listview, null);//加載footerParent布局 mHeader = mHeaderParent.findViewById(R.id.header); listView.addHeaderView(mHeaderParent); //把mHeaderParent放到ListView當(dāng)中 mHeaderParent.setOnClickListener(MainActivity.this);
設(shè)置header為gone:(不是設(shè)置headerParent為gone)
mHeader.setVisibility(View.GONE);
該方法有一點(diǎn)需要注意的是:listView.addHeaderView()方法必須在setAdapter()方法前調(diào)用,否則就會拋異常。
ListView listView = xxxx; listView.addHeaderView(mHeaderParent); listView.setAdapter(adapter); mHeader.setVisibility(View.GONE);
以上兩種方法各有優(yōu)劣,個(gè)人傾向于第二種方法,第一種的耦合性太強(qiáng)了,并且由于將header布局與普通item布局合在一起,另外每次顯示時(shí)額外增加了一次position的條件判斷,在性能上有些額外的消耗。
2.引入headerview帶來的問題
當(dāng)引入headerview之后,可能會引起OnItemClickListener的position移位問題。
position通常是從0開始的,但是添加了HeaderView之后,position也會將HeaderView的數(shù)目計(jì)算進(jìn)去。
這里提供以下兩種解決辦法:
(1).手動計(jì)算真實(shí)的position位置:
final headerCount = 1; mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Item item = myAdapter.getItem(position - headerCount); } });
(2).ListView已經(jīng)為我們提供了數(shù)據(jù)的綁定:
mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Item item = parent.getAdapter().getItem(position); } });
如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- Android實(shí)現(xiàn)listview動態(tài)加載數(shù)據(jù)分頁的兩種方法
- android ListView內(nèi)數(shù)據(jù)的動態(tài)添加與刪除實(shí)例代碼
- android動態(tài)布局之動態(tài)加入TextView和ListView的方法
- Android實(shí)現(xiàn)Listview異步加載網(wǎng)絡(luò)圖片并動態(tài)更新的方法
- Android編程實(shí)現(xiàn)動態(tài)更新ListView的方法
- Android開發(fā)之利用ListView動態(tài)刷新某個(gè)Item
- Android listview動態(tài)加載列表項(xiàng)實(shí)現(xiàn)代碼
- Android實(shí)現(xiàn)ListView數(shù)據(jù)動態(tài)加載的方法
- Android通過Handler與AsyncTask兩種方式動態(tài)更新ListView(附源碼)
- Android ListView中動態(tài)顯示和隱藏Header&Footer的方法
- Android開發(fā)中Listview動態(tài)加載數(shù)據(jù)的方法示例
相關(guān)文章
Android 控件(button)對齊方法實(shí)現(xiàn)詳解
horizontal是讓所有的子元素按水平方向從左到右排列,vertical是讓所有的子元素按豎直方向從上到下排列,下面為大家介紹下控件(button)的對齊方法2013-06-06基于Android AppWidgetProvider的使用介紹
本篇文章小編為大家介紹,基于Android AppWidgetProvider的使用。需要的朋友參考下2013-04-04Android自定義Dialog實(shí)現(xiàn)加載對話框效果
這篇文章將介紹如何定制當(dāng)今主流的對話框,通過自定義dialog實(shí)現(xiàn)加載對話框效果,具體實(shí)現(xiàn)代碼大家通過本文學(xué)習(xí)吧2018-05-05使用Broadcast實(shí)現(xiàn)Android組件間的通信
這篇文章主要為大家詳細(xì)介紹了使用Broadcast實(shí)現(xiàn)Android組件間的通信,感興趣的小伙伴們可以參考一下2016-06-06android調(diào)用原生圖片裁剪后圖片尺寸縮放的解決方法
這篇文章主要為大家詳細(xì)介紹了android調(diào)用原生圖片裁剪后圖片尺寸縮放的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03深入了解Android中GestureDetector的定義與使用
Android中的GestureDetector?可以使用?MotionEvents?檢測各種手勢和事件,非常的好用。本文將會通過幾個(gè)具體的例子來講解一下GestureDetector的具體使用方法,需要的可以參考一下2023-01-01詳談Android中onTouch與onClick事件的關(guān)系(必看)
下面小編就為大家?guī)硪黄斦凙ndroid中onTouch與onClick事件的關(guān)系(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03Android工具類ImgUtil選擇相機(jī)和系統(tǒng)相冊
這篇文章主要為大家詳細(xì)介紹了Android工具類ImgUtil選擇相機(jī)和系統(tǒng)相冊,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10解決flutter 錯(cuò)誤: 程序包androidx.lifecycle不存在問題
這篇文章主要介紹了解決flutter 錯(cuò)誤: 程序包androidx.lifecycle不存在問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09