那些年,我们爬过的坑--Andriud TV篇(一)
从去年开始,从事Android TV开发已经大半年了,期间遇到过各种各样的坑,最严重、最难解决的莫过于焦点问题。痛定思痛,决定把TV开发中遇到的各种坑一一分享出来,让更多的人不再爬我所爬过的坑。
列表焦点问题
在TV开发中,VerticalGridView是谷歌专门为Android TV适配的RecyclerView,VerticalGridView很好的解决了列表的焦点问题,但是如果使用不当,很容易出现item子项焦点错乱问题。
在TV开发中尽量尽可能不适用没有优化过的RecyclerView!!!!!
小坑—–item焦点无法获取问题
进入列表界面,我希望的是按上下左右按键,item将能取得焦点,实现放大效果,但是我的实际效果如图所示,按上下键,变成了列表上下滚动,而不是我希望实现的item放大。
mList.requestFocus(); |
在列表里面,无论我如何获取焦点,item子项目都获取不到焦点,找了好多种方法都无法完美解决。最后发现,只要在item的xml根节点添加android:focusable="true"
便能完美解决。
吐血啊…
|
中坑—–列表获取item总数错误问题
在使用VerticalGridView,如果item的数量需要滑动才能显示完成,那么在你获取列表item总数时就会出现一个有趣的现象:
在VerticalGridView中无论你调用那个方法,你都不能准确获取到列表中Item的总数量。
如果你需要获取列表中Item的总数量,只能采取曲线救国的方案:利用Adapter来获取总数。
如下图所示,我列表item总数为16。
Log.d(TAG, "COUNT_1 ==> " + mList.getLayoutManager().getChildCount()); |
在使用上述的三种方法中,只有第三种才能准确获取列表中Item准确的数量。出现这问题的原因是:
- VerticalGridView.getLayoutManager().getChildCount();只能获取当前列表中当前可见的所有item。
- VerticalGridView.getChildCount();为ViewGrounp的重写方法,而在RecyclerView缓存原理中,RecyclerView只会显示当前所有可见的View,所以这个方法的效果和第一种方法得出的结果是一致的。
大坑—–手动请求Item焦点错乱问题
有的时候,我们需要让指定的item获取焦点,如果你的列表有4行,但是当前屏幕只显示了3行,这个时候,如果需要请求焦点的item恰好处于第4行,那么当你使用
mList.getLayoutManager().getChildAt(postion).requestFocus(); |
去让指定的item获取焦点,这个时候会出现空指针异常,原因和上面list获取item总数错误的原因一致。
解决这个问题的方案为:先让VerticalGridView移动到该item,然后再处理item焦点请求。
如下代码所示:
mList.scrollToPosition(14); |
神坑—–手贱给VerticalGridView添加LayoutManager导致的问题
如果你使用VerticalGridView或者HorizontalGridView,是不需要自己添加LayoutManager的,如果你手贱添加LayoutManager,并且当你想让指定的Item获取焦点,则会导致Item焦点错乱,然后按上下左右键,焦点和预期不一致。
如下图所示,我向第14个item请求焦点,最终发现,第14个item焦点获取失败,按上下左右键,焦点和预期不一致。
解决方案:
去掉手贱添加的LayoutManager!!!
那些年,我们爬过的坑--Andriud TV篇(一)
https://www.laoyuyu.me/2017/02/17/那些年,我们爬过的坑-Andriud-TV篇(一)/