让GridView(ListView)记住上次的离开的位置

/ 0评 / 0

前言

在Android TV的开发中,最麻烦的就是焦点控制问题了,系统的默认行为就是寻找当前按键方向上最近的能获取焦点的控件,虽然部分控件,比如TextView、Button等可以在xml文件中使用android:nextFocusLeft(Right/Up/Down)等来控制下一个拥有焦点的View,但是对于复杂点的,比如GridView就不那么方便了,要实现的功能是当焦点从GridView上离开然后回到GridView默认选中的还是离开时拥有焦点的子View。如下图。当向上进入分类栏时,回到列表还是选中默认的那个View。

实现

实现方法很简单,就是重写GridView的onFocusChanged()方法,当GridView整体失去/获取焦点的时候会被调用。当检测到失去焦点的时候记录下当前位置,然后获取焦点以后再设置即可。

// 最后一次拥有焦点的位置
public int lastSelectItem = 0;

@Override
protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
    super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
    if (gainFocus) {
        setSelection(lastSelectItem == -1 ? 0 : lastSelectItem);
    } else {
        lastSelectItem = getSelectedItemPosition();
    }
    Log.i(TAG, "onFocusChanged@gainFocus = " + gainFocus + " lastSelectItem = " + lastSelectItem);
}

参考博客:享受技术带来的快乐

发表评论

您的电子邮箱地址不会被公开。