本發(fā)明涉及一種Android系統(tǒng)中ListView快速分頁加載的方法,屬于安卓系統(tǒng)ListView列表優(yōu)化技術(shù)領(lǐng)域。
背景技術(shù):
近年來,Android操作系統(tǒng)不斷發(fā)展演進(jìn),搭載Android操作系統(tǒng)的智能設(shè)備逐漸成為普通人每天必不可少的工具。在安卓設(shè)備與用戶進(jìn)行交互的各種方式中,以列表進(jìn)行信息展示是最常用的一種,因此,ListView成為Android系統(tǒng)中應(yīng)用最靈活廣泛的控件之一。開發(fā)者可以通過ListView向用戶展示資源,包括展示文字、圖片、數(shù)據(jù)等多種不同類型的內(nèi)容,例如常用的聯(lián)系人列表、微博信息、微信消息等都是使用ListView控件來實現(xiàn)的。
通常情況下,ListView需要加載的資源往往都超出了Android設(shè)備屏幕一頁所容納的數(shù)量,當(dāng)ListView預(yù)期要加載的內(nèi)容包括很多個子項時,如果待加載的資源存在于數(shù)據(jù)庫或服務(wù)器中,此時若直接加載全部信息,龐大的數(shù)據(jù)量會造成大量的內(nèi)存和網(wǎng)絡(luò)流量消耗,并且在客戶端造成用戶長時間等待,對終端用戶產(chǎn)生不好的使用體驗?;诖?,需要對ListView的內(nèi)容進(jìn)行分頁加載,只顯示當(dāng)前頁面內(nèi)的子項內(nèi)容,當(dāng)用戶需要讀取更多數(shù)據(jù)時上拉觸發(fā)加載,再將新加載的數(shù)據(jù)添加到顯示列表中進(jìn)行顯示。目前Android提供的分頁操作大致是在Activity中通過滑動監(jiān)聽器的監(jiān)聽狀態(tài)觸發(fā)新的加載,更新固定數(shù)目的Item,數(shù)據(jù)變化后通過Adapter來通知ListView刷新數(shù)據(jù),接收數(shù)據(jù)并進(jìn)行顯示。這種方法存在以下缺陷:1、當(dāng)應(yīng)用程序中多處都需要使用ListView列表控件時,需要針對每個控件寫分頁邏輯以達(dá)到預(yù)期效果,編程復(fù)雜導(dǎo)致軟件臃腫,占用更大的存儲資源,造成不好的用戶體驗。2、如果服務(wù)器端提供的分頁策略發(fā)生變化,則在客戶端軟件需要進(jìn)行大量的修改,不同策略的操作混在一起,代碼復(fù)雜會導(dǎo)致效率低下,應(yīng)用程序不易維護(hù)。
技術(shù)實現(xiàn)要素:
針對現(xiàn)有技術(shù)的不足,本發(fā)明提供了一種Android系統(tǒng)中ListView快速分頁加載的方法。
本發(fā)明針對應(yīng)用程序中加載服務(wù)器資源的不同方式,給出了ListView加載資源的相應(yīng)方法,并且將不同方法進(jìn)行比較概括,封裝成為通用的抽象父類,并在繼承子類中獲取不同加載模式所需的不同參數(shù),則在Activity中使用ListView時可簡單地通過實例化相應(yīng)子類對象來實現(xiàn)ListView的快速分頁加載。本發(fā)明公開的方法既通過分頁加載實現(xiàn)了迅速的響應(yīng)和較小的資源開銷,又通過封裝實現(xiàn)了分頁方法的抽象和快速移植利用,滿足了固定分頁加載和自任一項加載多種不同的需求,使ListView的使用更清晰明確,同時易擴(kuò)展、易維護(hù),提高了系統(tǒng)效率。
術(shù)語解釋:
1、ListView,指Android系統(tǒng)中的列表控件。
2、繼承,指Java中子類繼承父類,可以獲得父類的屬性和方法。
3、回調(diào)函數(shù),指被調(diào)用類反過來使用了調(diào)用類中的方法,該方法即為回調(diào)函數(shù)。
4、divideBase類,是指本發(fā)明中實現(xiàn)分頁邏輯的抽象父類。
5、固定分頁加載,是指服務(wù)器端資源按頁進(jìn)行存儲和加載的方式。
6、從任一項起始加載,是指服務(wù)器端的每條數(shù)據(jù)分別進(jìn)行存儲和加載的方式。
本發(fā)明的技術(shù)方案為:
一種Android系統(tǒng)中ListView快速分頁加載的方法,包括步驟如下:
(1)初始化起始狀態(tài);
(2)獲取加載數(shù)據(jù)所需的參數(shù),該參數(shù)用以確定所加載數(shù)據(jù)的位置,根據(jù)分頁加載模式的不同,封裝成不同的獨立的抽象方法,即參數(shù)獲取方法,供不同的子類實現(xiàn);
(3)封裝加載數(shù)據(jù)抽象方法,在本方法中需要調(diào)用步驟(2)中的參數(shù)獲取方法,將加載數(shù)據(jù)所需的參數(shù)傳遞到本步驟的方法中;
(4)實現(xiàn)具體的數(shù)據(jù)加載方法,即對步驟(3)中封裝的加載數(shù)據(jù)抽象方法進(jìn)行具體使用:先判斷加載標(biāo)志位狀態(tài),如果加載標(biāo)志位狀態(tài)為false狀態(tài)時,則判定當(dāng)前沒有加載任務(wù),調(diào)用步驟(3)中的加載數(shù)據(jù)抽象方法,同時將加載標(biāo)志位置為true狀態(tài);否則,當(dāng)加載標(biāo)志位狀態(tài)為true狀態(tài)時,則判定當(dāng)前有加載任務(wù),不執(zhí)行加載方法,也不返回任何數(shù)據(jù);加載標(biāo)志位是一個boolean類型的量,包括true狀態(tài)和false狀態(tài)兩種狀態(tài),false狀態(tài)表示當(dāng)前沒有加載線程執(zhí)行,true狀態(tài)表示當(dāng)前已有加載線程正在運行;
(5)當(dāng)加載結(jié)束時,判斷是否成功加載新數(shù)據(jù),如果成功,ListView的適配器會收到新數(shù)據(jù),更新當(dāng)前顯示界面頁標(biāo)號參數(shù),就是賦新值,更新為返回來的當(dāng)前參數(shù)值,并返回本次加載所讀取的新數(shù)據(jù),并在客戶端進(jìn)行顯示,同時將加載標(biāo)志位置為false;如果加載失敗,返回原來的頁標(biāo)號狀態(tài),即返回原狀態(tài)。不影響下一次的加載請求。
根據(jù)本發(fā)明優(yōu)選的,上述步驟(3)至步驟(5)由抽象父類即divideBase類來實現(xiàn)。由此完成了客戶端請求服務(wù)器端加載資源的通用邏輯封裝。
根據(jù)本發(fā)明優(yōu)選的,所述步驟(2),當(dāng)分頁加載模式為按固定分頁加載時,參數(shù)獲取方法由子類divideA實現(xiàn),設(shè)定需要獲取的兩個參數(shù)分別記為param1、param2,包括步驟如下:
A、在服務(wù)器端提供的資源池中,為全部資源進(jìn)行分頁標(biāo)號;
B、客戶端向服務(wù)器提出加載數(shù)據(jù)的請求時,同時向服務(wù)器發(fā)送當(dāng)前客戶端內(nèi)容的頁標(biāo)號index,服務(wù)器根據(jù)收到的頁標(biāo)號index,將頁標(biāo)號index加1,即得到所需參數(shù)param1為index+1;每頁所包含的數(shù)據(jù)子項數(shù)目size即為param2,服務(wù)器端根據(jù)參數(shù)按約定協(xié)議返回下一頁的數(shù)據(jù),如JSON格式,客戶端通過回調(diào)函數(shù)獲取下一頁的數(shù)據(jù)后解析并顯示在界面中。
根據(jù)本發(fā)明優(yōu)選的,所述步驟(2),當(dāng)分頁加載模式為從任一項起始加載時,參數(shù)獲取方法由子類divideB實現(xiàn),設(shè)定需要獲取的兩個參數(shù)分別記為param3、param4,包括步驟如下:
C、在服務(wù)器端提供的資源池中,服務(wù)器端為顯示在ListView中的每一項內(nèi)容分別進(jìn)行標(biāo)號;
D、客戶端向服務(wù)器提出加載數(shù)據(jù)的請求時,同時向服務(wù)器發(fā)送當(dāng)前客戶端界面中的首項位置position,即得到所需參數(shù)param3為position+size1,得到所需參數(shù)param4為param3+size1-1,size1為每頁所包含的數(shù)據(jù)子項數(shù)目,服務(wù)器端根據(jù)參數(shù)按約定協(xié)議返回下一頁的數(shù)據(jù),如JSON格式,客戶端通過回調(diào)函數(shù)獲取下一頁的數(shù)據(jù)后解析并顯示在界面中。
上述參數(shù)param1、param2、param3、param4的計算方法由子類復(fù)寫實現(xiàn),父類中只提供抽象方法以供繼承。
當(dāng)應(yīng)用程序的Activity中要使用ListView控件并進(jìn)行分頁加載時,只需要根據(jù)加載模式的不同實例化相應(yīng)繼承子類的對象,復(fù)寫其加載方法并添加回調(diào)函數(shù),完成加載過程,即可實現(xiàn)快速分頁加載的操作。如果要使用其他加載模式,只需要實例化其他子類的對象即可,不必再重寫相同的分頁邏輯代碼。
本發(fā)明的有益效果為:
1、本發(fā)明將ListView分頁加載的過程拆分為實現(xiàn)基本通用分頁邏輯的抽象父類、針對不同加載模式獲取加載參數(shù)的繼承子類、對ListView分頁加載具體使用的Activity類三大部分,通過這種方法實現(xiàn)了ListView對資源的分頁加載,降低用戶等待時間的同時節(jié)省了資源消耗。
2、本發(fā)明通過封裝實現(xiàn)了ListView分頁加載功能的快速移植,當(dāng)應(yīng)用程序中需要使用該功能時,僅需實例化對象和簡單的操作即可,無需多處重復(fù)添加分頁邏輯,大大簡化了代碼復(fù)雜程度,提升了開發(fā)速度,使ListView的使用更清晰明確,同時易擴(kuò)展、易維護(hù),提升了系統(tǒng)性能。
附圖說明
圖1為Android系統(tǒng)中ListView快速分頁加載的方法的流程框圖;
圖2為按固定分頁加載對應(yīng)的繼承子類divideA類框架圖;
圖3為從任一項起始加載對應(yīng)的繼承子類divideB類框架圖;
圖4為使用ListView快速分頁功能的Activity框架圖。
具體實施方式
下面結(jié)合說明書附圖和實施例對本發(fā)明作進(jìn)一步限定,但不限于此。
實施例
一種Android系統(tǒng)中ListView快速分頁加載的方法,如圖1所示,包括步驟如下:
(1)初始化起始狀態(tài);
(2)獲取加載數(shù)據(jù)所需的參數(shù),該參數(shù)用以確定所加載數(shù)據(jù)的位置,根據(jù)分頁加載模式的不同,封裝成不同的獨立的抽象方法,即參數(shù)獲取方法,供不同的子類實現(xiàn);
當(dāng)分頁加載模式為按固定分頁加載時,參數(shù)獲取方法由子類divideA實現(xiàn),設(shè)定需要獲取的兩個參數(shù)分別記為param1、param2,如圖2所示,包括步驟如下:
A、在服務(wù)器端提供的資源池中,為全部資源進(jìn)行分頁標(biāo)號;
B、客戶端向服務(wù)器提出加載數(shù)據(jù)的請求時,同時向服務(wù)器發(fā)送當(dāng)前客戶端內(nèi)容的頁標(biāo)號index,服務(wù)器根據(jù)收到的頁標(biāo)號index,將頁標(biāo)號index加1,即得到所需參數(shù)param1為index+1;每頁所包含的數(shù)據(jù)子項數(shù)目size即為param2,服務(wù)器端根據(jù)參數(shù)按約定協(xié)議返回下一頁的數(shù)據(jù),如JSON格式,客戶端通過回調(diào)函數(shù)獲取下一頁的數(shù)據(jù)后解析并顯示在界面中。
當(dāng)分頁加載模式為從任一項起始加載時,參數(shù)獲取方法由子類divideB實現(xiàn),設(shè)定需要獲取的兩個參數(shù)分別記為param3、param4,如圖3所示,包括步驟如下:
C、在服務(wù)器端提供的資源池中,服務(wù)器端為顯示在ListView中的每一項內(nèi)容分別進(jìn)行標(biāo)號;
D、客戶端向服務(wù)器提出加載數(shù)據(jù)的請求時,同時向服務(wù)器發(fā)送當(dāng)前客戶端界面中的首項位置position,即得到所需參數(shù)param3為position+size1,得到所需參數(shù)param4為param3+size1-1,size1為每頁所包含的數(shù)據(jù)子項數(shù)目,服務(wù)器端根據(jù)參數(shù)按約定協(xié)議返回下一頁的數(shù)據(jù),如JSON格式,客戶端通過回調(diào)函數(shù)獲取下一頁的數(shù)據(jù)后解析并顯示在界面中。
(3)封裝加載數(shù)據(jù)抽象方法,在本方法中需要調(diào)用步驟(2)中的參數(shù)獲取方法,將加載數(shù)據(jù)所需的參數(shù)傳遞到本步驟的方法中;
(4)實現(xiàn)具體的數(shù)據(jù)加載方法,即對步驟(3)中封裝的加載數(shù)據(jù)抽象方法進(jìn)行具體使用:先判斷加載標(biāo)志位狀態(tài),如果加載標(biāo)志位狀態(tài)為false狀態(tài)時,則判定當(dāng)前沒有加載任務(wù),調(diào)用步驟(3)中的加載數(shù)據(jù)抽象方法,同時將加載標(biāo)志位置為true狀態(tài);否則,當(dāng)加載標(biāo)志位狀態(tài)為true狀態(tài)時,則判定當(dāng)前有加載任務(wù),不執(zhí)行加載方法,也不返回任何數(shù)據(jù);加載標(biāo)志位是一個boolean類型的量,包括true狀態(tài)和false狀態(tài)兩種狀態(tài),false狀態(tài)表示當(dāng)前沒有加載線程執(zhí)行,true狀態(tài)表示當(dāng)前已有加載線程正在運行;
(5)當(dāng)加載結(jié)束時,判斷是否成功加載新數(shù)據(jù),如果成功,ListView的適配器會收到新數(shù)據(jù),更新當(dāng)前顯示界面頁標(biāo)號參數(shù),就是賦新值,更新為返回來的當(dāng)前參數(shù)值,并返回本次加載所讀取的新數(shù)據(jù),并在客戶端進(jìn)行顯示,同時將加載標(biāo)志位置為false;如果加載失敗,返回原來的頁標(biāo)號狀態(tài),即返回原狀態(tài)。不影響下一次的加載請求。
上述步驟(3)至步驟(5)由抽象父類即divideBase類來實現(xiàn)。由此完成了客戶端請求服務(wù)器端加載資源的通用邏輯封裝。
上述參數(shù)param1、param2、param3、param4的計算方法由子類復(fù)寫實現(xiàn),父類中只提供抽象方法以供繼承。
當(dāng)應(yīng)用程序的Activity中要使用ListView控件并進(jìn)行分頁加載時,只需要根據(jù)加載模式的不同實例化相應(yīng)繼承子類的對象,復(fù)寫其加載方法并添加回調(diào)函數(shù),完成加載過程,即可實現(xiàn)快速分頁加載的操作。如果要使用其他加載模式,只需要實例化其他子類的對象即可,不必再重寫相同的分頁邏輯代碼。如圖4所示。