当Viewpager设置了pageTransformer,在执行notifyDataSetChanged后,所设置的PageTransformer会失效。
网上找到的解决方法为notifyDataSetChanged前重新设置adapter或者notifyDataSetChanged后执行setCurrentItem。但是效果不是太好。
最后进入ViewPager源码发现只有一处会执行PageTransformer的回调。
protected void onPageScrolled(int position, float offset, int offsetPixels) {
//省略其他代码
if (mPageTransformer != null) {
final int scrollX = getScrollX();
final int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = getChildAt(i);
final LayoutParams lp = (LayoutParams) child.getLayoutParams();
if (lp.isDecor) continue;
final float transformPos = (float) (child.getLeft() - scrollX) / getClientWidth();
mPageTransformer.transformPage(child, transformPos);
}
}
}
通过打断点发现,是因为child.getLeft()为0导致的PageTransformer显示异常。
child.getLeft()为0可通过child.post解决,把代码复制出来稍作修改,放在notifyDataSetChanged后执行
listData.clear();
listData.addAll(data);
adapter.notifyDataSetChanged();
//mPageTransformer为viewpager设置的PageTransformer
if (mPageTransformer != null) {
final int scrollX = viewpager.getScrollX();
final int childCount = viewpager.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = viewpager.getChildAt(i);
final ViewPager.LayoutParams lp = (ViewPager.LayoutParams) child.getLayoutParams();
if (lp.isDecor) continue;
int clientWidth = viewpager.getMeasuredWidth() - viewpager.getPaddingLeft() - viewpager.getPaddingRight();
child.post(new Runnable() {
@Override
public void run() {
final float transformPos = (float) (child.getLeft() - scrollX) / clientWidth;
mPageTransformer.transformPage(child, transformPos);
}
});
}
}
最终效果在notifyDataSetChanged后还是会有一瞬间的闪动,因为child.post回调需要一定的时间。
如果介意的话可以自己手动去计算child.left的位置解决。具体方法就不细说了