文章引自郭霖《第一行代碼》
ListView允許用戶通過手指上下滑動的方式將屏幕外的數(shù)據(jù)滾動到屏幕內(nèi)斑粱,同時屏幕上原有的數(shù)據(jù)則會滾動出屏幕
使用LIstView控件
- 1 在布局文件中引入ListView控件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
</LinearLayout>
- 2 創(chuàng)建ListView子項布局(可以使用Android提供的布局方式)
<?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="match_parent" >
<ImageView
android:id="@+id/fruit_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/fruit_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="10dip" />
</LinearLayout>
- 3 定義實體類,做為ListView適配器的適配類型
public class Fruit {
private String name;
private int imageId;
public Fruit(String name, int imageId) {
this.name = name;
this.imageId = imageId;
}
public String getName() {
return name;
}
public int getImageId() {
return imageId;
}
}
- 4 創(chuàng)建一個自定義的適配器(可以使用Android提供的適配器)
public class FruitAdapter extends ArrayAdapter<Fruit> {
private int resourceId;
/**
*context:當(dāng)前活動上下文
*textViewResourceId:ListView子項布局的ID
*objects:要適配的數(shù)據(jù)
*/
public FruitAdapter(Context context, int textViewResourceId,
List<Fruit> objects) {
super(context, textViewResourceId, objects);
//拿取到子項布局ID
resourceId = textViewResourceId;
}
/**
* LIstView中每一個子項被滾動到屏幕的時候調(diào)用
* position:滾到屏幕中的子項位置怀樟,可以通過這個位置拿到子項實例
* convertView:之前加載好的布局進(jìn)行緩存
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Fruit fruit = getItem(position); //獲取當(dāng)前項的Fruit實例
//為子項動態(tài)加載布局
View view = LayoutInflater.from(getContext()).inflate(resourceId, null);
ImageView fruitName = (ImageView) view.findViewById(R.id.fruid_image);
TextView fruitName = (TextView) view.findViewById(R.id.fruit_name);
fruitImage.setImageResource(fruit.getImageId());
fruitName.setText(fruit.getName());
return view;
}
}
- 5 創(chuàng)建適配器對象(依次傳入當(dāng)前上下文喜鼓,ListView子項布局ID副砍,適配的數(shù)據(jù))
FruitAdapter adapter = new FruitAdapter(MainActivity.this, R.layout.fruit_item, fruitList);
- 6 調(diào)用LIstView的setAdapter()方法,將構(gòu)建好的適配器對象傳遞進(jìn)去庄岖,這樣LIstView和數(shù)據(jù)之間的關(guān)聯(lián)就建立完成了
listView.setAdapter(adapter);
至此豁翎,LIstView控件就可以使用
LIstView的性能優(yōu)化
對適配器的代碼進(jìn)行修改:
- 對已緩存的布局直接使用緩存,對為緩存的布局重新加載
- 使用內(nèi)部類對象存儲子項布局中子控件對象
public class FruitAdapter extends ArrayAdapter<Fruit> {
private int resourceId;
public FruitAdapter(Context context, int textViewResourceId,
List<Fruit> objects) {
super(context, textViewResourceId, objects);
resourceId = textViewResourceId;
}
/* 由系統(tǒng)調(diào)用隅忿,獲取一個View對象心剥,作為ListView的條目,屏幕上能顯示多少個條目背桐,getView方法就會被調(diào)用多少次
* position:代表該條目在整個ListView中所處的位置优烧,從0開始
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//重寫適配器的getItem()方法
Fruit fruit = getItem(position);
View view;
ViewHolder viewHolder;
if (convertView == null) { //若沒有緩存布局,則加載
//首先獲取布局填充器链峭,然后使用布局填充器填充布局文件
view = LayoutInflater.from(getContext()).inflate(resourceId, null);
viewHolder = new ViewHolder();
//存儲子項布局中子控件對象
viewHolder.fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
viewHolder.fruitName = (TextView) view.findViewById(R.id.fruit_name);
// 將內(nèi)部類對象存儲到View對象中
view.setTag(viewHolder);
} else { //若有緩存布局畦娄,則直接用緩存(利用的是緩存的布局,利用的不是緩存布局中的數(shù)據(jù))
view = convertView;
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.fruitImage.setImageResource(fruit.getImageId());
viewHolder.fruitName.setText(fruit.getName());
return view;
}
//內(nèi)部類弊仪,用于存儲ListView子項布局中的控件對象
class ViewHolder {
ImageView fruitImage;
TextView fruitName;
}
}
ListView的點擊事件
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Fruit fruit = fruitList.get(position);
// 加入邏輯代碼
}
});
ListView適配器
ListView
對象使用setAdapter(ListAdapter la)
方法給ListView
控件設(shè)置適配器
適配器繼承
BaseAdapter
熙卡,必須重寫其getCount()
和getView()
方法,靈活性高-
適配器繼承
ArrayAdapter<T>
励饵,此種適配器局限在于只能是一種類型驳癌,構(gòu)造方法:ArrayAdapter<T>(Context context, int resource, int textViewResourceId, T[] objects)
- context:上下文對象
- resource:ListView條目的布局文件ID
- textViewResourceId:T 類型數(shù)據(jù)綁定在布局文件中的ID
- objects:T 類型數(shù)據(jù)
-
適配器繼承
SimpleAdapter
,構(gòu)造方法:SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
- context:上下文對象
- data:存儲Map集合的List對象役听,作為數(shù)據(jù)
- resource:ListView條目的布局文件ID
- from:存儲在Map集合中的鍵颓鲜,也就代表了要填充到子項布局中的數(shù)據(jù)
- to:要將存儲在Map集合中的數(shù)據(jù)填充到子項布局中的控件ID