Android TV中使用RecyclerView长按或者连续按键焦点飞掉的问题

导言

转载请注明出处: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也是同一个道理。
项目中实测没问题,如果有不足的地方,留言交流。

    原文作者:zou_pl
    原文地址: https://blog.csdn.net/Zou_pl/article/details/77507376
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞