首页 > 其他分享 >TV RecyclerView 滑动后操作保持落焦在左侧第一个View

TV RecyclerView 滑动后操作保持落焦在左侧第一个View

时间:2024-05-28 15:33:37浏览次数:28  
标签:第一个 val 获取 TV item 落焦 RecyclerView view

 在 recyclerview 中,想要无论滑动到哪,每次按遥控器落焦,需要落焦在左侧第一个 item 上面,如果不能触屏还好,触屏会导致焦点丢失

根据系统的反馈,如果你滑动了列表,刚好列表的 item 卡在一半的位置,此时系统的落焦规则,不一定会到第一个

之前试过一个效果一般的方案,就是通过 findFirstVisibleItemPosition 等方法,去自动获取可见的第一个下标,勉强可以达到重新落焦的预期

但是显然无法精确,如果想要精准的获取第一个item,这种方式显然不行,只能另辟蹊径

居然要求是左上角第一个,那么可以使用坐标来获取 child view,从而得到左侧第一个 item

internal fun RecyclerView.findChildView(x: Float, y: Float): View? {
    layoutManager?.let {
        for (i in childCount - 1 downTo 0) {
            val child = getChildAt(i)
            child?.let { view ->
                if (x >= view.left && x <= view.right && y >= view.top && y <= view.bottom) {
                    return view
                }
            }
        }
    }
    return null
}

这样你会发现,无论怎么滑动,只要 item 位于左上角,就能精准查找到 item view,然后通过 getChildLayoutPosition(view) 方法获取到在 adapter 中的下标

但是有个问题,假设当前坐标中,没有 item 的情况,此时,可以使用第一种方案 findFirstVisibleItemPosition 来获取

最后通过当前的情况去滚动 recyclerview 到指定位置

/** 重新获取焦点时自动滚动定位 */
    fun scrollBy() {
        val view = findChildView(x + 100f, y + 100f)
        val position = if (view == null) getCurrentFirstIndex() else getChildLayoutPosition(view)
        Logger.d("scrollBy position $position view is null ${view == null}")
        val firstItem: Int = speedLayoutManager.findFirstVisibleItemPosition()
        val lastItem: Int = speedLayoutManager.findLastVisibleItemPosition()
        //区分情况
        if (position <= firstItem) {
            //当要置顶的项在当前显示的第一个项的前面时
            speedLayoutManager.smoothScrollToPosition("scrollBy1", this, position)
            Logger.d("scrollBy smoothScrollToPosition1")
        } else if (position <= lastItem) {
            //当要置顶的项已经在屏幕上显示时
            val top: Int = getChildAt(position - firstItem).top
            smoothScrollBy(0, top)
            Logger.d("scrollBy smoothScrollBy")
        } else {
            //当要置顶的项在当前显示的最后一项的后面时
            speedLayoutManager.smoothScrollToPosition("scrollBy2", this, position)
            Logger.d("scrollBy smoothScrollToPosition2")
        }
        AppListKeyDownUtils.setFocus("scrollBy", position)
    }

这样在失去焦点后重新获取焦点时,落焦的位置就在左上角第一个了

 

标签:第一个,val,获取,TV,item,落焦,RecyclerView,view
From: https://www.cnblogs.com/LiuZhen/p/18218136

相关文章

  • WPF在ListView中绑定Command命令的写法
    假定:ViewModel中有一个数据源叫Persons,有一个命令叫DoCommand,通过System.Windows.Interactivity触发器绑定鼠标MouseUp事件,当UI端绑定了DataContext数据上下文之后,Command="{BindingDoCommand}"是找不到这个命令的,必须使用Binging类的RelativeSource属性先找到当前UI,再找到DataC......
  • tvm实现卷积操作
     https://blog.csdn.net/sinat_31425585/article/details/103797339importtvmimportnumpyasnpimportmxnetasmxdefpadding(X,ph,pw):assertlen(X.shape)>=2nh,nw=X.shape[-2],X.shape[-1]returntvm.te.compute((*X.shape......
  • YOLOv8 更换骨干网络之 MobileNetV3 详解
    鱼弦:公众号【红尘灯塔】,CSDN博客专家、内容合伙人、新星导师、全栈领域优质创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)YOLOv8更换骨干网络之MobileNetV3详解1.MobileNetV3简介MobileNetV3......
  • 基于ADB Shell 实现的 Android TV、电视盒子万能遥控器 — ADB Remote ATV
    ADBRemoteATVAndroidTV的遥控器,基于ADBShell命令ADBRemoteATV是一个AndroidTV的遥控器,基于ADBShell命令,泛用性更高。下面的shell命令,是软件的基本原理,通过shell命令可模拟物理遥控器的基本按键,此外还可以快捷启动指定APP、借助手机软键盘输入中/英字符等。......
  • 深度学习项目-MobileNetV2水果识别模型
    FruitRecognitionDeepLearning深度学习小项目,利用CNN和MobileNetV2搭建的水果识别模型。github地址fruit为本次大作业使用的数据集。geneFruit为数据增强后的数据集。FruitRecognition为本次大作业相关代码及相关曲线热力图。项目使用conda环境进行训练,相关测试版本如下:......
  • ltv预估
    ltv预估可以分成两种类型的场景:IAA类型的广告收入:这时候采用LT*ARPU的方式来做预估。LT通过留存率做幂函数拟合,获得留存率函数ARPU采用一段时间内的平均ARPU适用于较为稳定期的产品,但ARPU这个用均值还是有一些隐患。IAP类型的交易收入:周付费LT周付费ARPU周付费LT可以用......
  • c# Dictionary<TKey,TValue>.TryAdd
    原文链接:https://learn.microsoft.com/zh-cn/dotnet/fundamentals/code-analysis/quality-rules/ca1864Dictionary<TKey,TValue>.ContainsKey(TKey) 和 Dictionary<TKey,TValue>.Add 都执行查找操作,这是冗余设置。如果字典中已存在键,Dictionary<TKey,TValue>.Add 也会引发异......
  • jmap使用报错Doesn't appear to be a HotSpot VM (could not find symbol "gHotSpotVM
    报错场景问题原因服务器上装了jdk,按理来说jmap是自带了的,可以直接使用,根据情况来看是装了jmap但是无法正常使用,推测是版本的问题导致解决方式指定jdk自带的jmap工具1.查看当前java的环境变量echo$JAVA_HOME2.配置jdk自带工具的环境变量exportPATH=$JAVA_HOME/bin:$P......
  • requestVideoFrameCallback
    requestVideoFrameCallback:将新视频帧发送到合成器时运行的回调函数requestVideoFrameCallback()的用法与Window.requestAnimationFrame()相同。您可以使用它来运行一个回调函数,该函数在下一个视频帧发送到合成器时执行某些操作。当合成下一个视频帧时,再次调用requestVid......
  • TVM Pass优化 -- 算子融合(FuseOps)
    定义算子融合就是将多个计算单元合并到一个计算单元里完成计算,减少中间数据读写内存的操作,从而节省计算时间。TVM中将算子融合分为四种:kElemWise:两个tensor之间按照元素逐个操作的算子,实际上所有的四则运算都是这种类型kBroadcast:带有广播操作的算子kInjective:输入和输出......