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);
相关文章
相关标签/搜索