Отключить элементы списка с помощью селектора и isEnabled () - PullRequest
3 голосов
/ 19 июля 2011

Область : - используя переопределенный ArrayAdapter; - с помощью селектора; - использование isEnabled для отключения предметов.

Aim : - отключить некоторые элементы списка и загрузить отключенное представление состояния через селектор.

Задача : - все работает (пользовательский вид, селектор для несфокусированного, фокусированного и нажатого состояний), но отключенные элементы не используют селектор для отключенного состояния.

Расследование : когда я использую 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>

Ответы [ 2 ]

9 голосов
/ 17 января 2014

Функция isEnabled () в адаптере делает объект не сфокусированным и не щелкающим. Вам нужно позвонить view.setEnabled() в конце adapter.getView(), чтобы ваш селектор заработал.

Кроме того, чтобы родительское представление передавало состояние разрешения своим потомкам, необходимо указать атрибут android:duplicateParentState="true" для дочерних представлений в файле xml.

1 голос
/ 19 июля 2011

Взломать: использовать 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();
}
...