Android 使用选择器和isEnabled()禁用listview项

Android 使用选择器和isEnabled()禁用listview项,android,xml,listview,android-arrayadapter,Android,Xml,Listview,Android Arrayadapter,范围: -使用重写的ArrayAdapter; -使用选择器; -使用isEnabled禁用项目 目标: -禁用某些列表项并通过选择器加载禁用状态视图 问题: -一切正常(自定义视图、未聚焦、聚焦和按下状态的选择器),但禁用项不使用禁用状态的选择器 调查:当我在listview层次结构查看器中使用isEnabled禁用某些项目时,显示禁用的项目不可聚焦、不可链接,但已启用(!) 它是一个错误还是缺少什么 另外,实际上,文档说isEnabled并没有对列表项执行setEnabled(false),

范围: -使用重写的ArrayAdapter; -使用选择器; -使用isEnabled禁用项目

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

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

调查:当我在listview层次结构查看器中使用isEnabled禁用某些项目时,显示禁用的项目不可聚焦、不可链接,但已启用(!)

它是一个错误还是缺少什么

另外,实际上,文档说isEnabled并没有对列表项执行setEnabled(false),它使它成为一个分隔符(?)对象。 P.P.S我还尝试使用if语句将我的视图(在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>

黑客:
使用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();
}
适配器中的函数isEnabled()只会使项不可聚焦和不可访问。 您需要在
adapter.getView()
的末尾调用
view.setEnabled()
,以使选择器正常工作


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

未来读者注意:不要像我那样做,假设我只需要第一部分,因为我的xml布局文件中没有嵌套的布局!