由于項目需要,我們需要一個可以橫向滾動的,又可以豎向滾動的 表格。而且又要考慮大數(shù)據(jù)量(行)的展示視圖。經(jīng)過幾天的研究終于搞定,做了一個演示。貼圖如下:
好吧。讓我們看思路是什么樣的:
1. 上下滾動直接使用 listView來實現(xiàn)。
2. 左右滾動使用HorizontalScrollView,來處理滾動。我寫一個類MyHScrollView繼承 自它。
2.1 . ListView里的每行(row)分為 兩部分,不滾動的和可滾動的區(qū)域。比如本demo的第一列,就是靜態(tài)的。而后面的所有列都是可以滾動的。
2.2. 我不想自己計算滾動的距離,因為還要處理越界,坐標等等。于是我使用 OnTouch事件來處理。于是我們必須搞懂OnTouch的運行機制。了解 請google it.
2.3. 列頭 (顯示列名的那一行)是固定的,不會上下滾動 。但可以左右滾動。而且它在左右滾動時,所有的 數(shù)據(jù)行(row) ,都要與其一起左右滾動。那么我們需要監(jiān)聽 列頭 (控件)的滾動變化消息(事件),并將消息廣播給所有的 數(shù)據(jù)行。這些數(shù)據(jù)行收到消息后,調(diào)整自己的滾動條位置以保持和 列頭 的滾動距離一致。
3. 那么整個流程基本是這樣的。
3.1, 捕獲 列頭(容器控件,包含固定和可滾動控件)的 onTouch事件(拖動事件),不處理。而分發(fā)給 “列頭里的 可滾動部分的控件”,該控件是一個HorizontalScrollView的 子類, 當它收到這些 拖動事件時,就產(chǎn)生了固定的效果
3.2. 捕獲 數(shù)據(jù)行 區(qū) 的控件(該控件其實就是ListView控件 )的OnTouch事件,不處理,同樣分發(fā)給 “列頭里的 可滾動部分的控件”。 這兩步,就完成了一個小效果,點擊表 格的頭部和體部都能移動(滾動)行。
3.3. 我寫了一個 HorizontalScrollView的子類,重載 onScrollChanged 方法,該方法在 滾動之后執(zhí)行,相當于“滾動后的事件”,我寫了一個觀察者(設計模式)的類。每次 滾動后,都通知給 觀察者。觀察者再通知給它的訂閱者(那些需要同時滾動的行里面的 滾動控件)。
3.4. 當ListView創(chuàng)建行時,讓這些行都訂閱 上一步 的觀察者。當 收到消息后,調(diào)整自身的滾動條位置以保持和 列頭 的滾動條位置一致。
代碼比較多,就不貼了。提供代碼下載。
新聞熱點
疑難解答
圖片精選