本文只讨论如何解决Android TV应用 RecyclerView 焦点乱跑的问题.

RecyclerView的使用方法,大家可以参考此篇博文:http://blog.csdn.net/lmj623565791/article/details/45059587

使用示例:

public static final int ITEMS_COUNT_ONE_LINE = 6;mRecyclerView = (RecyclerView) root.findViewById(R.id.rv);mGridLayoutManager = new FocusGridLayoutManager(getContext(), ITEMS_COUNT_ONE_LINE);mGridLayoutManager.setOrientation(RecyclerView.VERTICAL);mRecyclerView.setLayoutManager(mGridLayoutManager);

解决此问题的核心是修改 FocusGridLayoutManager


public class FocusGridLayoutManager extends android.support.v7.widget.GridLayoutManager {}

在此GridlayoutManager中,重载方法onInterceptFocusSearch

@Override    public View onInterceptFocusSearch(View focused, int direction) {        if (direction == View.FOCUS_DOWN) {            int pos = getPosition(focused);            int nextPos = getNextViewPos(pos, direction);            int size = getChildCount();            int count = getItemCount();            if (size > 0) {                int startIndex = 0;                if (size >= mSpanCount) {                    startIndex = size - mSpanCount;                }                View view;                for (int i = startIndex; i < size; i++) {                    view = getChildAt(i);                    if (view == focused) {                        int lastVisibleItemPos = findLastCompletelyVisibleItemPosition();                        if (pos > lastVisibleItemPos) { //lastVisibleItemPos==-1 ||                            return focused;                        } else {                            int lastLineStartIndex = 0;                            if (count >= mSpanCount) {                                lastLineStartIndex = count - mSpanCount;                            }                            if (pos >= lastLineStartIndex && pos < count) { //最后一排的可见view时,返回当前view                                return focused;                            }                            break;                        }                    }                }            } else {                return focused;            }        }        return super .onInterceptFocusSearch(focused, direction);    }

最核心的是两个地方

1.if (pos > lastVisibleItemPos)  若当前要显示的位置,大于可见的Item的位置,即此时,有可能焦点会乱跑了,此时,返回当前的View作为下一个要Focus的View.

 2.if (pos >= lastLineStartIndex && pos < count)  最后一排的可见view时,返回当前view,避免会加载看不见的view,此时也会乱跑。

至此,解决了乱跑问题。其他类型的LayoutManager也可照此方法解决。

更多相关文章

  1. 解决Android(安卓)SDK Manager,ADT无法在线更新的问题
  2. 百度地图在android的使用
  3. Android保活/拉活(一)教程检索
  4. 【Android(安卓)开发教程】AbsoluteLayout绝对布局
  5. 转 android背景选择器selector用法汇总
  6. android文件、资源读取总结
  7. Android(安卓)View非常用属性介绍
  8. Android(安卓)gradle和gradle插件配置
  9. android 可自定义大小和位置的Dialog

随机推荐

  1. 一道简约而不简单的算法题--数据流的中位
  2. GitHub 热门:Python 算法大全,Star 超过 2
  3. GitHub 热门:别再用 print 输出来调试代码
  4. 真香!GitHub 核心功能都免费开放了
  5. 一网打尽!二分查找解题模版与题型全面解析
  6. 数据结构与算法——最小生成树
  7. 钻漏洞,他用爬虫非法获取 1500 万余条个人
  8. 有效解决U盘文件变成exe格式的方法
  9. 几道和「黑洞照片」那种海量数据有关的算
  10. 2020 年 Python 开发者调查报告:PyCharm