您的位置:首页 > 移动开发 > Android开发

ViewPager + RecyclerView的显示问题

2016-09-07 15:59 375 查看
一、问题描述

在使用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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  viewpager android bug