1. 程式人生 > >Android LayoutInflater深度解析 給你帶來全新的認識

Android LayoutInflater深度解析 給你帶來全新的認識

本文出自:http://blog.csdn.net/lmj623565791/article/details/38171465

1、 題外話

相信大家對LayoutInflate都不陌生,特別在ListView的Adapter的getView方法中基本都會出現,使用inflate方法去載入一個佈局,用於ListView的每個Item的佈局。Inflate有三個引數,我在初學Android的時候這麼理解的:

對於Inflate的三個引數(int resource, ViewGroup root, boolean attachToRoot)

如果inflate(layoutId, null )則layoutId的最外層的控制元件的寬高是沒有效果的

如果inflate(layoutId, root, false ) 則認為和上面效果是一樣的

如果inflate(layoutId, root, true ) 則認為這樣的話layoutId的最外層控制元件的寬高才能正常顯示

如果你也這麼認為,那麼你有就必要好好閱讀這篇文章,因為這篇文章首先會驗證上面的理解是錯誤的,然後從原始碼角度去解釋,最後會從ViewGroup與View的角度去解釋。

2、 實踐是驗證真理的唯一標準

下面我寫一個特別常見的例子來驗證上面的理解是錯誤的,一個特別簡單的ListView,每個Item中放一個按鈕:

Activity的佈局檔案:

[html]  view plain  copy   在CODE上檢視程式碼片 派生到我的程式碼片
  1. <ListView xmlns:android="http://schemas.android.com/apk/res/android"  
  2. xmlns:tools="http://schemas.android.com/tools"  
  3. android:id="@+id/id_listview"  
  4. android:layout_width="fill_parent"  
  5. android:layout_height="wrap_content" >  
  6. </ListView>  
ListView的Item的佈局檔案:

[html]  view plain  copy   在CODE上檢視程式碼片 派生到我的程式碼片
  1. <Button xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:id="@+id/id_btn"  
  4.     android:layout_width="120dp"  
  5.     android:layout_height="120dp" >  
  6.   
  7. </Button>  

ListView的介面卡:

[java]  view plain  copy   在CODE上檢視程式碼片 派生到我的程式碼片
  1. package com.example.zhy_layoutinflater;  
  2.   
  3. import java.util.List;  
  4.   
  5. import android.content.Context;  
  6. import android.view.LayoutInflater;  
  7. import android.view.View;  
  8. import android.view.ViewGroup;  
  9. import android.widget.BaseAdapter;  
  10. import android.widget.Button;  
  11.   
  12. public class MyAdapter extends BaseAdapter  
  13. {  
  14.   
  15.     private LayoutInflater mInflater;  
  16.     private List<String> mDatas;  
  17.   
  18.     public MyAdapter(Context context, List<String> datas)  
  19.     {  
  20.         mInflater = LayoutInflater.from(context);  
  21.         mDatas = datas;  
  22.     }  
  23.   
  24.     @Override  
  25.     public int getCount()  
  26.     {  
  27.         return mDatas.size();  
  28.     }  
  29.   
  30.     @Override  
  31.     public Object getItem(int position)  
  32.     {  
  33.         return mDatas.get(position);  
  34.     }  
  35.   
  36.     @Override  
  37.     public long getItemId(int position)  
  38.     {  
  39.         return position;  
  40.     }  
  41.   
  42.     @Override  
  43.     public View getView(int position, View convertView, ViewGroup parent)  
  44.     {  
  45.   
  46.         ViewHolder holder = null;  
  47.         if (convertView == null)  
  48.         {  
  49.             holder = new ViewHolder();  
  50.             convertView = mInflater.inflate(R.layout.item, null);  
  51. //          convertView = mInflater.inflate(R.layout.item, parent ,false);  
  52. //          convertView = mInflater.inflate(R.layout.item, parent ,true);  
  53.             holder.mBtn = (Button) convertView.findViewById(R.id.id_btn);  
  54.             convertView.setTag(holder);  
  55.         } else  
  56.         {  
  57.             holder = (ViewHolder) convertView.getTag();  
  58.         }  
  59.   
  60.         holder.mBtn.setText(mDatas.get(position));  
  61.   
  62.         return convertView;  
  63.     }  
  64.   
  65.     private final class ViewHolder  
  66.     {  
  67.         Button mBtn;  
  68.     }  
  69. }  

主Activity:

[java]  view plain  copy   在CODE上檢視程式碼片 派生到我的程式碼片
  1. package com.example.zhy_layoutinflater;  
  2.   
  3. import java.util.Arrays;  
  4. import java.util.List;  
  5.   
  6. import android.app.Activity;  
  7. import android.os.Bundle;  
  8. import android.widget.ListView;  
  9.   
  10. public class MainActivity extends Activity  
  11. {  
  12.   
  13.     private ListView mListView;  
  14.     private MyAdapter mAdapter;  
  15.     private List<String> mDatas = Arrays.asList("Hello""Java""Android");  
  16.   
  17.     @Override  
  18.     protected void onCreate(Bundle savedInstanceState)  
  19.     {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.activity_main);  
  22.   
  23.         mListView = (ListView) findViewById(R.id.id_listview);  
  24.         mAdapter = new MyAdapter(

    相關推薦

    Android LayoutInflater深度解析 帶來全新認識

    本文出自:http://blog.csdn.net/lmj623565791/article/details/38171465 1、 題外話 相信大家對LayoutInflate都不陌生,特別在ListView的Adapter的getView方法中基本都會出現,使用inflate方法去

    極速高清——帶來全新的高清視野

    歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~ 本文由騰訊雲視訊發表於雲+社群專欄 關注公眾號“騰訊雲視訊”,一鍵獲取 技術乾貨 | 優惠活動 | 視訊方案 歡迎來到吃雞戰場 很生氣!!!我才剛落地,就因遊戲介面糊了一下,阻止了我撿槍的步伐,就

    微軟一年一度的開發者大會,帶來全新的開發者體驗

    Build 2018 主旨演講的主題是 Azure 雲和 AI、物聯網、AR等技術,以及開發者相關內容的宣佈。在今天的Build大會上,微軟宣佈目前已有超過7億臺裝置執行Windows 10系統。去年這個數字為5億。Office 365目前每個月有1.35億活躍的商業使用者,去年為1.2億。 微軟今年Bui

    還在用 os.path?快來感受一下 pathlib 帶來的便捷吧!

    相比常用的 os.path而言,pathlib 對於目錄路徑的操作更簡介也更貼近 Pythonic。但是它不單純是為了簡化操作,還有更大的用途 概述 pathlib 是Python內建庫,Python 文件給它的定義是 Object-oriented filesystem paths(面向物件的

    TensorFlow Hub, 帶來全新的 Web 體驗

    文 / André Susano Pinto(TensorFlow Hub 技術負責人)和 Clemens Mewald(產品經理) 來源 | TensorFlow 公眾號 在之前的文章中,我們釋出了 TensorFlow Hub,這是一個在 TensorFlo

    Android DataBinding全解析該用這個框架了

    前言: Data binding 在2015年7月釋出的Android Studio v1.3.0 版本上引入,在2016年4月Android Studio v2.0.0 上正式支援。目前為止,Data Binding 已經支援雙向綁定了。 Databind

    Android Context完全解析所不知道的Context的各種細節

    前幾篇文章,我也是費勁心思寫了一個ListView系列的三部曲,雖然在內容上可以說是絕對的精華,但是很多朋友都表示看不懂。好吧,這

    深度解析多執行緒帶來Android效能優化原理

    Android 開發中多執行緒的必要性; Android 開發中,許多操作都需要由 主執行緒(UI 執行緒)來執行,比如: 系統事件(例如裝置狀態變動) 輸入事件 服務 鬧鐘 UI 繪製 … 我們經常需要針對這些情況編寫程式碼。 由於主執行緒只有一個

    java執行緒深度解析(一)——java new 介面?匿名內部類答案

    一、內部類 1、內部類初識 一般,一個類裡主要包含類的方法和屬性,但在java中還提出在類中繼續定義類(內部類)的概念。 內部類的定義:類的內部定義類 先來看一個例項 public class Ou

    深度解析Maven

    .com ima 一個 html nta tps 實現 隱藏 read 一、What`s Maven?   Maven是基於項目對象模型(POM project object model),可以通過一小段描述信息(配置)來管理項目的構建,報告和文檔的軟件項目管理工具,簡單

    一文帶深度解析騰訊雲直播答題方案

    exc com erp 同學 col 測試 的確 影響 cep 歡迎大家前往雲+社區,獲取更多騰訊海量技術實踐幹貨哦~ 作者:騰訊視頻雲 進入2018年最火的新鮮事物無疑就是“直播答題”了,動輒上百萬的獎金更是吸引了大量用戶的參與。一場直播動輒幾百萬的獎金,每人可以分到

    Android Service完全解析,關於服務所需知道的一切(下)

    並且 無法 數據類型 界面 其它 wid logcat listen 程序崩潰 文章轉載至:http://blog.csdn.net/guolin_blog/article/details/9797169 這是郭霖寫的.......就是寫 "第一行代碼"的那個厲害人物,大

    Android手機能投屏到電腦上嗎?方法我都列出來了

    and bsp linu 中文 電腦 接收 放音 系統 bin 共享屏幕正在一步一步的進入到我們的生活中,從最原始的手機-電視屏幕共享到現在的手機-電腦屏幕共享,這一規模正在逐步的擴散至全球的各個角落中,隨之的手機型號的不同,從symbian-Windows phone-F

    為什麽選擇在英國學習?它我們帶來了什麽魅力?

    也有 年輕人 全世界 學習 美麗 競爭力 貝爾 想要 數量 中國是世界上人口最多的國家。其龐大的人口基礎使得每年高考和研究生入學考試的數量仍然很高。競爭非常激烈。可以說,成千上萬的部隊渡過一座木橋並不算太多。尤其是高考,對於很多孩子來說,可以說是人生的第一分水嶺,高考的難度

    Android LayoutInflater原理分析,帶一步步深入瞭解View

    有段時間沒寫部落格了,感覺都有些生疏了呢。最近繁忙的工作終於告一段落,又有時間寫文章了,接下來還會繼續堅持每一週篇的節奏。 有不少朋友跟我反應,都希望我可以寫一篇關於View的文章,講一講View的工作原理以及自定義View的方法。沒錯,承諾過的文章我是一定要兌現的,而且在View這個話題上我還

    從頭到尾講明白Android View實現原理

    Activity是Android開發者寫第一行程式碼起就開始接觸到的。而在onCreate方法中呼叫setContentView(R.layout.main_activity),恐怕也是絕大多數開發者的頭等任務。然後我們可以呼叫findViewById(R.id.xxx)來獲取佈局中的某

    Android Service完全解析,關於服務所需知道的一切(上)(筆記)

    參考原文:Android Service完全解析,關於服務你所需知道的一切(上) Service的基本用法 然後新建一個MyService繼承自Service,並重寫父類的onCreate()、onStartCommand()和onDestroy()方法, 可以看到,在Sta

    SIGAI 4P計劃【2.0】免費來襲,一個深度學習python的機會

    SIGAI 4P計劃一期啟動以來,收到了小夥伴們的熱烈反響。共1017人加入計劃學習,其中70%學生使用者,28%企業使用者。不少小夥伴希望加入,但由於人員和管理的限制,一期不再開放。 但是,SIGAI怎麼能辜負同學們一顆想天天向上的好學之心呢?在大家的殷殷期待下,SIGAI總結一期4P計劃經驗

    5年行業老手為深度解析”央行大力支援數字貨幣爆發的8大因素!

    前言 如果說網際網路改變了人們的生活方式,淘寶改變了人們的消費方式,那麼數字資產的進場比看懂更重要,這是絕對是趨勢。真正懂得玩幣的人,他不會說懂,他會默默的去做,因為他心裡很清楚,趨勢就是一匹馬,你如果在馬後面追,你永遠都追不上,你只有騎在馬上面,才能和馬一樣的

    《Spring原始碼深度解析》pdf附網盤下載連結送給還在迷茫的

    技術書閱讀方法論 一.速讀一遍(最好在1~2天內完成) 人的大腦記憶力有限,在一天內快速看完一本書會在大腦裡留下深刻印象,對於之後複習以及總結都會有特別好的作用。 對於每一章的知識,先閱讀標題,弄懂大概講的是什麼主題,再去快速看一遍,不懂也沒有關係,但是一定要在不懂的