导言

转载请注明出处:http://blog.csdn.net/Zou_pl/article/details/77507376

刚开始使用RecyclerView的时候,在TV上也遇到了焦点找不到或者乱掉的问题,那时候写了一篇文章Android中RecyclerView的使用(焦点控制) 。这篇文章主要是讲普通的按键操作如何解决寻找焦点,有兴趣的可以去看看。
而在后面的多个Android TV项目中,使用RecyclerView,肯定会遇到快速按键总会导致焦点飞掉、乱掉的问题。主要的思路是采用以下两种思路解决:


  1. 在BaseActivity中控制按键速度
  2. 对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也是同一个道理。
项目中实测没问题,如果有不足的地方,留言交流。

更多相关文章

  1. 如何“任性”使用Android的drawText()
  2. Android(安卓)访问GPS获取位置信息
  3. android中setNegativeButton和setNeutralButton的区别是什么?
  4. Android(安卓)使用基于位置的服务(一)
  5. Android(安卓)TV RecyclerView 焦点处理及获取焦点的Item保持在
  6. android 應用程序安裝SD卡
  7. android去掉EditView的默认焦点问题
  8. Android日记之2012\01\13
  9. Android(安卓)GPS定位 获取经纬度

随机推荐

  1. 浅谈Android中MVC、MVP、MVVM模式(二)
  2. KJFrameForAndroid(安卓)1.3beta 发布,And
  3. 深刻解析 Android(安卓)的 AIDL 介面
  4. android style(样式)和theme(主题)设置
  5. Android异步处理一:使用Thread+Handler实
  6. Android开发实践:Android交叉编译工具链的
  7. Android中多线程同步问题
  8. 移动端app开发-02-iPhone/iPad/Android(
  9. Android事件分发机制详解:史上最全面、最
  10. Android:你要的WebView与 JS 交互方式 都