[Android]ListView控件之Adapter性能优化
Google在Google I/O大會上,提到Android在UI優化方面可以從以下五個方面入手:
- ? Adapter優化?
- ? 背景和圖片優化?
- ? 繪圖優化
- ? 視圖和布局優化
- ? 內存分配優化
1.Adapter優化
????? 在ListView中,我們可以自定義Adapter,繼承BaseAdapter,再重寫相應的方法,
但需要特別注意,ListView的每一項視圖加載都要經過getView這個方法,所以優化adapter
也就在此方法。
大家可以從方案一中看到,listview每顯示一項,都要調用getView方法,對于每次重復創建convertView對象以及findViewById
?方法,都會影響性能,如果ListView有顯示N多項,可想而知,資源的消耗有多大!
?
方案二: 1 @Override 2 public View getView(int position, View convertView, ViewGroup parent) { 3 // TODO Auto-generated method stub 4 5 ViewHolder holder; 6 if(convertView == null){ 7 holder = new ViewHolder(); 8 convertView = mInflater.inflate(R.layout.img_listview_item, null); 9 holder.imgIv = (ImageView)convertView.findViewById(R.id.imageView1); 10 holder.itemTv = (TextView)convertView.findViewById(R.id.textView1); 11 convertView.setTag(holder); 12 13 }else{ 14 15 holder = (ViewHolder)convertView.getTag(); 16 17 } 18 19 holder.imgIv.setImageResource(R.drawable.icon); 20 holder.itemTv.setText(mDataItem[position]); 21 22 return convertView; 23 } 24 25 26 class ViewHolder{ 27 public ImageView imgIv; 28 public TextView itemTv; 29 } ?從方案二中,我們看到,當convertView為null的時候才去創建convertView以及獲取相應的控件對象,在最下面,還創建一個ViewHolder類,這個類是干嘛用的呢?
?它是保存每項ListView視圖里的控件對象,達到緩存控件對象,而不用每次都用findViewById()去獲取,節省資源,這是一個優化細節。
?
??? 注意:
??? 在界面初始后,第一次可見的視圖項,這個要具體ListView可最多顯示幾項,在這幾項初始時,都會調用
??? if(convertView == null){
??????? 最初幾項調用...
??? }
??? 但拉動ListView顯示下面的數據時,那接下來就調用
??? }else{
???holder = (ViewHolder)convertView.getTag();
???
??? }
??? 這部分啦!
?
?
轉載于:https://www.cnblogs.com/hpboy/archive/2012/07/10/2584532.html
總結
以上是生活随笔為你收集整理的[Android]ListView控件之Adapter性能优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习笔记:UINavigationbar
- 下一篇: 解决“The type initiali