View
類型對象的setTag()
和getTag()
等方法的主要用途是什麼? html
我是否正確地認爲我能夠將任意數量的對象與單個視圖相關聯? android
這對於使用自定義ArrayAdapter
很是有用。 這是某種優化。 setTag
用做對象的引用,引用佈局的某些部分(在ListView
中顯示)而不是findViewById
。 異步
static class ViewHolder { TextView tvPost; TextView tvDate; ImageView thumb; } public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { LayoutInflater inflater = myContext.getLayoutInflater(); convertView = inflater.inflate(R.layout.postitem, null); ViewHolder vh = new ViewHolder(); vh.tvPost = (TextView)convertView.findViewById(R.id.postTitleLabel); vh.tvDate = (TextView)convertView.findViewById(R.id.postDateLabel); vh.thumb = (ImageView)convertView.findViewById(R.id.postThumb); convertView.setTag(vh); } .................... }
我想補充幾句話。 佈局
雖然在特定的ViewHolder模式中使用get/setTag(Object)
彷佛很是有用,但我建議在其餘狀況下使用它以前要三思然後行。 幾乎老是有另外一個好的設計解決方案。 post
主要緣由是代碼很快就變得不受支持了。 優化
對於其餘開發人員而言,您設計爲在視圖中存儲爲標記的內容並不明顯。 方法setTag / getTag根本不具備描述性。 spa
它只存儲一個Object
,因此當你想要getTag
時它須要getTag
。 當您決定更改標記中存儲對象的類型時,您可能會在之後遇到意外崩潰。 設計
這是來自現實生活的故事。 咱們有一個很是大的項目,包含不少適配器,帶有視圖的異步操做等等。 一位開發人員決定在他的部分代碼中set/getTag
,但另外一位開發人員已經爲此視圖設置了標記。 最後有人找不到本身的標籤並且很是困惑。 花了咱們幾個小時來找到這個bug。 code
setTag(int key, Object tag)
看起來好多了,由於你能夠爲每一個標籤生成惟一的密鑰(使用id資源 ),但Android <4.0存在重大限制。 來自Lint文檔: htm
在Android 4.0以前,View.setTag(int,Object)的實現會將對象存儲在靜態映射中,其中值被強烈引用。 這意味着若是對象包含指向上下文的任何引用,則上下文(指向其餘全部內容)將泄漏。 若是傳遞視圖,視圖將提供對建立它的上下文的引用。 相似地,視圖持有者一般包含視圖,而遊標有時也與視圖相關聯。
對於Web開發人員來講,這彷佛等同於數據 - ..
與ID不一樣,標籤不用於標識視圖。 標籤本質上是能夠與視圖相關聯的額外信息。 它們一般用做存儲與視圖自己中的視圖相關的數據的便利,而不是將它們放在單獨的結構中。
參考: http : //developer.android.com/reference/android/view/View.html
咱們可使用setTag()
和getTag()
根據咱們的要求設置和獲取自定義對象。 setTag()
方法接受Object
類型的參數, getTag()
返回一個Object
。
例如,
Person p = new Person(); p.setName("Ramkailash"); p.setId(2000001); button1.setTag(p);