使用HorizontalScrollView实现筛选框的过程中遇到刷新页面或者弹出popWindows时滑动位置会归零问题,查到资料也到没有解决,最后附上个人解决办法。
原因:
刷新页面或其他操作会重新刷新页面布局,然后调用HorizontalScrollView的onLayout方法重绘该布局并将滑动位置归零。
解决办法:
1.覆写父类onScrollChanged方法,记录oldL(向右滑动的距离)参数。
2.覆写父类onLayout方法,如果oldL数值不为零,则滑动到oldL的位置。
3.将布局文件中的HorizontalScrollView改成自己定义的。
最后附上代码:
/**
* @author xxb
* 筛选框自定义横向滑动布局
* 解决重置滑动位置问题
*/
public class MyHorizontalScrollView extends HorizontalScrollView {
//滑动位置
private int oldScX = 0;
public MyHorizontalScrollView(Context context) {
super(context);
}
public MyHorizontalScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyHorizontalScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public MyHorizontalScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
//每次滑动都记录最后的位置
oldScX = oldl;
super.onScrollChanged(l, t, oldl, oldt);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
//如果最后位置不为零 则滑动到最后的位置
if(oldScX!=0){
this.scrollTo(oldScX,0);
}
}
}