电视TV端使用RecyclerView开发遇到的问题

针对Android TV端使用的自定义RecyclerView 在Android TV中开发, 需要处理焦点的移动, 为了达到醒目的作用一般都会添加焦点移动动画和焦点选中放大效果, 为了方便在TV端使用RecyclerView, 故自定义TvRecyclerView来实现焦点选中与移动的效果.效果如下:一. TvRecyclerView使用 (1) 在布局中添加 TvRecyclerView <app.com.tvrecyclerview.TvRecyc 阅读详情

最近在做一个TV端使用的相册。

偷偷展示一下,相册大概长这个样子:
相册界面

相册也支持多选删除:
相册多选删除界面

非删除模式下点击单一图片会进入单一图片展示界面。单一图片可以左右翻页。
单一图片展示

从展示界面返回相册界面,光标定位到展示图片所在的相册位置。

主要控件使用了CardView 和RecyclerView。
TV开发和手机开发有个不同的就是焦点问题。
在手机端,手指只要一划就可以到后面了,而在TV端,需要用遥控器左右键控制焦点移动。

RecyclerView(简称RV)在TV端的应用可以借鉴的案例不多,相比于ListView,RV的很多功能都需要自己实现。诸如,wrap_content自适应问题,选中的背景问题,setSelection()方法等。

将遇到的问题及大致解决方法mark一下,方便以后查询。


1.wrap_content自适应问题

参见RecyclerView自适应高度的LayoutManager

2.RV占据焦点,RV的子View没有获取焦点(ps:工程使用的是androidannotations框架,以下代码使用了androidannotations注解)

需要在RV获取焦点后手动设置下焦点:

@FocusChange(R.id.id_recyclerview_horizontal)
void focusRecyclerView(boolean hasFocus) {
        if (hasFocus) {
            focusChild(false);
        }
    }

 @UiThread
 void focusChild(boolean isInit) {
        if (mRecyclerView.getChildCount() > 0) {
            mRecyclerView.getChildAt(0).requestFocus();
        }
        if (isInit) {
            mAct.setSelectPos(0);
        }
    }

3.多选问题
多选问题一开始是使用的List保存需要删除的图片位置,在onBindViewHolder方法中根据list中的数据来做判断,决定显示垃圾筐(选择状态)还是正常图片(非选择状态)。这样做也能达到效果,但由于Item的View是一个包含多个控件的FrameLayout,这样写需要getChildAt或者findViewById来决定取舍,觉得这样有点low。
最后选择了com.bignerdranch.android.multiselector工具
嗯,好用。

4.选中的背景问题
在SwappingHolder的子类中复写如下方法:

 @Override
public void setSelectionModeBackgroundDrawable(Drawable selectionModeBackgroundDrawable) {  super.setSelectionModeBackgroundDrawable(mAct.getResources().getDrawable(R.drawable.selector_list_item_shadow));
}

5.setSelection()方法,跳转到最后几个Item的问题
RV没有setSelection方法,官方API是这么说的

RecyclerView will scroll the minimum amount that is necessary to make the target position visible. If you are looking for a similar behavior to setSelection(int) or setSelectionFromTop(int, int), use scrollToPositionWithOffset(int, int).
有个问题就是,如果总共有15张图片,最后一页展示4个图片,那么跳转到pos大于11的图片时候,焦点却在pos==11的图片位置上。所以这个时候需要手动设置下。

@UiThread
void fouceSelected() {
if (mAct.getSelectPos() 
<= linearLayoutManager.findLastVisibleItemPosition() &&
mAct.getSelectPos() >=linearLayoutManager.findFirstVisibleItemPosition()) {
            linearLayoutManager.findViewByPosition(mAct.getSelectPos()).requestFocus();

int focusPos = mRecyclerView.getChildCount() + mAct.getSelectPos() - linearLayoutManager.findLastVisibleItemPosition() - 1;
mRecyclerView.getChildAt(focusPos).requestFocus();
        }
    }

获取RV当前显示的第一个控件的位置和最后一个控件显示的位置来计算出当前应该获取焦点的View的位置,把焦点交给它。


Androdi TV开发之VerticalGridView 一、概述 VerticalGridView是Android TV开发中常用到的控件,是TV版的RecyclerView。不过他确实也是基于RecyclerView实现的,只是针对TV的场景做了一些扩展,比如切换焦点时item的对齐,记住item焦点并恢复,item获取焦点后的放大效果等等。可以看到其实大部分都是与焦点相关的,确实,手机与电视开发中最大的差异就是交互方式不同,一个是手指触摸,一个是通过遥控器切换焦点来操作。 相比RecyclerView,VerticalGridView 用起来会麻烦一点,不仅 阅读详情

相关推荐

Android TV端高效自定义RecyclerView控件开发实战

Android TV的焦点机制是基于View的可聚焦性(focusability)和布局层级结构进行管理的。当用户通过方向键移动焦点时,系统会根据当前焦点位置和目标方向,查找下一个可聚焦的View,并触发焦点状态的变化。理解焦点的查找与传递流程,以及焦点层级的控制逻辑,是实现良好TV端交互体验的基础。为了提升TV端的交互体验,可以在Item获取焦点时加入平滑动画,例如缩放、颜色渐变等。通过监听焦点变化,并执行动画:} else {});

weixin_42181686的博客 841

Android TvRecyclerView-任意定义焦点位置-多布局等复杂布局适应-支持焦点缩放效果-尤其适用于TvLauncher。

先聊会天儿,正文开始有标记,可直接跳过。或者你看效果满足了你的需求,直接去下载项目也行。        最近一直在做一个类TvLauncher,为什么说是“类”呢?因为在我实在Launcher3的基础上又添加了两类Launcher,一类是GameLauncer--类似XBox等大型游戏机的主界面;而另一类就是TvLauncher--同普通的智能电视主界面一样,但我们的设计更加酷炫。所以其实是一种带...

God丶Davide的博客 8万+

TvRecyclerView:TvRecyclerView--针对TV端特性进行的适配与开发

欢迎使用 TvRecyclerView 针对TV端的特性对RecyclerView进行了适配与开发; 优化在TV端的适配和延伸; 支持v7包原生的LayoutManager; 支持阿里的布局及其它第三方LayoutManager; 效果 Android Studio 集成 // support版本 implementation 'com.owen:tv-recyclerview:2.1.1.1' // androidx版本 implementation 'com.owen:tv-recyclerview:3.0.0' 自定义属性 属性 值/类型 简介 tv_layoutManager string 指定LayoutManager tv_selectedItemOffsetStart dimension 选中的item距离开始(上/左)的偏移量, 与tv_selectedItemIsCent

google oauth认证与使用youtube的api-4,上市场

iframe的播放器,底部是谷歌的,所以做两个bar,把顶与底全部盖住,默认参数 就不显示controls了,传0.然后进入播放时,就把底部的栏显示出来,当播放状态变了播放中,就隐藏,这要判断是不是第一次初始化,因为有可能播放中点击了暂停,同样要显示所有的信息栏.一个列表加载,要有加载中的loading,失败时要显示失败的样式,一点不能少.任何一个可见的可点击的控件,都要通过上中下左右这简单的遥控能导航过去的.谷歌的模拟器,我m2的电脑,只能竖屏,头都快搞歪了.里面的遥控就是官方文档里面一样的.

archko的专栏 1584

androidTV 自定义RecyclerView让当前焦点item显示在中间

AndroidTV中自定义RecyclerView 让当前焦点item显示在中间,调用smoothToCenter(pos)就可以。

TvRecyclerView

TvRecyclerView满足TvLauncher的界面布局需求,焦点框位置定义,焦点框效果修改,FocusView缩放效果及倍数设置等。

android tv recycview,Android TV端RecyclerView焦点乱跑

最近在做TV端的项目着实一脚一个坑,焦点问题是解决TV端开发的关键本篇文章解决当用RecyclerView展示数据,浏览到最后一个item时焦点乱跑的问题直接上代码了@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_DOWN)...

weixin_32876681的博客 587

Android-RecyclerView自定义LayoutManager

RecyclerView自定义LayoutManager

RecycleView调用notifyDataSetChanged在Tv端焦点丢失问题

电视端开发的小伙伴可能遇到过这样一个问题:当使用recycleview加载更多的时候,调用notifyDataSetChanged方法,焦点会丢失或者跑到第一个item上了,当初翻遍了baidu也没找到解决办法.     最近闲下来,仔细的在stackoverflow上寻找解决办法,终于找到了.     重新添加数据不要使用notifyDataSetChanged方法,而是使用notifyIt

sufutian的博客 3782

结合 Conda 手动安装 RepeatMasker

RepeatMasker 是一个广泛使用的生物信息学工具,用于识别和屏蔽(mask)基因组序列中的 重复序列(repeats) 。在使用过程中需要调用重复序列数据库(Repbase 和 Dfam),如果使用Conda安装的话会出现许多问题,因此推荐手动安装。在此记录我手动安装RepeatMasker的流程,希望对各位同学有所帮助。

m0_65437087的博客 2535

Android开发者必看:5分钟搞定MQTT客户端连接EMQX服务器(附完整代码)

本文为Android开发者提供了一份快速实现MQTT客户端连接EMQX服务器的实战指南。通过引入Eclipse Paho SDK,详细讲解了从项目配置、权限申请到核心连接、主题订阅与消息发布的完整流程,并附有即拿即用的Kotlin代码,帮助开发者在物联网应用中高效集成轻量级实时通信功能。

weixin_29228781的博客 271

RecyclerView及其复用-问题解决

现在开始解决问题。首先按照之前解释的逻辑,能够分辨出使用RecyclerView的时候出现显示错乱是因为复用问题。这里刚好对于问题进行解决。(这是在电视端开发,会有焦点的获取问题) 首先描述下问题。问题其实很简单,就是一个View的List里面每个item都有一个按钮控件,这个按钮可以显示开启或者关闭,这里首先产品的需求不明确,只给了几个设计图。 按钮大概长这样,就是遥控按一个按键删除按钮...

zfenger 3205

CST微波工作室端口设置保姆级教程:从波导端口到离散端口,手把手教你搞定S参数仿真

本文提供CST微波工作室端口设置的详细教程,涵盖波导端口和离散端口的选择与配置,助力工程师精准完成S参数仿真。通过微带线滤波器案例,详解端口尺寸、阻抗设置及常见问题排查,提升仿真效率与准确性。

weixin_42570296的博客 361

TV(电视)应用开发指南

前阵子将一个手机APP改为TV应用,由于首次开发TV,故把开发过程中的一些问题记录下来,以备不时之需。

jack_bear_csdn的博客 1万+

WinCC7.5SP2生成PDF报表显示有错误或残缺的问题及解决方法

WinCC V7.5 SP2 自带的生成PDF报表功能异常。生成的PDF报表内容显示空白或有残缺。经测试后发现可以通过替换Adobe PDF Library库文件的方法解决该问题。

commandboy的博客 3659

cesium vue2/vue3教程目录导航

以下是本专栏目录导航,送完整项目源码(拒绝单页源码),可以直接运行,全部配置免费视频教程(B站)。

qq_29384639的博客 4314

【Android TV 开发】-->开发汇总

最近在做基于Android 的TV开发,刚开始还是有丢丢怕的, 从来没接触过这个。大佬说不要慌,和手机开发基本一样...

Kevin Learn Android 5141

Open3D 计算点云的倒角距离(Chamfer Distance)【2025最新版】

;Chamfer Distance距离可以计算生成点云数据与标签点云数据之间的平均最短点距离。Open3D可以直接用来计算点云的Chamfer Distance距离。博客长期更新,本文最近一次更新时间为:2025年2月18日。

点云侠的博客 3254

Android TV开发 TCL电视开发实战 ui适配和焦点控制 Recyclerview自定义

1.常用的adb命令 2.ui适配方案 3.Leanback库简介 4.焦点处理 5.Listview GridView和recycler和自定义Recycler view动态添加view 6.按键失灵的解决办法,按键事件如何分发? 7.播放视频的功能 8.剧集控件绘制 9.Metro 10.和手机app开发的区别 1.调试盒子。 盒子的ip地址与电脑的ip地址保...

深南大盗的博客 2080

[Dify] 多步对话流程的实现技巧:构建连贯自然的多轮交互系统

摘要:本文探讨了AI系统中实现多轮对话的核心技术与应用方法。文章首先分析了多步对话的典型场景(如机票预订、财务报告生成)及其价值,提出了Dify平台实现该功能的三大机制:变量系统、条件控制和状态管理。随后详细介绍了顺序型、条件型和确认型三种基本对话模式,并通过"会议预约助手"案例展示了实际应用流程。文章还提供了提示词设计、变量引用等实用建议,并强调多轮对话成功的关键在于清晰的结构设计而非单纯依赖模型能力,最终实现自然流畅的人机交互体验。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 1343

Dify智能体开发:大语言模型(LLM)问题分类

通过定义分类描述,问题分类器能够根据用户输入,使用 LLM 推理与之相匹配的分类并输出分类结果,向下游节点提供更加精确的信息。

王国平的博客 2247

TV端使用RecyclerView时遇到的问题

1.有10条数据,但是只显示出一条。。。    问题原因:item的布局使用了match_parent,修改为wrap_content后正常显示 2.在TV端的焦点问题,在手机端手一滑就可以查看更多的数据,因为焦点在RcyclerView上,在TV端需要使用遥控器左右键针对item切换焦点就做不到了。。。     解决方法:设置RecyclerView的android:foc

yangxuehui1990的专栏 4101

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【Android TV 开发】-->一些优秀 TV 开发相关框架 & 文章

Android TV 相关的库,包括界面开发,播放器等等的收集,我并无法保证全部加入,必定会遗漏一些优秀的 TV 相关的库。

Kevin Learn Android 3975

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

打造流畅TV端体验:my-tv项目中的RecyclerView动画实现指南

在智能电视应用开发中,流畅的界面过渡和响应式交互是提升用户体验的关键。my-tv项目作为一款TV端视频应用,通过精心设计的RecyclerView动画效果,实现了频道列表的平滑过渡与焦点反馈,为用户带来沉浸式的操作体验。本文将深入解析项目中RecyclerView动画的实现原理与优化技巧,帮助开发者掌握TV端列表动画的核心技术。 ## TV端列表动画的设计挑战 与手机应用相比,TV端应用的交互...

gitblog_01020的博客 1052

Android 对Tv开发的总结

1.调试盒子。盒子的ip地址与电脑的ip地址保持一致adb connect  ip地址  adb uninstall 包名2.焦点控制。1.静态控制  view.setNextfocusXXX的方法2.动态控制

SpringYang 3768

Android Tv电视机盒子使用Recyclerview实现飞框动画

Android Tv电视机盒子使用Recyclerview实现飞框动画

未来很长,但我会努力的走下去。 6756
上一篇: RecyclerView自适应高度的LayoutManager
下一篇: Suggestion: add 'tools:replace="android:icon"' to <application> element at AndroidManifest.xml
Harlan9001
博客等级 码龄14年 228粉丝 84原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值