日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ListView中convertView和ViewHolder的工作原理

發布時間:2023/12/20 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ListView中convertView和ViewHolder的工作原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
w和Adapter 參考:http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html 工作原理: ?1.ListView針對List中每個item,要求adapter給我一個視圖(getView) ?2.一個新的視圖被返回并顯示
如果我們有上億個item要顯示怎么辦?為每個項目創建一個新視圖?NO!這不可能~~~Android實際上為你緩存了視圖
Android中有個叫做Recycler(反復循環器)的構件,下圖是它的工作原理:
1.如果你有10億個項目(item),其中只有可見的項目存在內存中,其他的在Recycler中 2.ListView先請求一個type1視圖(getView),然后請求其他可見的項目。conVertView在getView中時null的 3.當item1滾出屏幕,并且一個新的項目從屏幕地段上來時,ListView再請求一個type1視圖。convertView此時不是空值了,它的值是item1.你只需要設定新的數據返回convertView,不必重新創建一個視圖。這樣直接使用convertView從而減少了很不不必要view的創建

!!!!!!更快的方式是定義一個ViewHolder,將convertView的tag設置為ViewHolder,不為空是重新使用
ViewHolder只是將需要緩存的那些view封裝好,convertView的setTag才是將這些緩存起來供下次調用 當你的listview里布局多樣化的時候 viewholder的作用就有比較明顯的體現了。 當然了,單一模式的布局一樣有性能優化的作用 只是不直觀。??假如你2種模式的布局 當發生回收的時候 你會用setTag分別記錄是哪兩種? ?這兩種模式會被封裝到viewholder中進行保存方便你下次使用。 VH就是個靜態類 與緩存無關的
[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>??

  • 參考資料:

    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

    總結

    以上是生活随笔為你收集整理的ListView中convertView和ViewHolder的工作原理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。