2018-11-28 Recyclerview 展示网络图片, 刷新Item后,焦点不更新到最新加载的第一个item

问题描述

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,看具体情况设置),否则找不到焦点,导致焦点跑飞

你可能感兴趣的:(2018-11-28 Recyclerview 展示网络图片, 刷新Item后,焦点不更新到最新加载的第一个item)