日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > Android性能優化之ListView緩存機制

Android性能優化之ListView緩存機制

來源:程序員人生   發布時間:2014-09-27 02:12:14 閱讀次數:1918次

要想優化ListView首先要了解它的工作原理,列表的顯示需要三個元素:ListView、Adapter、顯示的數據;

這里的Adapter就是用到了適配器模式,不管傳入的是什么View在ListView中都能顯示出來。

下面簡單說下上圖的原理:

1、如果你有幾千幾萬甚至更多的選項(item)時,其中只有可見的項目(滿屏顯示的Item數目)存在內存(說的優化就是說在內存中的優化?。┲校渌脑赗ecycler中

2、ListView先請求一個type1視圖(getView)然后請求其他可見的項目。convertView在getView中是空(null)的,第一次都是為空的,只要顯示過了convertView都不為空,會保存在Recycler中

3、當item1滾出屏幕,并且一個新的項目從屏幕低端上來時,ListView再請求一個type1視圖。convertView此時不是空值了,它的值是item1。你只需設定新的數據然后返回convertView,不必重新創建一個視圖,省去了inflate和findViewById的時間,性能就得到了優化。


了解了它的工作原理后,我們就可以重復利用convertView,只要不為空就直接使用,改變它的內容就行了。

使用ListView的時候都會搭配一個Adapter,為了使得性能更優,ListView會緩存行item(某行對應的View)。ListView通過Adapter的getView函數獲得每行的item。

package com.dzt.listviewdemo; import java.util.ArrayList; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; public class MainActivity extends Activity { private ListAdapter adapter; private ListView lv = null; private ArrayList<String> list = new ArrayList<String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = (ListView) findViewById(R.id.lv_list); adapter = new ListAdapter(); for (int i = 0; i < 100; i++) { list.add("item " + i); } lv.setAdapter(adapter); } private class ListAdapter extends BaseAdapter { private LayoutInflater mInflater; ListAdapter() { mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { // TODO Auto-generated method stub return list.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return list.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub System.out.println("getView " + position + " " + convertView); viewHolder holder = null; if (convertView == null) { convertView = mInflater.inflate(R.layout.item, null); holder = new viewHolder(); holder.text = (TextView) convertView.findViewById(R.id.tv_text); holder.image = (ImageView) convertView .findViewById(R.id.iv_img); convertView.setTag(holder); } else { holder = (viewHolder) convertView.getTag(); } holder.text.setText(list.get(position)); if (position % 2 == 0) { holder.image.setImageResource(R.drawable.ic_launcher); } else { holder.image.setImageResource(R.drawable.icon); } return convertView; } } /** * 使用一個類來保存Item中的元素 * * @author Administrator * */ public static class viewHolder { public TextView text; public ImageView image; } }
運行效果


第一次打印的結果convertView都是為null


滑動ListView后的打印


從上面的打印消息可以看出,Recycler中會保存七個convertView對象用來顯示Item,不管你有上千個Item,也只會創建顯示滿屏的convertView,這就大大節省了內存,對viewHolder的Tag的使用也大大節省了性能開銷

相關代碼下載:http://download.csdn.net/detail/deng0zhaotai/7842885

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: av在线播放免费 | 国产成人精品久久久 | 视频一区在线播放 | 天天干干 | 国产伦精品一区二区三区四区视频 | 欧美理论在线观看 | 欧美亚洲福利 | 视频一区二区三区在线观看 | 在线一区二区三区 | 国产激情| 欧美综合成人网 | 日韩精品亚洲一区 | 久久不射网站 | 成人在线视频一区二区 | 国产福利在线视频 | 欧美日韩精品一区二区公司 | 日本大片免a费观看视频的特点 | 在线观看麻豆视频 | 免费观看一级特黄欧美大片 | 精品国产一二三区 | 一区二区三区精品在线 | 99精品欧美一区二区蜜桃免费 | 亚洲欧美国产精品 | 久久久精品一区二区 | 精品一级毛片 | 久久精品欧美一区二区 | 日干夜干 | 国产精品久久久久久久免费软件 | www.嫩草| 九九九九九国产 | 久久国产精品免费一区二区三区 | 亚洲视频在线视频 | 日韩久久av| 亚洲精品91 | 91麻豆精品国产91久久久使用方法 | 国产精品久久99 | 国产精品亚洲成人 | 日韩在线色 | 国产麻豆乱码精品一区二区三区 | 美女黄色免费网站 | 欧美在线视频播放 |