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,肯定会遇到快速按键总会导致焦点飞掉、乱掉的问题。主要的思路是采用以下两种思路解决:


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

阅读全文
0 0
原创粉丝点击