列表類組件
(1)ListView組件:以垂直列表的形式列出需要顯示的清單項目
相關屬性:
a. android:divider 用於為列表視圖設定分隔條,可以用顏色或者圖片資源
b. android:dividerHeight 設定分隔條的高度
c. android:entries 通過數組資源為ListView指定清單項目
d. android:footerDividersEnabled 設定是否在footerView之前繪製分隔條,預設為true。
e. android:headerDividersEnabled 設定是否在headerView之後繪製分隔條,預設為true。
(2)ListView使用步驟:
a. 拖入一個ListView控制項,高度改為match_parent
b. 建立一個布局xml檔案,設定每行顯示的樣式
c. 建立一個類MyAdapter繼承BaseAdapter
getView()方法:設定每行資料顯示及每行顯示樣式
getCount()方法:顯示的行數,當傳回值為0時,getView()方法不會被調用,顯示為空白
d. 建立配接器物件
MyAdapter adapter = new MyAdapter();
e. 為ListView設定適配器
listView.setAdapter(adapter);
(3)ListView的最佳化
上下滑動會不斷觸發getview()方法
解決方案:複用行布局,減少控制項尋找
//建立一個類,聲明幾個變數(變數類型和數量與布局xml檔案中包含的控制項一致)
class ViewHolder{
View view1;
View view2;
......
}
//聲明成員變數
View inflate;
ViewHolder holder;
//最佳化
if(convertView==null){
//建立一個ViewHolder對象
//得到布局轉換器對象
LayoutInflater inflater = getLayoutInflate();
//將布局xml檔案轉換為布局對象
inflate = inflater.inflate(R.layout.listItem,null);
//尋找控制項
holder.view1 = inflate.findViewById(R.id.view1);
holder.view2 = inflate.findViewById(R.id.view2);
//設定一個標籤
infalte.setTag(holder);
}else{
//替換、複用行布局
inflate=convertView;
holder = (ViewHolder)inflate.getTag();
}
//依據控制項類型設定控制項內容
......
(3)資料更新
資料發生變化時,由適配器通知listview更新資料
adapter.notifyDataSetChanged();
(4)ListView的點擊事件
a. 設定點擊監聽
listview.setOnItemClickListener(new OnItemClickListener){
@Override
public void onItemClick(AdapterView<?> parent,View view,int position,long id){
......
}
}
備忘:當行布局中存在搶佔焦點的控制項時(如Button),ListView的點擊會失效
解決方式:
在行布局中搶佔焦點的控制項上設定屬性:android:focusable = "false"
在行布局中設定讓所有能搶佔焦點的控制項都不搶佔焦點
android:descendantFocusability = "blocksDescendants"
b. 設定長按點擊監聽
listview.setOnItemLongClickListener(new OnItemLongClickListener){
@Override
public void OnItemLongClick(AdapterView<?> parent,View view,int position,long id){
......
}
}