[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…等。


留言

這個網誌中的熱門文章

[Android] layout_weight的妙用-讓View的大小以百分比率顯示(proportionate size)

[Android] 內部儲存體(Internal Storage)的檔案系統讀寫(File I/O)