Android TV中使用RecyclerView长按或者连续按键焦点飞掉的问题
来源:互联网 发布:linux添加中文输入法 编辑:程序博客网 时间:2024/05/28 15:25
导言
转载请注明出处:http://blog.csdn.net/Zou_pl/article/details/77507376
刚开始使用RecyclerView的时候,在TV上也遇到了焦点找不到或者乱掉的问题,那时候写了一篇文章Android中RecyclerView的使用(焦点控制) 。这篇文章主要是讲普通的按键操作如何解决寻找焦点,有兴趣的可以去看看。
而在后面的多个Android TV项目中,使用RecyclerView,肯定会遇到快速按键总会导致焦点飞掉、乱掉的问题。主要的思路是采用以下两种思路解决:
- 在BaseActivity中控制按键速度
- 对RecyclerView设置LayoutManager,在LayoutManager中控制焦点
关于第一种思路,可以参考我的这篇博客Android TV 控制焦点按键速度。
关于第二种思路,就是今天这篇博客来讲的内容。
RecyclerView长按交掉失去的原因分析
RecyclerView设置适配器,将数据全部填充进去之后,并不会讲所有的item的view创建出来,只会创建出显示和需要的item的View,没有显示的Item的View很可能没有被创建。所以在快速移动的时候,RecyclerView并没有创建那个应该获取焦点的View,所以导致焦点飞到其他可承载焦点的View上去了。
在RecyclerView的LayoutManager中,有这样一个方法onInterceptFocusSearch(View focused, int direction),这个方法就是用于寻找焦点的。当遇到长按或者连续按键焦点飞掉的情况时,需要重载RecyclerView的LayoutManager,重写此方法。
解决方法
重写RecyclerView的LayoutManager中的onInterceptFocusSearch(View focused, int direction),具体如下:
@Override public View onInterceptFocusSearch(View focused, int direction) { int count = getItemCount();//获取item的总数 int fromPos = getPosition(focused);//当前焦点的位置 int lastVisibleItemPos = findLastVisibleItemPosition();//最新的已显示的Item的位置 switch (direction) {//根据按键逻辑控制position case View.FOCUS_RIGHT: fromPos++; break; case View.FOCUS_LEFT: fromPos--; break; } Log.i("zzz", "onInterceptFocusSearch , fromPos = " + fromPos + " , count = " + count+" , lastVisibleItemPos = "+lastVisibleItemPos); if(fromPos < 0 || fromPos >= count ) { //如果下一个位置<0,或者超出item的总数,则返回当前的View,即焦点不动 return focused; } else { //如果下一个位置大于最新的已显示的item,即下一个位置的View没有显示,则滑动到那个位置,让他显示,就可以获取焦点了 if (fromPos > lastVisibleItemPos) { scrollToPosition(fromPos); } } return super.onInterceptFocusSearch(focused, direction); }
上面的例子只针对LinearLayoutManager而言,但是GridLayoutManager也是同一个道理。
项目中实测没问题,如果有不足的地方,留言交流。
- Android TV中使用RecyclerView长按或者连续按键焦点飞掉的问题
- Android TV RecyclerView焦点移动飞框的实现
- Android RecyclerView中item焦点乱跳问题(适用于PDA以及TV等带方向键的安卓设备)
- Android中RecyclerView的使用(焦点控制)
- Android TV中按键事件和焦点处理总结
- Android TV中WebView的按键响应问题
- Android tv版本button焦点使用问题
- RecyclerView在TV使用中碰到的问题和解决方案
- android TV 焦点 问题
- android TV 焦点 问题
- Android TV 上使用的RecyclerView和焦点框架,焦点框移动效果,完胜androidTvwidget的MainUpView
- Android TV 关于gridview的焦点问题
- RecyclerView 在tv端 焦点问题
- Android TV 焦点与按键事件分析
- Android TV 控制焦点按键速度
- Android TV 焦点与按键事件分析
- Android TV应用 RecyclerView 焦点乱跑问题解决
- Android中RecyclerView在TV中处理控件焦点移动,EditText值的修改,CheckBox复用等问题解决
- 1043. 输出PATest(20) Hash散列
- android inflate初探
- dubbo使用帮助
- c语言复习笔记一
- php 调用接口方式
- Android TV中使用RecyclerView长按或者连续按键焦点飞掉的问题
- linux 下c/c++ 连接mysql数据库全过程-----已经通过验证
- 链路聚合—3种模式 详细
- warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
- vue中如何不通过路由直接获取url中的参数
- 宽度变小,菜单项减少,并添加到更多项里
- hdu2665主席树(可持久化线段树)
- java解析xml转为Map
- HDU 6158 The Designer 笛卡尔定理+韦达定理 2017ccpc网络赛