RecycleView 获取第一个可见条目(掉坑篇)

RecycleView 获取第一个可见条目(掉坑篇)

问题描述

今天本来心情很愉快的,因为需求是酱样子的,扫了一眼马上用我的核桃仁处理器,迅速定位–>直接就RecycleView嵌套RecycleView呀,简单粗暴我喜欢。
(签到跟签退之间的View,测量每个子item的高度,然后动态赋值给这个View)

这里写图片描述

然后我就笑不出来了,因为什么呢,开始的item数量少,当数据多了,屏幕显示不完,拉下去之后就Crash了!WTF!

这里写图片描述

说我这个对象不存在,到底为什么会出现这种情况?百度一下–>RecyclerView有良好的回收机制,所以只加载屏幕显示的View,未显示部分将回收。由于getChildAt()这个方法只能get到屏幕显示的部分,也就是说:假如屏幕上只能显示5个View,当往下滑动到第6、7个View的时候,他们的position虽然还是5,6但是由于getChildAt()只能get到屏幕上显示的View,所以它实际的position其实是4、5。想要get到第6个View不能用getChildAt(6)而要用getChildAt(4)

解决方法

其实这问题之前在ListView中也出现过,不过只需要用当前的position减去屏幕显示的第一个View的position(getFirstVisiblePosition())就行。
RecycleView中没有这个方法,But可以有这个方法

 final LinearLayoutManager layoutManager = new LinearLayoutManager(mContext);
 layoutManager.findFirstVisibleItemPosition()//获取第一个先是的View的索引

使用recycleView中的 position – 显示view的索引即可

以下是我解决问题的办法

    @Override
    public void onBindViewHolder(final ViewHoldX holder,  int position) {
        final int S = position;
        final LinearLayoutManager layoutManager = new LinearLayoutManager(mContext);
        holder.recycler_view.setLayoutManager(layoutManager);
        OneAdapter oneAdapter = new OneAdapter(mContext, mList.get(position).getFruitBeen());
        holder.recycler_view.setAdapter(oneAdapter);
        fruitBeen = mList.get(position).getFruitBeen();
        holder.recycler_view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                View childAt = layoutManager.getChildAt(S - layoutManager.findFirstVisibleItemPosition());
                if (childAt !=null){
                    height = childAt.getHeight();
                }
                int x = height * fruitBeen.size();
                ViewGroup.LayoutParams params = holder.view1.getLayoutParams();
                params.height = x;
                holder. view1.setLayoutParams(params);
            }
        });
    }

每天进步一点点

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2851.html原文链接:https://javaforall.net

(0)
上一篇 2021年3月12日 下午10:52
下一篇 2021年3月12日 下午10:52


相关推荐

  • WSDL简介

    WSDL简介WSDL 网络服务描述语言 WebServicesD 是一门基于 XML 的语言 用于描述 WebServices 以及如何对它们进行访问 WSDL 是基于 XML 的用于描述 WebServices 以及如何访问 WebServices 的语言 您应当具备的基础知识在继续学习之前 您需要对下面的知识有基本的了解 XMLXML 命名空间 XMLSch

    2026年3月17日
    2
  • Bootstrap4 glyphicon 移除图标 glyphicon fonts-faces 解决方案

    Bootstrap4 glyphicon 移除图标 glyphicon fonts-faces 解决方案bootrap3 是支持的图标 4 不支持 4 已经移除了收费图标 取而代之建议使用其他的 比如 https octicons github com 和 http fontawesome io 但是 3 和 4 我都用过的 直接扣下了 3 里面的部分 如图目录结构 您可以将一下代码 copy 到您引入的 bootstrap 4 0 0 dist css bootstrap css 文件中

    2026年3月18日
    3
  • 用EasyBoot轻松做启动光盘

    用EasyBoot轻松做启动光盘原文转自:电脑技术资料园BrianLiu学习之园原版系统安装盘的缺憾——不管是Windows98还是WindowsNT/2000/XP,仅能实现单一系统的初始安装,缺少调试维护、系统恢复、DOS杀毒等工具。虽然市面上出现了N合1光盘,但一般体积庞大,且无法满足自己的需要。  用EasyBoot刻盘正好可以解决这个问题。EasyBoot是一款集成…

    2022年7月26日
    5
  • 局域网搭建FTP服务器并进行访问

    局域网搭建FTP服务器并进行访问1 右键 此电脑 选择管理 进入管理界面打开本地用户和组选项 2 右键用户 选择新用户 开始创建用户 填写用户名 密码 点击创建 右边的用户列表就会显示新创建的用户 3 进入控制面板 gt 程序 gt 程序和功能 点击 启用或关闭 Windows 功能 4 在 Internet 信息服务 然后再 FTP 服务器前打勾 然后点击确定按钮 5 添加完 IIS 服务后 开始创建 FTP 站点 右键我的电脑选择管理 进入管理界面 找到服务和应用程序 接着点击 InternetInfo I

    2026年3月17日
    3
  • 算法的力量

    算法的力量李开复 算法是计算机科学领域最重要的基石之一,但却受到了国内一些程序员的冷落。许多学生看到一些公司在招聘时要求的编程语言五花八门就产生了一种误解,认为学计算机就是学各种编程语言,

    2021年12月26日
    44
  • WIN10系统 Indirect Display 虚拟显示器之特殊应用

    WIN10系统 Indirect Display 虚拟显示器之特殊应用byfanxiushu2020-05-20转载或引用请注明原始作者。有人询问我是否可以实现这样一种功能:对windows输出的每一帧图像数据显示做一些特殊处理(比如球形桌面,曲面化等特效),然后再显示到显示器上。而且还不止一个人这样咨询过,虽然我不大清楚这种需求具体用在何处,估计也是一些特殊场所。这种需求,最先想到的,也最直观的想法就是能否给显卡驱动添加一个过滤驱动,然后拦截图像数据,然后再做些特殊处理。可惜想法是美好的,却是难以实现的,甚至是不大可能实现的。首先windows中就没显卡过

    2022年8月21日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号