1. 程式人生 > >android自定義view的幾種方式

android自定義view的幾種方式

convertView = LayoutInflater.from(mContext).inflate(R.layout.list_view_item, null);
XXXX = (ItemView)convertView;

假如我想自定義一個listview,我之前的做法是:

方法一:

(1)對這個listview設定一個adapter,adapter裡面需要編寫getview()

(2)getview裡面肯定需要設定一個convertview,而這個convertview就是我們自己需要自己寫的listview中的每一個itemView

(3)itemView的寫法,之前是單獨寫一個itemView的類,繼承自framelayout(當然也可以是其他的佈局,我習慣用framelayout),還需要寫一個佈局檔案view.xml,在itemView生成的時候,將view.xml加入到itemView中,

addView(LayoutInflater.from(mContext).inflate(R.layout.view, null));
(4)然後再對view中的其他元素進行調整和賦值,當然這些都是在itemView中進行的,引數是從adapter中傳進來的

今天無意之中看到網上另外一種方法,雖然有些繞,但是貌似可以省去一層佈局:

方法二:

(1)(2)同上
(3)同樣寫一個itemView,不過佈局需要按照具體的形式來寫,比如這個view是一個線性佈局,那麼這裡就要繼承自線性佈局

(4)然後寫一個view.xml

引用一個網友的話:(lei215:http://www.eoeandroid.com/thread-48681-1-1.html)

比如你 自定義一個view叫myView ,路徑是,com.test.view.MyView,此view是繼承LinearLayout,定義的佈局檔案是my_view.xml
裡面內容是:
<com.test.view.MyView>
        <xxxx />
</com.test.view.MyView>
就是需要把view.xml的根佈局直接換成itemView,然後在裡面編寫你自己的view
(5)然後在convertview的getview裡面“MyView mv = (MyView)View.inflate (context,R.layout.my_view,null);”
convertView = LayoutInflater.from(mContext).inflate(R.layout.list_view_item, null);
XXXX = (ItemView)convertView;

這種寫法貌似比方法一難理解一些,因為他把inflate的過程放在了使用這個view的地方。

而且itemView.java和view.xml相當於並列的關係,還互相引用,然後交匯於使用的地方,如adapter的getview。

這種寫法貌似耦合度有點高。

不過好處就是省了方法一中的一層framelayout,效率要高一點。

唉,我也不知道哪個好,鬱悶