思路:
1.列-时间:用一个ScrollView(columnScrollView)-可上下滚动
2.行-星期:用一个HorizontalScrollView(rowScrollView)-可左右滚动
3.内容:使用ScrollView(yScrollView)嵌套HorizontalScrollView(xScrollView)-可实现上下左右滚动
4.rowScrollView和xScrollView要同时滚动;columnScrollView和yScrollView要同时滚动 。
实现行和列属性始终保持在表格上边和左边。
代码如下:
监听这四个scrollview,做相应的处理,例如:
xScrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
@Override
public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
rowScrollView.scrollTo(scrollX, scrollY);
}
});
rowScrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
@Override
public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
xScrollView.scrollTo(scrollX, scrollY);
}});
问题:两个横向的scrollview互相监听,xScrollView滚动,在其监听方法中会调用rowScrollView的scrollTo方法,rowScrollView也跟随滚动,此时rowScrollView就监听到了,然后就会调用xScrollView的scrollTo方法,scrollTo一触发,就会被xScrollView监听到。。。但是为什么不会出现死循环?
查看ScrollView的源码发现如下方法
@Override
public void scrollTo(int x, int y) {
// we rely on the fact the View.scrollBy calls scrollTo.
if (getChildCount() > 0) {
View child = getChildAt(0);
x = clamp(x, getWidth() - mPaddingRight - mPaddingLeft, child.getWidth());
y = clamp(y, getHeight() - mPaddingBottom - mPaddingTop, child.getHeight());
if (x != mScrollX|| y != mScrollY) {
super.scrollTo(x, y);
}
}
}
//发现在某些特定的