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


相关推荐

  • Servlet的工作原理简介

    Servlet的工作原理简介你使用的本地web服务器或者买的别的服务器都一样的原理,鼠标点击事件发出一个HTTP请求以后,服务器会将请求移交给servlet容器,servlet容器首先对所请求的URL进行解析并根据web.xml配置文件找到相应的处理servlet,同时将request、response对象传递给它,servlet通过request对象可知客户端的请求者、请求信息以及其他的信息等,servlet在处理完请求后…

    2022年9月1日
    2
  • Java LDAP统一身份认证

    不多说直接看代码,如下:importjava.util.Hashtable;importjavax.naming.AuthenticationException;importjavax.naming.Context;importjavax.naming.NamingEnumeration;importjavax.naming.NamingException;import…

    2022年4月6日
    61
  • 用tushare获取股票历史数据

    用tushare获取股票历史数据我们运用python进行量化分析的时候需要载入证券数据,tushare为我们提供了证券市场数据接口。tushare是以新浪财经、腾讯财经、上交所数据、深交所数据为基础提供的Python接口。安装方法为pipinstalltushare也可以到tushare的官网去下载,并且官网上有接口各个调用函数的详细说明http://tushare.org/index.html#id5

    2022年6月24日
    27
  • VB学习1

    VB学习1 

    2022年6月21日
    28
  • Codeforces 456 A. Laptops「建议收藏」

    Codeforces 456 A. Laptops「建议收藏」题目链接:http://codeforces.com/contest/456/problem/A提示:一共有n个数,而且a[i],b[i]都<=n;所以我们只需要找当a!=b的时候就行了,代码如下:#include<cstdio>#include<iostream>#include&l…

    2022年10月10日
    0
  • 远程连接windows2003桌面无法使用剪切板的有效解决方法

    远程连接windows2003桌面无法使用剪切板的有效解决方法

    2021年11月17日
    43

发表回复

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

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