问题描述
Android TV使用recyclerview开发类似时光轴相册功能,recyclerview的每个Item为一个linearLayout,linearLayout中又包含两个linearLayout,第一个展示文字标题,第二个包含6个ImageView,当翻页到底部后,再按遥控器向下键,此时需要从网络加载新的图片展示到Item中,按键后,从网络上下载图片,此时recyclerview无法生成下一个Item对应的View,导致焦点仍然在当前的Item上,待数据更新完成后adapter才会调用notifyItemChanged通知recyclerview数据更新(不能调用notifyDataSetChanged,因为会刷新整个界面,焦点丢失),此时,有两个问题:
(1)recyclerview不会自动滚动展示最新更新的第一个Item
(2)recyclerview不会将焦点设置到最新更新的第一个item
第(1)个问题解决办法
在数据更新成功后,首先取得当前焦点对应Item:
View view = mRecyclerView.getLayoutManager().getFocusedChild();
然后取得Item对应的position:
int position = mRecyclerView.getLayoutManager().getPosition(view);
最后滚动到最新更新的第一个Item
mRecyclerView.scrollToPosition(position + 1);
第(2)个问题解决办法
在(1)中,当滚动显示最新Item后,调用Instrumentation工具模拟物理向下按键(因为真实按键后,item还没加载,focus还处于原来的最后一个item上):
onKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN);
public static void onKeyEvent(final int keyCode) {
new Thread() {
public void run() {
try {
// 暂停100ms是等待最新加载的第一个item view生成,否则焦点不会移动,还是在加载前的最后一个item上
Thread.sleep(100);
Instrumentation inst = new Instrumentation();
inst.sendKeyDownUpSync(keyCode);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
注意:
(1)Instrumentation类方法sendKeyDownUpSync不能在UI主程序中使用,需要另开线程
(2)调用mRecyclerView.scrollToPosition(position + 1)滚动到第一个最新Item后,不能立即发送向下按键,因为此时最新的ItemView可能还没有生成,需要等待一定时间(我设置为等待100ms,看具体情况设置),否则找不到焦点,导致焦点跑飞