[Android] Disable ListView Item
ListView常用來顯示大量同性質的資訊,但有時候會遇到需要將List中的某些item disable的情況,例如:作為分隔資料的Divider或是因為特定條件取消某個item click事件。Android將ListView的所有item預設為enabled,如果要disable特定item必須自行繼承BaseAdapter,接下來將針對如何disable listview 的特定item進行說明。
程式碼說明
本文將以聯絡人List為例,將聯絡人以開頭字母為分類,並以Disabled的item作為Divider,如下圖所示:
1. 建立繼承BaseAdapter之Adapter Class
由於List所顯示的資訊為簡單的TextView,所以可以直接使用內建的simple_list_item_1,如果還要加入ImageView、CheckBox等元件,就必須自行定義custom row xml。
public class ListAdapter extends BaseAdapter{
private LayoutInflater mInflater;
private String[] listData;
public ListAdapter(Context context, String[] data){
mInflater = LayoutInflater.from(context);
listData = data;
}
@Override
public View getView(int pos, View v, ViewGroup p){
v = mInflater.inflate(android.R.layout.simple_list_item_1, null);
TextView textView = (TextView)v;
textView.setText(listData[pos]);
if(pos==0||pos==3||pos==5||pos==7){
textView.setBackgroundColor(0xff91C7FF);
}
return textView;
}
@Override
public int getCount() {
return listData.length;
}
@Override
public Object getItem(int position) {
return listData[position];
}
@Override
public long getItemId(int position) {
return position;
}
}
2. 覆寫areAllItemsEnabled()
areAllItemsEnabled是BaseAdapter定義的函式,預設會回傳true,表示ListView裡的所有item都為enabled的狀態,所以要disable特定item就必須覆寫此函式並回傳false。
@Override
public boolean areAllItemsEnabled(){
return false;
}
3. 覆寫isEnabled()
isEnabled函式將會傳入position參數,它表示ListView中每個item的position,可以針對程式需求定義item的enabled狀態。
@Override
public boolean isEnabled(int pos){
if(pos==0||pos==3||pos==5||pos==7){
return false;
}else{
return true;
}
}
4. 建立ListActivity並設定list adapter
import android.app.ListActivity;
import android.os.Bundle;
public class DisableListItem extends ListActivity {
String[] names = {"A","Andy","Angel","B","Bill","C","Candy","D","David","Dianel"};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.setListAdapter(new ListAdapter(this,names));
}
}
此例為了Demo方便,在判斷item enabled的條件是以較沒彈性的方式撰寫,實際在開發類似功能時,可能要再加上一些機制,像是:資料排序、插入Divider…等。

留言
張貼留言