ListView 添加 HeaderView常見錯誤


1.addHeaderView異常:

最近在做通訊錄開發時使用ListView,發現一個奇怪的問題:當添加一個ImageView 作為HeaderView時,發現ImageView長寬始終是1:1的大小,即調用 ListView.addHeaderView(mImageView) 之后mImageView尺寸布局被忽略。具體代碼如下:

list_view_header_layout.xml

<?xml version="1.0" encoding="utf-8"?>  
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="wrap_content"  
    android:scaleType="fitCenter"  
    android:src="@drawable/ruanjianguanli_banner" >  
</ImageView>  

java

mImageView = (ImageView)LayoutInflater.from(mContext).inflate(R.layout.list_view_header_layout, null);  
mListView.addHeaderView(mImageView); 

上面的調用方式會使XML布局中ImageView的LayoutParam丟失,調用 ListView.addHeaderView(mImageView) 之后mImageView尺寸布局被忽略

修改為如下方式調用,則不會丟失LayoutParam

mImageView = (ImageView)LayoutInflater.from(mContext).inflate(R.layout.list_view_header_layout, mListView, false);  
mListView.addHeaderView(mImageView);  

 

2.LayoutInflater的inflate()函數的用法:

View view = inflate(int resource, ViewGroup root, boolean attachToRoot)   
resource:布局文件ID   
root:父ViewGroup對象,   
attachToRoot:是否將“渲染”出來的View添加到上面的root中   

root和attachToRoot是共同作用的: 
1,有root,同時attachToRoot為false,那么inflate()返回的就是“翻譯”得到的view 
2,有root,同時attachToRoot為true,那么inflate()就是將“翻譯”得到的view添加到root后,然后返回root 
3,無root,同時attachToRoot為false,那么inflate()返回的就是“翻譯”得到的view
4,無root,同時attachToRoot為true,報錯

root還有一個重要的作用就是為“渲染”得到的view添加合適的LayoutParam,並且如果並不想將得到的View添加到root的話

1. View view = mLayoutInflater.inflate(R.layout.header, new ListView(mContext), false);  
2. View view = mLayoutInflater.inflate(R.layout.header, new LinearLayout(mContext), false);  
3. View view = mLayoutInflater.inflate(R.layout.header, new RelativeLayout(mContext), false);  

上面得到的View,除了view的LayoutParam分別為AbsListView.LayoutParams,LinearLayout.LayoutParams,RelativeLayout.LayoutParams之外,內容都一致。  

  

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM