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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,297评论 25 709
  • 目录介绍 1.RecycleView的结构 2.Adapter2.1 RecyclerView.Adapter扮演...
    杨充211阅读 8,272评论 3 17
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 14,472评论 2 59
  • 简介: 提供一个让有限的窗口变成一个大数据集的灵活视图。 术语表: Adapter:RecyclerView的子类...
    酷泡泡阅读 10,608评论 0 16
  • 今天,是星期一 那个人今天比赛比完了,回来了 回来了也不能见到吧 但知道他回来就好! (*^ω^*) (*^ω^*)
    Lonelyeyes阅读 728评论 0 0