添加新数据会使viewpage预加载的长度一样,当前页面数据正常添加,但是预加载的其他页面数据未更新会产生空白,如果滑动刷新又会导致卡顿
推荐以下的方法,重写viewpage,然后在滑动的时候重新计算高度就行了
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.viewpager.widget.ViewPager;
/**
* Created by ZhengYu on 2021/8/23.
*/
public class PersonalViewpager extends ViewPager {
private int current;
private int height = 0;
private boolean scrollble = true;
public PersonalViewpager(@NonNull Context context) {
super(context);
}
public PersonalViewpager(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (getChildCount() > current) {
View child = getChildAt(current);
child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
int measureHeight = child.getMeasuredHeight();
height = measureHeight;
}
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
public void resetHeight(int current) {
this.current = current;
if (getChildCount() > current) {
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) getLayoutParams();
if (layoutParams == null) {
layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, height);
} else {
layoutParams.height = height;
}
setLayoutParams(layoutParams);
}
}
@Override
public boolean onTouchEvent(MotionEvent ev){
if (!scrollble){
return true;
}
return super.onTouchEvent(ev); }
public boolean isScrollble(){
return scrollble;
}
public void setScrollble(boolean scrollble){
this.scrollble=scrollble;
}
}
/*
* 更新高度
*/
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
viewPager.resetHeight(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});