Android學習——ListView的緩存機制

在使用ListView的時候,須要加載適配器和數據源,這篇文章主要介紹一下ListView的使用以及利用ListView的緩存機制來減小系統的初始化時間。android

 

ListView的使用


ListView和ViewPager很相似,首先在ArrayList中存放數據源,並把它做爲Adapter的構造函數的參數傳入Adapter類中,以後在Adapter中實現相應方法,具體代碼以下:緩存

 

1.在ArrayList中存放數據源

因爲ListView中,每個View是一個Item,因此數據源中須要存放Item當中每個View的信息,所以,能夠定義一個自定義類來存放這些須要存放的信息。代碼以下:ide

XML中,聲明Item,包括一個ImageView和一個TextView函數

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
    android:orientation="horizontal">
    <ImageView
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:src="@drawable/add"
        android:id="@+id/goods_iv"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/goods_tv"/>



</LinearLayout>

 

自定義Goods類來存放須要修改的信息:spa

public class Goods
{
    public String text;
    public int ImageId;
}

 

在Activity中聲明ArrayList,並生成數據源:code

ArrayList<Goods> goods=new ArrayList<>();
        for(int i=1;i<=20;i++)
        {
            Goods good=new Goods();
            good.ImageId=R.drawable.good;
            good.text="商品"+i;
            goods.add(good);
        }

 

2.構造適配器

ListView的適配器爲BaseAdapter,其中getCount(),getItem()和getItemID()三個方法與PageAdapter相似,最有講究的即是getView方法,這裏着重講解一下getView的寫法:xml

getView方法,主要是獲取position位置的View對象。咱們能夠每次都聲明一個新的View,並經過findViewById獲取Item中的每一個控件,但這樣會用到大量的耗時操做,並重復佔用資源。所以,咱們能夠利用ListView的緩存機制,來獲取這些View對象。對象

首先,在BaseAdapter中,聲明一個內部類,用來存放已經緩存好的每個組件:blog

class ViewHolder
    {
        public ImageView iv;
        public TextView tv;
    }

而後,對應getView每個須要加載的View來講,判斷他是否已經被加載過,若是沒有,便進行加載,並利用View的setTag方法,把已經加載的View和組件相關聯:utf-8

@Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        ViewHolder viewHolder;
        if(convertView==null)
        {
            convertView=inflater.inflate(R.layout.item_goods,null);
            viewHolder=new ViewHolder();
            viewHolder.iv= (ImageView) convertView.findViewById(R.id.goods_iv);
            viewHolder.tv= (TextView) convertView.findViewById(R.id.goods_tv);
            convertView.setTag(viewHolder);
        }

 

若已經加載過,則直接取出,進行組件的修改便可:

else
        {
            viewHolder= (ViewHolder) convertView.getTag();
        }
        Goods good=goodslist.get(position);
        viewHolder.iv.setImageResource(good.ImageId);
        viewHolder.tv.setText(good.text);
        return convertView

 

3.ListView與適配器向關聯

與ViewPager相似,這裏只給出代碼,再也不贅述

GoodsAdapter adapter=new GoodsAdapter(goods,getContext());
        listview.setAdapter(adapter);