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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 航天金税金税盘批量导入项目开发

    航天金税金税盘批量导入项目开发公司erp要实现发票导入到最新航天金税盘,数据接口文档下载地址:http://download.csdn.net/detail/y281252548/9567083不懂得联系我:免费  qq:281252548

    2022年6月4日
    58
  • visual studio code适合什么语言_将当前运行的配置备份成初始配置

    visual studio code适合什么语言_将当前运行的配置备份成初始配置VSCode是一款非常好用的编辑器(或者IDE),具有很好的可扩展性,功能比较强大,占用的系统资源也适中,启动速度较快,而且支持全平台,比较适合作为Python开发用的IDE。本文针对Linux(主要是Ubuntu,其他发行版类似),整合一些Python开发相关的配置,仅供刚入坑Linuxer参考。一、VSCode与其他编辑器(或IDE)的比较(1)VSCode与Atom的比较:Atom是一款由g…

    2022年8月25日
    6
  • dfile.encoding=utf-8 乱码_OrdosTF格式是什么格式

    dfile.encoding=utf-8 乱码_OrdosTF格式是什么格式解析ASN10x80问题所有X509证书都用一种ASN1格式,其为一种嵌套储存格式。ASN1规则繁琐,此文不说明,可以研究此链接。本文主要说明0x80问题,同事问起这问题,一时想不起来,现在在此备份。所有ASN1格式都是0x30开头,表示ASN1tag;0x82用来表示03C2的长度,先搁置;而03C2其用来表示后面数据长度,如下所示。308203C

    2025年11月2日
    4
  • ICMP报文格式详解

    ICMP报文格式详解1 引言2 ICMP报文的类型3 ICMP地址掩请求与应答4 ICMP时间戳请求与应答5 ICMP端口不可达差错1引言 ICMP经常被认为是IP层的一个组成部分。它传递差错以及其他需要注意的信息。ICMP报文通常被IP层或更层协议(TCP或UDP)使用。一些ICMP报文把差错报文返回给用户进程。 ICMP报文是在IP数据报内部被传输的,它封装在IP数据报内。

    2022年6月4日
    64
  • java mutator是什么意思_java method类

    java mutator是什么意思_java method类小编典典让我们看一下基础知识:“Accessor”和“Mutator”只是获取器和设置器的奇特名称。一个获取器“Accessor”返回一个类的变量或其值。设置器“Mutator”设置类变量指针或其值。因此,首先您需要设置一个带有一些要获取/设置的变量的类:publicclassIDCard{privateStringmName;privateStringmFileName;pri…

    2025年11月9日
    5
  • fonttools 使用教程[通俗易懂]

    fonttools 使用教程[通俗易懂]2019独角兽企业重金招聘Python工程师标准>>>…

    2022年6月25日
    41

发表回复

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

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