使用selector和isEnabled()禁用listview项

时间:2011-07-19 09:15:40

标签: android xml listview android-arrayadapter

范围: - 使用overriden ArrayAdapter; - 使用选择器; - 使用isEnabled禁用项目。

目标: - 禁用某些列表项并通过选择器加载禁用状态视图。

问题: - 一切正常(自定义视图,未聚焦,焦点和按下状态的选择器)但禁用的项目不使用选择器来禁用状态。

调查:当我使用isEnabled禁用listview中的某些项时,层次结构查看器显示禁用的项目不可聚焦,不可点击但启用了(!)。

错误还是缺少什​​么?

P.S。实际上,docs说isEnabled没有为列表项做setEnabled(false),它使它成为一个divider(?)对象。 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>

2 个答案:

答案 0 :(得分:9)

适配器中的函数isEnabled()只使项目不可聚焦且不可点击。 您需要在view.setEnabled()结束时致电adapter.getView()以使您的选择器正常运行。

此外,对于将启用状态传递给其后代的父视图,您需要为xml文件中的子视图指定属性android:duplicateParentState="true"

答案 1 :(得分: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();
}