ViewPager + RecyclerView的显示问题

本文介绍了解决RecyclerView中嵌入ViewPager时遇到的一个常见问题:当ViewPager被隐藏并重新显示时,第一次滑动缺少动画效果并且视图加载不全。通过对ViewPager源码的深入分析,找到了问题的根本原因在于mFirstLayout变量的处理方式。文章提供了具体的解决方案,包括重写ViewPager的onAttachedToWindow方法并使用反射来修改关键变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题描述
在使用RecyclerView添加头部展示viewpager的时候会出现一个问题:如果ViewPager中有3张照片,当ViewPager滑动一遍之后,向下滑动RecyclerView列表,直到完全隐藏此ViewPager,并执行了onDetachedFromWindow,再回来时,将会出现bug,第一次滑动时没有动画效果,并且,经常出现view没有加载的情况。

二、问题分析
通过查看源码发现是viewpager私有成员变量mFirstLayout导致的。
在onAttachedToWindow设置mFirstLayout为true

@Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        mFirstLayout = true;
    }
void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) {
        ......
//此时mFirstLayout为true,所以不会调用scrollToItem(item, smoothScroll, velocity, dispatchSelected);
        if (mFirstLayout) {
            // We don't have any idea how big we are yet and shouldn't have any pages either.
            // Just set things up and let the pending layout handle things.
            mCurItem = item;
            if (dispatchSelected) {
                dispatchOnPageSelected(item);
            }
            requestLayout();
        } else {
            populate(item);
            scrollToItem(item, smoothScroll, velocity, dispatchSelected);
        }
    }

三、解决方法
通过重写viewpager的onAttachedToWindow方法,利用反射获取mFirstLayout变量,将他设置为false。

 @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        try {
            Field mFirstLayout = ViewPager.class.getDeclaredField("mFirstLayout");
            mFirstLayout.setAccessible(true);
            mFirstLayout.set(this, false);
            getAdapter().notifyDataSetChanged();
            setCurrentItem(getCurrentItem());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值