久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2587|回復(fù): 0
收起左側(cè)

ListView緩存機(jī)制

[復(fù)制鏈接]
ID:109770 發(fā)表于 2016-3-22 19:40 | 顯示全部樓層 |閱讀模式
本帖最后由 51黑bing 于 2016-3-22 19:41 編輯

要想優(yōu)化ListView首先要了解它的工作原理,列表的顯示需要三個元素:ListView、Adapter、顯示的數(shù)據(jù);

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

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

1、如果你有幾千幾萬甚至更多的選項(xiàng)(item)時(shí),其中只有可見的項(xiàng)目(滿屏顯示的Item數(shù)目)存在內(nèi)存(說的優(yōu)化就是說在內(nèi)存中的優(yōu)化!)中,其他的在Recycler中

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

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

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

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

  1. package com.dzt.listviewdemo;

  2. import java.util.ArrayList;

  3. import android.app.Activity;
  4. import android.content.Context;
  5. import android.os.Bundle;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.ViewGroup;
  9. import android.widget.BaseAdapter;
  10. import android.widget.ImageView;
  11. import android.widget.ListView;
  12. import android.widget.TextView;

  13. public class MainActivity extends Activity {

  14.     private ListAdapter adapter;
  15.     private ListView lv = null;
  16.     private ArrayList<string> list = new ArrayList<string>();

  17.     @Override
  18.     protected void onCreate(Bundle savedInstanceState) {
  19.         super.onCreate(savedInstanceState);
  20.         setContentView(R.layout.activity_main);
  21.         lv = (ListView) findViewById(R.id.lv_list);
  22.         adapter = new ListAdapter();
  23.         for (int i = 0; i < 100; i++) {
  24.             list.add(item  + i);
  25.         }
  26.         lv.setAdapter(adapter);
  27.     }

  28.     private class ListAdapter extends BaseAdapter {

  29.         private LayoutInflater mInflater;

  30.         ListAdapter() {
  31.             mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  32.         }

  33.         @Override
  34.         public int getCount() {
  35.             // TODO Auto-generated method stub
  36.             return list.size();
  37.         }

  38.         @Override
  39.         public Object getItem(int position) {
  40.             // TODO Auto-generated method stub
  41.             return list.get(position);
  42.         }

  43.         @Override
  44.         public long getItemId(int position) {
  45.             // TODO Auto-generated method stub
  46.             return position;
  47.         }

  48.         @Override
  49.         public View getView(int position, View convertView, ViewGroup parent) {
  50.             // TODO Auto-generated method stub
  51.             System.out.println(getView  + position +      + convertView);
  52.             viewHolder holder = null;
  53.             if (convertView == null) {
  54.                 convertView = mInflater.inflate(R.layout.item, null);
  55.                 holder = new viewHolder();
  56.                 holder.text = (TextView) convertView.findViewById(R.id.tv_text);
  57.                 holder.image = (ImageView) convertView
  58.                         .findViewById(R.id.iv_img);
  59.                 convertView.setTag(holder);
  60.             } else {
  61.                 holder = (viewHolder) convertView.getTag();
  62.             }
  63.             holder.text.setText(list.get(position));
  64.             if (position % 2 == 0) {
  65.                 holder.image.setImageResource(R.drawable.ic_launcher);
  66.             } else {
  67.                 holder.image.setImageResource(R.drawable.icon);
  68.             }

  69.             return convertView;
  70.         }

  71.     }

  72.     /**
  73.      * 使用一個類來保存Item中的元素
  74.      *
  75.      * @author Administrator
  76.      *
  77.      */
  78.     public static class viewHolder {
  79.         public TextView text;
  80.         public ImageView image;
  81.     }
  82. }
  83. </string></string>
復(fù)制代碼



運(yùn)行效果


第一次打印的結(jié)果convertView都是為null

滑動ListView后的打印

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



回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久精品欧美一区二区三区不卡 | 成年人视频免费在线观看 | 国产精品久久国产愉拍 | 国内精品久久久久 | 亚洲成人综合社区 | 精品日韩在线 | 少妇一级淫片免费播放 | 成人在线视频免费看 | 久久9久 | 久久精品美女 | 国产福利在线免费观看 | 日本精品一区二区在线观看 | 日本久久久影视 | 91久久国产精品 | 天天干天天谢 | 成人影院午夜 | 99视频免费播放 | 天堂久 | 亚洲狠狠丁香婷婷综合久久久 | 青青草原综合久久大伊人精品 | 精产嫩模国品一二三区 | 免费黄色大片 | 日韩日韩日韩日韩日韩日韩日韩 | 91视频在线网站 | 在线看一区二区三区 | 伊人春色在线观看 | 美女天天干| 中文字幕在线观看一区 | 国产精品免费av | 做a视频 | 国产精品海角社区在线观看 | 精品一区二区三区视频在线观看 | 日韩视频国产 | 天天色综网 | 亚洲第1页| 免费视频一区二区 | 国产精品久久久久久中文字 | 免费国产精品久久久久久 | 国产1区2区| 日韩中文一区二区三区 | 欧美大片黄|