国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android ListView中headerview的動態顯示和隱藏的實現方法

2019-10-22 18:29:43
字體:
來源:轉載
供稿:網友

Android ListView中headerview的動態顯示和隱藏的實現方法

1.動態設置headerview的方法

動態設置headerview有兩個思路。

方法一

將header的布局寫在list item的布局文件中,在adapter中通過判斷position的值是否為0動態控制其顯示或隱藏。

代碼示例:

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中主要分為兩個部分,上面的view_header是頭header的布局,下面的view_item是普通item的布局,具體的布局內容這里省略了。然后在 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;

以此擴展,若有兩鐘不同的headview,則新加一個判斷條件:

 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

為了動態顯示和隱藏header,按照慣例,誤以為直接通過setVisibility中的View.GONE就可以實現。但是在實際使用中發現并不是這樣的。例如:

private View mHeader;mHeader = LayoutInflater.from(this).inflate(R.layout.header, null); //加載footer的布局mListView.addHeaderView(mHeader);

如果想動態隱藏這個header,慣性思維是直接設置header為gone:(其實這樣做是不對的)

mHeader.setVisibility(View.GONE); //隱藏header

實際上,直接設置GONE后,雖然元素是隱藏了,但是還是占用著那個區域,此時和View.INVISIBILE效果一樣。

解決辦法是,在header布局文件的最外層再套一層LinearLayout/RelativeLayout,這里稱為headerParent。隱藏時隱藏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中關鍵代碼展示

private View mHeader; //headerprivate View mHeaderParent; //header的最外面再套一層LinearLayoutmHeaderParent = LayoutInflater.from(getActivity()).inflate(R.layout.headerparent_listview, null);//加載footerParent布局mHeader = mHeaderParent.findViewById(R.id.header);listView.addHeaderView(mHeaderParent); //把mHeaderParent放到ListView當中mHeaderParent.setOnClickListener(MainActivity.this); 

設置header為gone:(不是設置headerParent為gone)

mHeader.setVisibility(View.GONE);

該方法有一點需要注意的是:listView.addHeaderView()方法必須在setAdapter()方法前調用,否則就會拋異常。

ListView listView = xxxx;  listView.addHeaderView(mHeaderParent);  listView.setAdapter(adapter);  mHeader.setVisibility(View.GONE);

以上兩種方法各有優劣,個人傾向于第二種方法,第一種的耦合性太強了,并且由于將header布局與普通item布局合在一起,另外每次顯示時額外增加了一次position的條件判斷,在性能上有些額外的消耗。

2.引入headerview帶來的問題

當引入headerview之后,可能會引起OnItemClickListener的position移位問題。

position通常是從0開始的,但是添加了HeaderView之后,position也會將HeaderView的數目計算進去。

這里提供以下兩種解決辦法:

(1).手動計算真實的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已經為我們提供了數據的綁定:

mListView.setOnItemClickListener(new OnItemClickListener() {  @Override  public void onItemClick(AdapterView<?> parent, View view,      int position, long id) {    Item item = parent.getAdapter().getItem(position);  }});

 如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宣化县| 东丽区| 钟祥市| 金阳县| 天祝| 虎林市| 永靖县| 岳池县| 龙山县| 山西省| 巴南区| 万载县| 中超| 时尚| 葫芦岛市| 盐城市| 平乐县| 虞城县| 天长市| 都安| 吉隆县| 赫章县| 兰西县| 伊吾县| 南丰县| 华容县| 平利县| 九江市| 云梦县| 平阴县| 奉贤区| 临武县| 浦东新区| 长岛县| 右玉县| 壶关县| 沙河市| 吉水县| 甘谷县| 逊克县| 安丘市|