Отключить элементы списка с помощью селектора и isEnabled()
Область применения: - использование переопределенного ArrayAdapter; - с помощью селектора; - использование isEnabled для отключения элементов.
Цель: - отключить некоторые элементы списка и загрузить отключенное представление состояния через селектор.
Проблема: - все работает (пользовательский вид, селектор для несфокусированного, фокусированного и нажатого состояний), но отключенные элементы не используют селектор для отключенного состояния.
Расследование: когда я использую isEnabled для отключения некоторых элементов в списке просмотра, Hierarchy Viewer показывает, что отключенные элементы не могут быть сфокусированы, не кликабельны, но (!) Включены.
Это ошибка или чего-то не хватает?
PS на самом деле, в документах говорится, что isEnabled не делает setEnabled (false) для элемента списка, он делает его объектом делителя (?). PPS Я также пытался использовать оператор 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 ответа
Взлом: используйте 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() в адаптере делает элемент не сфокусированным и не щелкающим. Вам нужно позвонить view.setEnabled()
в конце adapter.getView()
сделать ваш селектор функциональным.
Кроме того, чтобы родительское представление передавало состояние включения своим потомкам, необходимо указать атрибут android:duplicateParentState="true"
для дочерних просмотров в вашем XML-файле.