[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…等。
留言
張貼留言