A.ScrollView 和 ListView ,GridView的嵌套时显示不全的问题。
这种情况可以重写ListView ,GridView,给其高度一个比较大的值。
public class MyListView extends ListView {
public MyListView(Context context) {
super(context);
}
public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyListView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
@Override
/**
* 重写该方法,达到使ListView适应ScrollView的效果
*/
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
B.解决完问题A你会发现还有其他奇葩的问题:切换界面时会出现无法定位到顶部或上次滑动停留的位置
解决方法:
(1)在activity或fragment适合的生命周期中(如onResume())调用:
mPullRefreshScrollView.setFocusableInTouchMode(true);
(2)也可以使用,不过这种情况在快速切换的情况下,会有点滑动的感觉。
scrollview.scrollTo(x,y);
scrollview.smoothScrollTo(0, 0);
//下面是用到PullToRefresh的时候
scrollview.getRefreshableView().scrollTo(0, 0);
scrollview.getRefreshableView().smoothScrollTo(0, 0);
这个方法定位到某一位置
(3)利用mPullRefreshScrollView.getRefreshableView();获取真正的的ScrollView
然后利用ScrollView.fullScroll(**);方法定位.
需要注意的是该方法不能直接在主线程中调用,否则无效,利用post方法间接调用
// 滑动至顶部
scrollView.post(new Runnable() {
public void run() {
scorllView.fullScroll(ScrollView.FOCUS_UP);
//scrollView.fullScroll(ScrollView.FOCUS_DOWN);
}
});
如果以上方法不行,在代码里去掉嵌套的listview的焦点 listView.setFocusable(false);
c.解决完以上问题,还有就是在组合使用时一般会隐藏显示一些view,哪就要重写ScrollView的滑动监听了。
public class MyScrollView extends ScrollView {
private ScrollViewListener scrollViewListener = null;
public MyScrollView(Context context) {
super(context);
}
public MyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onScrollChanged(int x, int y, int oldx, int oldy) {
//x为当前滑动条的横坐标,y表示当前滑动条的纵坐标,oldx为前一次滑动的横坐标,oldy表示前一次滑动的纵坐标
super.onScrollChanged(x, y, oldx, oldy);
if (scrollViewListener != null) {
//在这里将方法暴露出去
scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
}
}
//是否要其弹性滑动
@Override
protected boolean overScrollBy(int deltaX, int deltaY, int scrollX,
int scrollY, int scrollRangeX, int scrollRangeY,
int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
// 弹性滑动关键则是maxOverScrollX, 以及maxOverScrollY,
// 一般默认值都是0,需要弹性时,更改其值即可
// 即就是,为零则不会发生弹性,不为零(>0,负数未测试)则会滑动到其值的位置
return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX,
scrollRangeY, 0, 0, isTouchEvent);
}
//接口
public interface ScrollViewListener {
void onScrollChanged(View scrollView, int x, int y, int oldx, int oldy);
}
public void setScrollViewListener(ScrollViewListener listener)
{
scrollViewListener=listener;
}
}