终于忙完手头上的工作了,难得有时间再唠叨一篇博客。在刚刚处理完的项目需求中,有一个小需求是客户要求查询出的所有数据一屏显示,如果显示不全,要做成可以左右滑动查看的形式(PS:原来的布局仅仅是一个ListView,然后显示几个重要数据,类似于数据表格)。既然客户要求了,那咱作为程序猿的就得赶紧实现啊(相信很多程序猿小伙伴都有这种经历,需求一遍一遍的提,一遍一遍的改,今天这个样,明天那个样,心里每天都有上百万匹什么马奔腾而过(最近老是能看到工作猝死的新闻,还好我心里承受能力还可以,要不然一天上百万匹马冲击我的小心脏,我还不得…
),但是没办法呀,谁让人家是客户涅……)好了,不说废话了,不就是需求吗,你提我改就是喽
首先先让我们看一下最终实现的效果图,用的模拟器演示,有点卡顿,真机不会这样。(样子有点丑,不过很好用哦)

好了,效果就是上面的那个样子,接下来让我们看看如何用代码实现,这里只贴主要代码,文章最后提供源码下载。
一、分析
要实现上面的效果其实很简单,此表格分为两部分,最上面一行为标题头,下面为数据列表,看图,没有什么是一张图解决不了的问题,实在不行,再加一滴风油精

二、代码实现
1、首先列表的上下滚动还是使用ListView,这没什么好说的,代码就不贴了;
2、横向滚动 自定义CustomHScrollView类,继承HorizontalScrollView;
public class CustomHScrollView extends HorizontalScrollView {
ScrollViewObserver mScrollViewObserver = new ScrollViewObserver();
public CustomHScrollView(Context context) {
super(context);
}
public CustomHScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomHScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return super.onTouchEvent(ev);
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
//滚动时通知观察者
if (mScrollViewObserver != null) {
mScrollViewObserver.NotifyOnScrollChanged(l, t, oldl, oldt);
}
super.onScrollChanged(l, t, oldl, oldt);
}
/*
* 当发生了滚动事件时接口,供外部访问
*/
public static interface OnScrollChangedListener {
public void onScrollChanged(int l, int t, int oldl, int oldt);
}
/*
* 添加滚动事件监听
* */
public void AddOnScrollChangedListener(OnScrollChangedListener listener) {
mScrollViewObserver.AddOnScrollChangedListener(listener);
}
/*
* 移除滚动事件监听
* */
public void RemoveOnScrollChangedListener(OnScrollChangedListener listener) {
mScrollViewObserver.RemoveOnScrollChangedListener(listener);
}
/*
* 滚动观察者
*/
public static class ScrollViewObserver {
List<OnScrollChangedListener> mChangedListeners;
public ScrollViewObserver() {
super();
mChangedListeners = new ArrayList<OnScrollChangedListener>();
}
//添加滚动事件监听
public void AddOnScrollChangedListener(OnScrollChangedListener listener) {
mChangedListeners.add(listener);
}
//移除滚动事件监听
public void RemoveOnScrollChangedListener(OnScrollChangedListener listener) {
mChangedListeners.remove(listener);
}
//通知
public void NotifyOnScrollChanged(int l, int t, i