在使用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"><ImageViewandroid:layout_width="80dp"android:layout_height="80dp"android:src="@drawable/add"android:id="@+id/goods_iv"/><TextViewandroid: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和組件相關聯:
@Overridepublic 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);