1. 程式人生 > >Android自定義控制元件(一) 下拉重新整理,上拉分頁載入更多(支援ListView, GridView, ScrollView)

Android自定義控制元件(一) 下拉重新整理,上拉分頁載入更多(支援ListView, GridView, ScrollView)

        首先說明,這幾篇文章是對一些前輩的成果進行學習後的心得總結。也借這種方式對他們表示謝意。

        最近專案中好幾個模組都用到listview和gridview的下拉重新整理,上拉載入更多等功能,而且涉及到圖片的批量下載。水平有限,首先是想到找一些比較成熟的作品,然後自己修改後再使用。這幾篇文章就分析下我站在巨人的肩膀上學習的經過。現在網上一搜,幾乎所有的“下拉重新整理類”都是通過自定義組合控制元件,新增下拉頭部或腳部,然後控制下拉頭部的或腳部的topMargin值(官方的下拉重新整理控制元件SwipRefreshLayout是通過父檢視控制子檢視的頭部偏移量)完成下拉效果。所以,“下拉重新整理類”不外乎下面幾個過程:

        1.  自定義組合控制元件,通常繼承LinearLayout或者更明確地繼承ListView,GridView等。

        2.  新增頭部和腳部,ListView可以直接自身新增頭部子檢視和腳部子檢視,繼承其他佈局的組合自定義控制元件分別在最初始和最末尾新增檢視。

        3.  通過適時攔截觸屏事件,控制頭部的topMargin達到下拉的效果。觸屏事件可以通過外層佈局控制元件攔截並處理或者在內層的ListView和GridView等處理。

        基礎知識點準備

        View,ViewGroup,自定義控制元件和AsyncTask基礎知識,如onMeasure(),onLayout()等的使用,可以參考我前面的幾篇譯文。

        下面我就對這個下拉重新整理的例項進行初步的分析。

        概況:這個demo應該是作者為了體現這些知識點做的一個相對完整的demo,包括支援整體框架的庫專案,自定義的下拉重新整理上拉載入更多的組合控制元件,以及一個圖片非同步下載的相關工具類。我主要分析demo專案下widget包中的“下拉重新整理類控制元件”的內容,包括PullToRefresh, LoadMoreListView,LoadMorePullToreshView, LoadMoreGridViewPullToreshView, TotiPotentGridView, TotiPotentListView,RequestDataAsyncTask等。

       基本內容

       PullToRefresh(最重要的類):這個類繼承自LinearLayout,可以看作重新整理控制元件的外層容器,它的基本設計思路是在當前組合控制元件中新增重新整理效果的頭部和載入效果的腳部檢視,頭部檢視會被新增在開始位置,腳部檢視在檢視物件建立結束前新增,確保新增在最末尾的位置。使用時,這個組合控制元件要包含一個基礎控制元件,如GridView,這個基礎控制元件會被強制新增到中間位置。並且這個組合控制元件的高明之處就是,通過更明確地指定子檢視型別,這種結構可以重新整理任意檢視。此外,這個組合控制元件還會根據子檢視的狀態決定是否攔截Touch事件,並通過處理Touch事件,實現下拉上拉的效果。這個組合控制元件最大的難點也就是這裡的邏輯處理。基礎控制元件的資料重新整理則通過介面回撥的方式實現。

       LoadMoreListView:這個類繼承自ListView並實現OnClickListener介面,是對ListView的進一步實現。設計思路就是給listview新增一個尾部,通過新增點選事件,這個尾部可以完成一個點選重新整理的功能。

       LoadMoreGridViewPullToreshView:這個類繼承自LinearLayout,其實繼承任意佈局都可以,因為其設計思路就是將PullToRefresh和GridView組合在一起,而這裡的組合其實用到的是前面的PullToRefresh,並通過xml佈局檔案在PullToRefresh中間位置添加了一個GridView。

       LoadMorePullToreshView:這個類和上面的類內容相似,也就是在PullToRefresh的中間位置添加了擴充套件後的LoadMoreListView。

       TotiPotentGridView:這個類的邏輯看著很複雜,主要是作者將demo中資料訪問相關的功能進行了綜合實現,而整體看來,這個類其實只是一個橋樑,將下拉重新整理組合控制元件的相關動作和資料訪問的相關動作在這裡暴露。如果想將這個“重新整理類”自定義控制元件用到自己的專案中,只要清理這個類中與RequestDataAsyncTask相關的內容,並清理LoadMoreListView和LoadMoreGridViewPullToreshView在這裡暴露出來的函式即可。不過這樣的話,這個層次好像可以不存在,而這恰恰也印證了這個類只是一個橋樑這一點。作者的設計思路應該是另外定義一個層次,讓系統進一步層次分明,這樣各層次負責自己應該做的處理,程式碼分離使邏輯更清晰。

       TotiPotentListView:這個類和上面的TotiPotentGridView基本類似。

       RequestDataAsyncTask:這個類基本可以看做是一個非同步任務的資料訪問類。只是,通過將操作資料的檢視傳入該類中,可以根據資料訪問結果決定是否顯示沒有資料時的預設檢視狀態。

       關聯圖

       圖形化展示上面類的關係


       下面是ListView重新整理的層次圖


       控制篇幅,下一篇再進行程式碼分析。