Android(安卓)TV中使用RecyclerView长按或者连续按键焦点飞掉的问题
导言
转载请注明出处: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的drawText()
- Android(安卓)访问GPS获取位置信息
- android中setNegativeButton和setNeutralButton的区别是什么?
- Android(安卓)使用基于位置的服务(一)
- Android(安卓)TV RecyclerView 焦点处理及获取焦点的Item保持在
- android 應用程序安裝SD卡
- android去掉EditView的默认焦点问题
- Android日记之2012\01\13
- Android(安卓)GPS定位 获取经纬度