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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

ListView优化方案和原理,你都知道了嘛?

發布時間:2024/8/1 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ListView优化方案和原理,你都知道了嘛? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.重用ConvertView

ListView的View回收機制:在可視范圍上面或者下面的View加入到回收池中。當在可視范圍內的View被移出可視范圍內時,其也會被添加到回收池中。以這種方式ListView只需占用非常少的內存幾可以存儲可視范圍內的View和回收池中的View。

參數convertView實際上就是一個可回收的View。當ListView要回收這個View的時候,它的數據就會被清空。因此,當convertView不為null的時候,只需要將數據填充到里面,而不用Inflate一個新的View,這樣可以優化性能。因為,Layout的Inflate是消耗資源巨大的代碼,因為Infalte操作需要徹底包含整個XML代碼樹,而且還要實例化相應的View。

public View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {convertView = mInflater.inflate(R.layout.your_layout, null);}TextView text = (TextView) convertView.findViewById(R.id.text);text.setText("Position " + position);return convertView;}

2.使用ViewHolder

ViewHolder就是用來存儲那些在你的getView()方法中調用findViewById()方法得到的View。以這種方式,你只需要在第一次創建Item的時候調用findViewById就可以了。

public View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {convertView = mInflater.inflate(R.layout.your_layout, null);holder = new ViewHolder();holder.text = (TextView) convertView.findViewById(R.id.text);convertView.setTag(holder);} else {holder = convertView.getTag();}holder.text.setText("Position " + position);return convertView;}private static class ViewHolder {public TextView text;}

3.異步加載

加載圖片是一個比較耗時的操作,當用戶快速滑動列表時,會頻繁地 getView ,而 getView 是在主線程中被調用的,如果你在 getView 方法中直接加載 Image 或做其他耗時操作,就會造成滑動比較卡,解決方法是使用異步加載。

  • ListView加載圖片亂序問題的解決方法:

    • getView中setTag,可以是圖片的url等唯一標識

    • 異步加載后,為ImageView設置圖片之前,用findVIewWithTag查找tag是不是為null,不是null才設置圖片

其他優化方法:

  • adapter的getView方法中盡可能的減少耗時的操作,getView方法執行的時間只有很短,否則會卡頓。

  • 數據分頁分批次加載

  • 快速滑動時不要加載圖片,否則會卡頓,如果在滑動時對滑動過的每張圖片都要加載,會比較占內存。設置滾動監聽,滾動的時候不要加載圖片。

  • 盡可能減少ListView的Item的Layout層次(如可以使用RelativeLayout替換LinearLayout,或使用自定的View代替組合嵌套使用的Layout)

  • onClickListener,當ListView的item中有比如button這些子view時,需要對其設置onclickListener,通常的寫法是在getView方法中一個個設置,比如

    holder.img.setonClickListener(new onClickListenr)...

    但是這種寫法每次調用getView時都設置了一個新的onClick事件,都需要new 監聽器,效率很低。高效的寫法可以直接在ViewHolder中設置一個position,然后viewHolder implements OnClickListenr:

    class ViewHolder implements OnClickListener{int position;TextView name;public void setPosition(int position){this.position = position;}@Overridepublic void onClick(View v) {switch (v.getId()){//XXXX}} }public View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null) {convertView = inflater.inflate(R.layout.list_item, parent, false);holder = new ViewHolder();holder.name = (TextView) convertView.findViewById(R.id.name);holder.name.setOnClickListener(holder);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}//設置holderholder.name.setText(list.get(position).partname);//設置positionholder.setPosition(position);return convertView; }

參考:

https://blog.csdn.net/u014657752/article/details/47379941

https://www.zhihu.com/question/19703384

https://blog.csdn.net/guolin_blog/article/details/45586553

總結

以上是生活随笔為你收集整理的ListView优化方案和原理,你都知道了嘛?的全部內容,希望文章能夠幫你解決所遇到的問題。

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