最近在做点播功能时,发现有些电视GridView焦点不在时,之前选中的Item还有Selector状态。经过一番资料查找,总结几个方法(目前项目用的是第3种):
1、item默认firs item selected 那么他的selector会成selected状态,可以设置gridview.setFocusable(false)来解决,但是这样需要手动设置遥控器事件,用起来比较繁琐。
2、当焦点离开GridView时,可以在OnFocusChangedListener里面添加监听事件,比如当无焦点时设置gridview.setSelection(-1),如下:
gridview.setOnFocusChangedListener(new View.OnFocusChangedListener(){
@SuppressLint("NewApi")
@Override
public void onFocusChange(View v,boolean hasFocus){
if(!hasFocus){
GridView gView=(GridView)v;
gView.setSelection(-1);
}
}
});
经过验证,发现问题确实解决,但是还是会存在一些体验性的问题,就是在焦点移除时,GridView会默认滚动到第一项,这有点不完美。
3、自定义GridView,在里面加入一个是否聚焦的变量,在OnFocusChangedListener中设置该变量,然后重写getChildStaticTransformation方法,在这个方法中判断子View是否被选中,如果是则设置特殊背景,否则将背景置为null。具体代码如下:
gridview.setOnFocusChangedListener(new View.onFocusChangedListener(){
@Override
public void onFocuChanged(View v,boolean hasFocus){
MyGridView gridview=(MyGridView)v;
if(hasFocus){
gridview.setFocus(false);
}else{
gridview.setFocus(true);
}
}
});
在自定义的GridView中重写
@Override
protected boolean getChildStaticTransformation(View child,Transformation t){
if(child == getSelectedView() && child.isSelected()){
if(isFocus){
child.setBackground(自定义背景);
}else{
child.setBackground(null);
}
}
}
这个方法相比前2种,用起来方便,不必手动设置Focusable,而且没有无焦点时自动滚动到一个Item的情况。