Android學習:實現複雜的列表項
阿新 • • 發佈:2019-01-06
實現複雜的列表項,這裡實現的是帶圖片的列表項,主要任務的寫一個BaseAdapter的子類,不過在這之前先構造個存列表項資料的類ListViewCellData,實現建構函式和幾個get方法即可,再在BaseAdapter中構造個數組存放幾組測試資料:
測試資料,R.drawable.img1是存放在,drawable資料夾下的圖片,命名規則與變數一樣且不能大寫:public class ListViewCellData { public String name,des; public int picId; public ListViewCellData(String name,String des,int picId){ this.name = name; this.des = des; this.picId = picId; } public String getName() { return name; } public String getDes() { return des; } public int getPicId() { return picId; } }
public ListViewCellData[] data= new ListViewCellData[]{ new ListViewCellData("zhangsan","haoren",R.drawable.img1), new ListViewCellData("lisi","huairen",R.drawable.img2), new ListViewCellData("wangwu","shagua",R.drawable.img3), };
剛剛建好BaseAdapter子類的時候,會讓你重寫四個方法:getCount()、getItem()、getItemId()和getView()
Int getCount()返回Adapter中資料的長度,也就是列表項的數量
Object getItem(int position)是根據position返回對應的列表項
long getItemId(int position)是返回列表項的位置
View getView(int position,View converView,ViewGroup parent)返回列表項的佈局,就是列表中一個列表項的佈局
前三個方法按下面的程式碼稍作修改即可
@Override
public int getCount(){
// TODO Auto-generated method stub
return data.length;
}
@Override
public ListViewCellData getItem(int position) {
// TODO Auto-generated method stub
return data[position];
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
主要任務是對getView方法的重寫,進行重寫之前,先早Layout資料夾下增加一個列表項佈局XML:ListCell,對一條ListView進行描述:
<?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:id="@+id/imageView1"
android:layout_width="100dp"
android:layout_height="100dp"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical" >
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/des"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout>
列表項佈局構造好之後,開始重寫getView方法,首先宣告一個新的LinearLayout的ll用於存放返回列表佈局,之後判斷convertView是否為空,convertView是系統回收的列表項,如果不為空,則說明系統有回收過列表項,這樣直接將convertView強制型別轉換複製給ll,如果為空,則使用LayoutInflater.from.inflate方法將剛才建的佈局ListCell賦值給ll,其中from需要獲取Context,這裡在BaseAdapter中創造建構函式以獲取Context:
private Context context = null;
public ListViewAdapter(Context context){
this.context = context;
}
public Context getContext(){
return this.context;
}
之後通過getItem方法獲取要在一個列表項中存放的資料,同findViewById方法獲取佈局的控制元件,再用setImageResource()、setText()等方法設定控制元件中的內容,最後返回ll即可:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
LinearLayout ll = null;
if(convertView!=null){
ll = (LinearLayout)convertView;
}
else{
ll = (LinearLayout)LayoutInflater.from(getContext()).inflate(R.layout.listcell,null);
}
ListViewCellData data = getItem(position);
ImageView icon = (ImageView)ll.findViewById(R.id.imageView1);
TextView name = (TextView)ll.findViewById(R.id.name);
TextView des = (TextView)ll.findViewById(R.id.des);
icon.setImageResource(data.getPicId());
name.setText(data.getName());
des.setText(data.getDes());
return ll;
}
最後在MainActivity中setAdapter中寫入剛才寫的BaseAdapter就行了:
private ListView lv = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView)findViewById(R.id.listView);
lv.setAdapter(new ListViewAdapter(this));
}
還有一種方法不用宣告ListView,就是直接繼承ListActivity類,然後繫結有ID為@android:id/list列表的佈局即可:
public class ListViewActivity extends ListActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
setListAdapter(new ListViewAdapter(this));
}
}
帶ID為@android:id/list列表的佈局:
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>