Android TV(开发) GradView刷新后抢焦点的问题

问题描述

GridView设置setFocusable为false,当前焦点也确实不在GridView上,但是第一个item的文字在跑马。
所以综合下来是,刷新后GridView的第一个item默认被select了。如果GridView设置有selector,就可以看到虽然它没有焦点,但是第一个item是被选中的。
此问题只出现在SDK4.4中

参考了:https://blog.csdn.net/sapodilla/article/details/77944305
得知这个问题是android4.4的一个BUG,在调用notifyDataSetChanged的时候注释掉了判断touchmode的代码,导致一调用notifyDataSetChanged就模拟用户点击了gridview。

解决方法

继承gridview重写里面的isInTouchMode方法

public class CommonGridView extends GridView {
    public CommonGridView(Context context) {
        super(context);
    }

    public CommonGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CommonGridView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public CommonGridView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    public boolean isInTouchMode() {
        Log.d("Main", "CommonGridView  isInTouchMode()   super.isInTouchMode():" + super.isInTouchMode() + "    hasFocus():" + hasFocus());
        if (Build.VERSION.SDK_INT == 19) {
//            return !(hasFocus() && !super.isInTouchMode());
//            return (hasFocus() && !super.isInTouchMode());
            return !isInTouchMode;
        }
        return super.isInTouchMode();
    }

    // 是否要获取焦点
    boolean isInTouchMode;
    public void setInTouchMode(boolean hasFocus){
        isInTouchMode = hasFocus;
    }
}

注:在实际使用中isInTouchMode()返回true,是不获取焦点,第一个item不会被seleted。返回false,则会被选中。

我这里不同的是,在界面初始化时GridView不可以抢焦点,但是焦点从左侧移动到它身上时要求它获取焦点。如果isInTouchMode()一直返回true,即使GradView的focusable为true也获取不到焦点,所以需要在外部动态设置setInTouchMode()。

你可能感兴趣的:(不试不知道)