Checkable интерфейс и элементы списка

В Android элементы списка имеют разные состояния в зависимости от разметки. Для того, чтобы выбранный элемент списка был подсвечен, используется разметка android.R.layout.simple_list_item_activated_1, которая доступна для Android 3 (API 11) и выше. Если вы хотите использовать такое поведение элемента на Android 2 и ниже, то нужно создать класс, который реализует интерфейс Checkable.

public class CheckableRelativeLayout extends RelativeLayout implements Checkable {
    private static final int[] CHECKED_STATE_SET = { android.R.attr.state_checked };
    private boolean cheched;

    public CheckableRelativeLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        cheched = false;
    }

    @Override
    public boolean isChecked() {
        return cheched;
    }

    @Override
    public void setChecked(boolean checked) {
        this.cheched = checked;
        refreshDrawableState();
    }

    @Override
    public void toggle() {
        cheched = !cheched;
        refreshDrawableState();
    }

    @Override
    protected int[] onCreateDrawableState(int extraSpace) {
        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
        if (isChecked()) {
            mergeDrawableStates(drawableState, CHECKED_STATE_SET);
        }
        return drawableState;
    }
}

В этом примере мы наследуется от RelativeLayout и реализуем Checkable интерфейс. Теперь эту разметку можно использовать при описание разметки элемента ListView или GridView:

<?xml version="1.0" encoding="utf-8"?>
<com.example.widget.CheckableRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/sliding_menu_item"
    android:minHeight="?android:attr/listPreferredItemHeight" >

    <TextView
        android:id="@android:id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</com.example.widget.CheckableRelativeLayout>

com.example.widget.CheckableRelativeLayout это наш класс с указание пакета, а ?android:attr/listPreferredItemHeight это минимальная предпочтительная высота элемента списка в Android. Обязательно нужно указать android:background, в котором указано состояние android:state_selected.

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:color="@color/red" />
    <item android:color="@color/white" />
</selector>

Когда элемент списка будет выбран пользователем, он поменяет свой цвет. Такой подход дает совместимости с Android 2 и ниже, и дает возможность подсветить выбранный элемент без использования RadioButton или CheckBox компонентов.

Комментариев нет:

Отправить комментарий