您的位置:首页 > 其它

ScrollView 和 ListView ,GridView的嵌套问题

2016-08-04 10:10 246 查看
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐