ListView中convertView和ViewHolder的工作原理
生活随笔
收集整理的這篇文章主要介紹了
ListView中convertView和ViewHolder的工作原理
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
w和Adapter
參考:http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html
工作原理:
?1.ListView針對List中每個item,要求adapter給我一個視圖(getView)
?2.一個新的視圖被返回并顯示
如果我們有上億個item要顯示怎么辦?為每個項目創(chuàng)建一個新視圖?NO!這不可能~~~Android實際上為你緩存了視圖
Android中有個叫做Recycler(反復循環(huán)器)的構(gòu)件,下圖是它的工作原理:
1.如果你有10億個項目(item),其中只有可見的項目存在內(nèi)存中,其他的在Recycler中 2.ListView先請求一個type1視圖(getView),然后請求其他可見的項目。conVertView在getView中時null的 3.當item1滾出屏幕,并且一個新的項目從屏幕地段上來時,ListView再請求一個type1視圖。convertView此時不是空值了,它的值是item1.你只需要設(shè)定新的數(shù)據(jù)返回convertView,不必重新創(chuàng)建一個視圖。這樣直接使用convertView從而減少了很不不必要view的創(chuàng)建
!!!!!!更快的方式是定義一個ViewHolder,將convertView的tag設(shè)置為ViewHolder,不為空是重新使用
ViewHolder只是將需要緩存的那些view封裝好,convertView的setTag才是將這些緩存起來供下次調(diào)用 當你的listview里布局多樣化的時候 viewholder的作用就有比較明顯的體現(xiàn)了。 當然了,單一模式的布局一樣有性能優(yōu)化的作用 只是不直觀。??假如你2種模式的布局 當發(fā)生回收的時候 你會用setTag分別記錄是哪兩種? ?這兩種模式會被封裝到viewholder中進行保存方便你下次使用。 VH就是個靜態(tài)類 與緩存無關(guān)的
[java]?view plaincopy print? <span?style="font-family:Microsoft?YaHei;font-size:18px;color:#3366ff;"><strong>public?class?MultipleItemsList?extends?ListActivity?{?? ???? ????private?MyCustomAdapter?mAdapter;?? ???? ????@Override?? ????public?void?onCreate(Bundle?savedInstanceState)?{?? ????????super.onCreate(savedInstanceState);?? ????????mAdapter?=?new?MyCustomAdapter();?? ????????for?(int?i?=?0;?i?<?50;?i++)?{?? ????????????mAdapter.addItem("item?"?+?i);?? ????????}?? ????????setListAdapter(mAdapter);?? ????}?? ???? ????private?class?MyCustomAdapter?extends?BaseAdapter?{?? ???? ????????private?ArrayList?mData?=?new?ArrayList();?? ????????private?LayoutInflater?mInflater;?? ???? ????????public?MyCustomAdapter()?{?? ????????????mInflater?=?(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);?? ????????}?? ???? ????????public?void?addItem(final?String?item)?{?? ????????????mData.add(item);?? ????????????notifyDataSetChanged();?? ????????}?? ???? ????????@Override?? ????????public?int?getCount()?{?? ????????????return?mData.size();?? ????????}?? ???? ????????@Override?? ????????public?String?getItem(int?position)?{?? ????????????return?mData.get(position);?? ????????}?? ???? ????????@Override?? ????????public?long?getItemId(int?position)?{?? ????????????return?position;?? ????????}?? ???? ????????@Override?? ????????public?View?getView(int?position,?View?convertView,?ViewGroup?parent)?{?? ????????????System.out.println("getView?"?+?position?+?"?"?+?convertView);?? ????????????ViewHolder?holder?=?null;?? ????????????if?(convertView?==?null)?{?? ????????????????convertView?=?mInflater.inflate(R.layout.item1,?null);?? ????????????????holder?=?new?ViewHolder();?? ????????????????holder.textView?=?(TextView)convertView.findViewById(R.id.text);?? ????????????????convertView.setTag(holder);?? ????????????}?else?{?? ????????????????holder?=?(ViewHolder)convertView.getTag();?? ????????????}?? ????????????holder.textView.setText(mData.get(position));?? ????????????return?convertView;?? ????????}?? ???? ????}?? ???? ????public?static?class?ViewHolder?{?? ????????public?TextView?textView;?? ????}?? }</strong></span>??
如果我們有上億個item要顯示怎么辦?為每個項目創(chuàng)建一個新視圖?NO!這不可能~~~Android實際上為你緩存了視圖
Android中有個叫做Recycler(反復循環(huán)器)的構(gòu)件,下圖是它的工作原理:
1.如果你有10億個項目(item),其中只有可見的項目存在內(nèi)存中,其他的在Recycler中 2.ListView先請求一個type1視圖(getView),然后請求其他可見的項目。conVertView在getView中時null的 3.當item1滾出屏幕,并且一個新的項目從屏幕地段上來時,ListView再請求一個type1視圖。convertView此時不是空值了,它的值是item1.你只需要設(shè)定新的數(shù)據(jù)返回convertView,不必重新創(chuàng)建一個視圖。這樣直接使用convertView從而減少了很不不必要view的創(chuàng)建
!!!!!!更快的方式是定義一個ViewHolder,將convertView的tag設(shè)置為ViewHolder,不為空是重新使用
ViewHolder只是將需要緩存的那些view封裝好,convertView的setTag才是將這些緩存起來供下次調(diào)用 當你的listview里布局多樣化的時候 viewholder的作用就有比較明顯的體現(xiàn)了。 當然了,單一模式的布局一樣有性能優(yōu)化的作用 只是不直觀。??假如你2種模式的布局 當發(fā)生回收的時候 你會用setTag分別記錄是哪兩種? ?這兩種模式會被封裝到viewholder中進行保存方便你下次使用。 VH就是個靜態(tài)類 與緩存無關(guān)的
[java]?view plaincopy print?
參考資料:
http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html
http://www.eoeandroid.com/thread-72369-1-1.html
http://www.cnblogs.com/felix-hua/archive/2012/01/06/2314436.html
http://blog.csdn.NET/jacman/article/details/7087995
http://fatkun.com/2012/01/Android-viewholder.html
總結(jié)
以上是生活随笔為你收集整理的ListView中convertView和ViewHolder的工作原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: s7200cpu224xp手册_S7-2
- 下一篇: 移动互联智慧杭州、技术精英引领中国