2011-07-19 61 views
3

作用域: - 使用重寫ArrayAdapter; - 使用選擇器; - 使用isEnabled禁用項目。使用選擇器和isEnabled禁用列表視圖項目()

目標: - 禁用某些列表項並通過選擇器加載禁用的狀態視圖。

問題: - 一切正常(自定義視圖,選擇的重點不突出,focuesd並按下狀態),但已禁用的項目不爲禁用狀態使用選擇。

調查:當我使用isEnabled禁用列表視圖中的某些項時層次結構查看器顯示禁用的項目不可聚焦,不可點擊但啓用(!)。

難道是缺陷還是缺少什​​麼東西?

P.S.實際上,文檔說,isEnabled不會爲列表項目執行setEnabled(false),它會使其成爲分隔符(?)對象。 P.P.S我也嘗試使用if語句將我的View(在getView中)設置爲isEnabled(false)。但它只適用於重點項目?

我的選擇是這樣的:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!-- Disabled --> 
    <item 
     android:state_enabled="false" 
     android:textColor="@color/greyDark" 
     android:drawable="@drawable/list_item_disabled" /> 
    <!-- Pressed --> 
    <item 
     android:state_enabled="true" 
     android:state_pressed="true" 
     android:textColor="@android:color/white" 
     android:drawable="@drawable/list_item_pressed" /> 
    <!-- Focused --> 
    <item 
     android:state_enabled="true" 
     android:state_focused="true" 
     android:textColor="@android:color/white" 
     android:drawable="@drawable/list_item_focused" /> 
    <!-- Default --> 
    <item 
     android:state_enabled="true" 
     android:drawable="@drawable/list_item_unfocused" /> 
</selector> 

回答

1

哈克: 使用getView檢查禁用的項目邏輯,並與另一個佈局膨脹視圖。 isEnabled仍然有用。

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) mContext 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View row; 

    if (mListItem[position].isEnabled() == false) row = inflater.inflate(
      R.layout.list_row_disabled, null); 
    else { 
     row = inflater.inflate(R.layout.list_row, null); 
     // set right extensible icon 
     if (mListItem[position].getType()) { 
      ImageView ic_arrow = (ImageView) row.findViewById(R.id.list_row_arrow); 
      ic_arrow.setImageResource(R.drawable.ic_arrow_right); 
     } 
    } 
    // set left icon 
    ImageView ic_item = (ImageView) row.findViewById(R.id.list_row_icon); 
    ic_item.setImageResource(mListItem[position].getIcon()); 
    // blend icon if item is disabled 
    if (mListItem[position].isEnabled() == false) 
     ic_item.setColorFilter(0x99D0D0D0,Mode.SRC_ATOP); // make icons look grayer 

    // set title text 
    TextView txvTitle = (TextView) row.findViewById(R.id.list_row_title); 
    txvTitle.setText(mListItem[position].getTitle()); 

    return row; 
} 

@Override 
public boolean isEnabled(int position) { 
    return mListItem[position].isEnabled(); 
} 
9

在適配器功能的IsEnabled()不僅使項目unfocusable和無法點擊。 您需要在adapter.getView()的末尾撥打view.setEnabled()以使選擇器正常工作。

此外,對於將啓用狀態傳遞給其後代的父視圖,您需要在xml文件中爲子視圖指定屬性android:duplicateParentState="true"

+0

請注意未來的讀者:不要做我所做的事情,並假設我只需要第一部分,因爲我的XML佈局文件中沒有嵌套佈局! – cqcallaw

相關問題