一丶簡單用法
- 布局文件中增加 ListView
- 源碼中準(zhǔn)備數(shù)據(jù)
- 源碼中構(gòu)造適配器 Adapter
- 通過 id 找到 ListView 的實例
- ListView 設(shè)置適配器
- tip:使用android框架提供的子項布局
首先新建項目 :
例如 : ListViewActivity潭千,修改布局文件Listview缀蹄,線性布局嵌套一個 ListView:
<LinearLayout ...>
< ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/list_view">
</ListView>
</LinearLayout>
準(zhǔn)備數(shù)據(jù)嗓化,在MainActivity類內(nèi)部聲明變量data鸵赖,并初始化:
private String[] data = {
"Apple",
"Banana","Orange","Watermelon",
"Pear","Grape","Pineapple",
"Strawberry","Cherry","Mango"};
#########在MianActivity類的onCreate函數(shù)內(nèi)部構(gòu)造適配器线得,其三個參數(shù)分別是上下文Context,ListView子項目布局的ID路幸,這里使用Android提供的布局糙及,最后一個參數(shù)就是前面準(zhǔn)備的數(shù)據(jù):
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
MainActivity.this, // Context上下文
android.R.layout.simple_list_item_1, // 子項布局id
data); // 數(shù)據(jù)
接著在MainActivity類的onCreate函數(shù)內(nèi)部找到 ListView 這個實例并為這個實例設(shè)置適配器:
listView = (ListView) findViewById(R.id.list_view);
listView.setAdapter(adapter);
到此步 一個簡單的 ListView 已經(jīng)寫好了
二丶 定制 ListView 的界面
準(zhǔn)備一組圖片,拖入res/drawable目錄
多出的事情:
- 布局文件中增加 ListView
- 源碼中準(zhǔn)備數(shù)據(jù) 厌小,準(zhǔn)備圖片資源
- 源碼中構(gòu)造適配器 Adapter 恢共,準(zhǔn)備子項布局
- 通過id找到ListView的實例 ,準(zhǔn)備數(shù)據(jù)結(jié)構(gòu)
- ListView設(shè)置適配器璧亚,派生ArrayAdapter
新建一個布局文件fruit_item.xml讨韭,作為ListView子項目的布局,一個ImageView用于顯示水果的圖片癣蟋,一個TexitView用于現(xiàn)實水果的名稱:
<LinearLayout ...>
< ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/fruit_image"/>
< TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="10dip"
android:id="@+id/fruit_name"/>
</LinearLayout>
定義一個實體類透硝,作為ListView適配器的適配類型。新建類Fruit:
public class Fruit {
// 水果的名稱
private String name;
// 水果對應(yīng)圖片的資源id疯搅,在drawble里邊
private int imageId;
// 構(gòu)造函數(shù)
public Fruit(String name, int imageId){
this.name = name;
this.imageId = imageId;
}
// get名字
public String getName() {
return name;
}
// get圖片id
public int getImageId() {
return imageId;
}
}
自定義一個適配器濒生,新建類FruitAdapter,從ArrayAdapter派生幔欧,并將泛型指定為Fruit類罪治。
在其中重寫父類的構(gòu)造函數(shù),用于將上下文礁蔗、ListView子項布局的id和數(shù)據(jù)都傳遞進來觉义。
在其中重寫getView函數(shù),
首先通過getItem()方法得到當(dāng)前項的Fruit實例浴井,
然后使用LayoutInflater來為這個子項加載我們傳入的布局晒骇,
接著調(diào)用View的findViewById()方法分別獲取到ImageView和TextView的實例,并分別調(diào)用它們的setImageResource()和setText()方法來設(shè)置顯示的圖片和文字,最后布局返回厉碟。
public class FruitAdapter extends ArrayAdapter<Fruit> {
// 子項布局的id
private int resourceId;
// 構(gòu)造函數(shù)
public FruitAdapter(Context context, // context上下文
int textViewResourceId, // 子項布局的id
List<Fruit> objects){ // 數(shù)據(jù)鏈表
super(context, textViewResourceId, objects);
resourceId = textViewResourceId;
}
// 重寫getView
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 獲取當(dāng)前項的Fruit實例
Fruit fruit = getItem(position);
View view;
ViewHolder viewHolder;
if (convertView == null){
// inflate出子項布局喊巍,實例化其中的圖片控件和文本控件
view = LayoutInflater.from(getContext()).inflate(resourceId, null);
viewHolder = new ViewHolder();
// 通過id得到圖片控件實例
viewHolder.fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
// 通過id得到文本空間實例
viewHolder.fruitName = (TextView) view.findViewById(R.id.fruit_name);
// 緩存圖片控件和文本控件的實例
view.setTag(viewHolder);
}else{
view = convertView;
// 取出緩存
viewHolder = (ViewHolder) view.getTag();
}
// 直接使用緩存中的圖片控件和文本控件的實例
// 圖片控件設(shè)置圖片資源
viewHolder.fruitImage.setImageResource(fruit.getImageId());
// 文本控件設(shè)置文本內(nèi)容
viewHolder.fruitName.setText(fruit.getName());
return view;
}
// 內(nèi)部類
class ViewHolder{
ImageView fruitImage;
TextView fruitName;
}
}
修改MainActivity代碼
聲明一個成員變量:
private List<Fruit> fruitList = new ArrayList<Fruit>();
添加一個initFruit()方法:
private void initFruits(){
//蘋果
Fruit apple = new Fruit("Apple", // 名字
R.drawable.apple_pic); // 圖片id
fruitList.add(apple); // 蘋果增加到鏈表
Fruit banana = new Fruit("Banana", R.drawable.banana_pic);
fruitList.add(banana);
Fruit orange = new Fruit("Orange", R.drawable.orange_pic);
fruitList.add(orange);
Fruit watermelon = new Fruit("Watermelon", R.drawable.watermelon_pic);
fruitList.add(watermelon);
Fruit pear = new Fruit("Pear", R.drawable.pear_pic);
fruitList.add(pear);
Fruit grape = new Fruit("Grape", R.drawable.grape_pic);
fruitList.add(grape);
Fruit pineapple = new Fruit("Pineapple", R.drawable.pineapple_pic);
fruitList.add(pineapple);
Fruit strawberry = new Fruit("Strawberry", R.drawable.strawberry_pic);
fruitList.add(strawberry);
Fruit cherry = new Fruit("Cherry", R.drawable.cherry_pic);
fruitList.add(cherry);
Fruit mango = new Fruit("Mango", R.drawable.mango_pic);
fruitList.add(mango);
}
接著在onCreate函數(shù)調(diào)用初始化函數(shù),修改適配器的初始化:
initFruits();
FruitAdapter adapter = new FruitAdapter(MainActivity.this,
R.layout.fruit_item, fruitList);
listView = (ListView) findViewById(R.id.list_view);
listView.setAdapter(adapter);