在使用ListView的时候,需要加载适配器和数据源,这篇文章主要介绍一下ListView的使用以及利用ListView的缓存机制来减少系统的初始化时间。
ListView的使用
ListView和ViewPager很类似,首先在ArrayList中存放数据源,并把它作为Adapter的构造函数的参数传入Adapter类中,之后在Adapter中实现相应方法,具体代码如下:
1.在ArrayList中存放数据源
由于ListView中,每一个View是一个Item,所以数据源中需要存放Item当中每一个View的信息,因此,可以定义一个自定义类来存放这些需要存放的信息。代码如下:
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类来存放需要修改的信息:
public class Goods { public String text; public int ImageId; }
在Activity中声明ArrayList,并生成数据源:
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的写法:
getView方法,主要是获取position位置的View对象。我们可以每次都声明一个新的View,并通过findViewById获取Item中的每个控件,但这样会用到大量的耗时操作,并重复占用资源。因此,我们可以利用ListView的缓存机制,来获取这些View对象。
首先,在BaseAdapter中,声明一个内部类,用来存放已经缓存好的每一个组件:
class ViewHolder { public ImageView iv; public TextView tv; }
然后,对应getView每一个需要加载的View来说,判断他是否已经被加载过,如果没有,便进行加载,并利用View的setTag方法,把已经加载的View和组件相关联:
@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);