專利名稱:一種提高列表刷新頻率的方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明屬于多媒體技術(shù)領(lǐng)域,尤其涉及一種提高列表刷新頻率的方法及裝置。
背景技術(shù):
隨著無線通信技術(shù)的發(fā)展,移動互聯(lián)網(wǎng)時代的到來,以手機為代表的移動終端越來越智能化,借助豐富的應(yīng)用軟件,智能手機就是一臺微型計算機。而作為核心的操作系統(tǒng)也成為其最重要的部分,例如蘋果公司開發(fā)的IOS操作系統(tǒng)、微軟公司開發(fā)的Windows Mobile操作系統(tǒng)以及谷歌公司開發(fā)的android操作系統(tǒng)。其中,android系統(tǒng)由于其顯著的開放性吸引了眾多移動終端廠商加入到Android聯(lián)盟中,在市場中占據(jù)著重要的位置。在android系統(tǒng)中Listview(列表視圖)是一個很重要的組件,它通過加載顯示數(shù)據(jù)再以列表的形式根據(jù)數(shù)據(jù)的長度適應(yīng)展示具體內(nèi)容,用戶可以自由的定義Iistview 每一列的布局,但當(dāng)列表中有大量的數(shù)據(jù)需要加載的時候,會占據(jù)大量內(nèi)存,影響性能;并且在Listview每個數(shù)組中都有圖片要顯示時,實時顯示圖片也會占用大量內(nèi)存并降低使用效率,使得Iistview滾動不順暢,影響用戶的使用體驗。
發(fā)明內(nèi)容
本發(fā)明提供了一種提高列表刷新頻率的方法及裝置,旨在解決現(xiàn)有技術(shù)中由于列表實時加載數(shù)據(jù)占據(jù)內(nèi)存及實時顯示圖片影響效率的問題。本發(fā)明是這樣實現(xiàn)的,一種提高列表刷新頻率的方法,包括步驟a 準備列表視圖要顯示的數(shù)據(jù),并使用動態(tài)數(shù)組保存數(shù)據(jù);步驟b 構(gòu)建適配器,生成適配器的Item數(shù)組和動態(tài)數(shù)組對應(yīng)的數(shù)據(jù)元素;步驟c 優(yōu)化適配器,生成視圖對象,設(shè)置視圖對象的標簽屬性,并將已生成的視圖對象緩存在本地;步驟d 將適配器添加到列表視圖,顯示視圖對象。本發(fā)明的技術(shù)方案還包括所述步驟c還包括判斷參數(shù)convertView是否為空, 如果convertView為空,則從資源文件中加載一個convertView對象,生成convertView 對象的標簽對象,為convertView對象的屬性賦值,并設(shè)置convertView的標簽屬性為 ViewHolder0本發(fā)明的技術(shù)方案還包括所述步驟c還包括如果convertView不為空,則獲取 convertView的標簽屬性,并調(diào)用convertView的標簽屬性,為convertView的每個屬性賦值。本發(fā)明的技術(shù)方案還包括所述步驟d還包括判斷本地緩存是否存在圖片數(shù)據(jù), 如果本地緩存不存在圖片數(shù)據(jù),連接網(wǎng)絡(luò)進行異步加載圖片;如果本地緩存存在圖片數(shù)據(jù), 則獲取實際圖片的大小。本發(fā)明的技術(shù)方案還包括所述步驟d還包括根據(jù)實際圖片的長和寬算出圖片壓縮比,根據(jù)圖片壓縮比將實際圖片壓縮為需要的圖片,并將壓縮后的圖片用弱引用進行保存供下次使用。本發(fā)明的技術(shù)方案還包括所述步驟d還包括判斷當(dāng)前列表視圖的滾動狀態(tài),如果當(dāng)前列表視圖的滾動狀態(tài)為快速滾動,顯示默認圖片;如果當(dāng)前列表視圖的滾動狀態(tài)為停止?jié)L動或慢速滾動,根據(jù)相應(yīng)Item數(shù)組的id顯示具體圖片。本發(fā)明提供的另一技術(shù)方案一種提高列表刷新頻率的裝置,其特征在于,包括數(shù)據(jù)確定模塊、數(shù)據(jù)存儲模塊、數(shù)組構(gòu)建模塊、視圖優(yōu)化模塊和視圖顯示模塊,所述數(shù)據(jù)確定模塊用于準備列表視圖要顯示的數(shù)據(jù),所述數(shù)據(jù)存儲模塊用于使用動態(tài)數(shù)組保存數(shù)據(jù),所述數(shù)組構(gòu)建模塊用于構(gòu)建適配器,所述視圖優(yōu)化模塊用于優(yōu)化適配器,生成視圖對象,設(shè)置視圖對象的標簽屬性,并將已生成的視圖對象緩存在本地,所述視圖顯示模塊用于把適配器添加到列表視圖,顯示視圖對象。本發(fā)明的技術(shù)方案還包括所述視圖優(yōu)化模塊具體還包括視圖判斷單元、視圖加載單元、視圖設(shè)置單元和屬性賦值單元,所述視圖判斷單元用于判斷參數(shù)corwertView是否為空,如果convertView為空,通過視圖加載單元加載視圖對象;如果convertView不為空,通過屬性賦值單元為corwertView的屬性賦值;所述視圖加載單元用于從資源文件中加載一個convertView對象;所述視圖設(shè)置單元用于為convertView對象生成標簽對象、 為convertView對象的屬性賦值、為convertView對象的屬性賦值、并設(shè)置convertView 的標簽屬性為ViewHolder ;所述屬性賦值單元用于獲取convertView的標簽屬性為 convertView的每個屬性賦值。本發(fā)明的技術(shù)方案還包括所述視圖顯示模塊還包括緩存判斷單元、圖片加載單元、圖片壓縮單元和圖片保存單元,所述緩存判斷單元用于判斷本地緩存是否存在圖片數(shù)據(jù),如果本地緩存不存在圖片數(shù)據(jù),通過圖片加載單元加載圖片;如果本地緩存存在圖片數(shù)據(jù),通過圖片壓縮單元壓縮圖片;所述圖片加載單元用于連接網(wǎng)絡(luò)進行異步加載圖片;所述圖片壓縮單元用于獲取實際圖片的大小,根據(jù)實際圖片的長和寬算出圖片壓縮比,并根據(jù)圖片壓縮比將實際圖片壓縮為需要的圖片;所述圖片保存單元用于將壓縮后的圖片用弱引用保存到HashMap中供下次使用。本發(fā)明的技術(shù)方案還包括所述視圖顯示模塊還包括狀態(tài)判斷單元和圖片顯示單元,所述狀態(tài)判斷單元用于判斷當(dāng)前列表視圖的滾動狀態(tài),并根據(jù)不同的滾動狀態(tài)通過圖片顯示單元顯示相應(yīng)的圖片;所述圖片顯示單元用于根據(jù)當(dāng)前列表視圖的滾動狀態(tài)顯示相應(yīng)的圖片,具體包括如果當(dāng)前列表視圖的滾動狀態(tài)為快速滾動,則顯示默認圖片;如果當(dāng)前列表視圖的滾動狀態(tài)為停止?jié)L動或慢速滾動,則根據(jù)相應(yīng)Item數(shù)組的id顯示具體圖片。本發(fā)明的技術(shù)方案具有如下優(yōu)點或有益效果本發(fā)明提高列表刷新頻率的方法及裝置通過存儲和利用已生成的視圖對象,減少系統(tǒng)生成的視圖個數(shù),并充分利用視圖對象的tag標簽,避免系統(tǒng)大量生成一次性使用的數(shù)據(jù),減少了系統(tǒng)內(nèi)存開銷,大大提高了性能;并且對圖片加載方式采用了壓縮、保存和根據(jù)滾動狀態(tài)顯示三種步驟的優(yōu)化,使得列表視圖顯示圖片的速度更快,滾動更流暢。
附圖1是本發(fā)明第一實施例的提高列表刷新頻率的方法的流程圖;附圖2是本發(fā)明第二實施例的提高列表刷新頻率的方法的流程附圖3是適配器映射數(shù)據(jù)的工作原理圖;附圖4是本發(fā)明優(yōu)化適配器的方法的流程圖;附圖5是本發(fā)明列表視圖數(shù)據(jù)顯示的方法的流程圖;附圖6是本發(fā)明第一實施例的提高列表刷新頻率的裝置的結(jié)構(gòu)示意圖;附圖7是本發(fā)明第二實施例的提高列表刷新頻率的裝置的結(jié)構(gòu)示意圖。
具體實施例方式為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下結(jié)合附圖及實施例,對本發(fā)明進行進一步詳細說明。應(yīng)當(dāng)理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。請參閱圖1,是本發(fā)明第一實施例的提高列表刷新頻率的方法的流程圖。本發(fā)明第一實施例的提高列表刷新頻率的方法包括以下步驟步驟100 準備列表視圖要顯示的數(shù)據(jù),并使用動態(tài)數(shù)組保存數(shù)據(jù);在步驟100中,顯示數(shù)據(jù)包括字符串、圖片或/和其他基本組件,這些數(shù)據(jù)將會通過適配器被映射顯示到ListView(列表視圖)上;動態(tài)數(shù)組包括一維動態(tài)數(shù)組或多維動態(tài)數(shù)組。步驟110 構(gòu)建適配器,生成適配器的Item數(shù)組和動態(tài)數(shù)組對應(yīng)的數(shù)據(jù)元素;在步驟110中,適配器就是Item(項目)數(shù)組,動態(tài)數(shù)組中有多少個數(shù)據(jù)元素就生成對應(yīng)個數(shù)的Item數(shù)組;適配器是用來把數(shù)據(jù)映射到列表視圖上的中介,是列表視圖界面與數(shù)據(jù)之間的橋梁,當(dāng)列表里的每一項顯示到頁面時,都會調(diào)用適配器的getView方法返回一個View(視圖)對象。步驟120 優(yōu)化適配器,調(diào)用getview方法生成視圖對象,設(shè)置視圖對象的標簽屬性,并將已生成的視圖對象緩存在本地;在步驟120中,在繪制列表視圖之前,會先調(diào)用getView方法獲取Item數(shù)組的個數(shù),之后每繪制一個Item數(shù)組就會重復(fù)調(diào)用一次getView方法,在此方法內(nèi)就可以引用事先定義好的xml (可擴展標記語言)來確定顯示的效果并返回一個視圖對象作為一個Item 數(shù)組顯示出來。也正是在這個過程中完成了適配器的主要轉(zhuǎn)換功能,把數(shù)據(jù)以開發(fā)者想要的效果顯示出來;也正是getView的重復(fù)調(diào)用,使得列表視圖的使用更為簡單和靈活,但當(dāng)列表中有大量的數(shù)據(jù)(例如1000000項時)需要加載的時候,getView的重復(fù)調(diào)用就會占據(jù)大量內(nèi)存,影響性能及效率。本發(fā)明的重點在于保存并利用已生成的視圖對象,減少系統(tǒng)加載的視圖個數(shù),并充分利用視圖對象的標簽屬性,避免系統(tǒng)一次性大量加載使用的數(shù)據(jù)。步驟130 將適配器添加到列表視圖,顯示視圖對象。在步驟130中,當(dāng)顯示數(shù)據(jù)是圖片時,先對圖片做處理,以減少內(nèi)存開銷根據(jù)具體ITEM數(shù)組要顯示的圖片大小,把要加載的圖片數(shù)據(jù)先按比例進行壓縮,然后用弱引用保存到本地HashMap中,下次使用時直接從本地HashMap中獲取數(shù)據(jù),避免相同的數(shù)據(jù)需要重復(fù)加載的不便。請參閱圖2,是本發(fā)明第二實施例的提高列表刷新頻率的方法的流程圖。本發(fā)明第二實施例的提高列表刷新頻率的方法包括以下步驟步驟200 準備列表視圖要顯示的數(shù)據(jù);
在步驟200中,顯示數(shù)據(jù)包括字符串、圖片或/和其他基本組件,這些數(shù)據(jù)將會通過適配器被映射顯示到ListView(列表視圖)上。步驟210 使用動態(tài)數(shù)組保存數(shù)據(jù);在步驟210中,動態(tài)數(shù)組包括一維動態(tài)數(shù)組或多維動態(tài)數(shù)組。步驟220 構(gòu)建適配器,生成適配器的Item數(shù)組和動態(tài)數(shù)組對應(yīng)的數(shù)據(jù)元素;在步驟220中,適配器就是Item數(shù)組,動態(tài)數(shù)組中有多少個數(shù)據(jù)元素就生成對應(yīng)個數(shù)的Item數(shù)組;適配器是用來把數(shù)據(jù)映射到列表視圖上的中介,是列表視圖界面與數(shù)據(jù)之間的橋梁,當(dāng)列表里的每一項顯示到頁面時,都會調(diào)用適配器的getView方法返回一個 View(視圖)對象,具體請一并參閱圖3,是適配器映射數(shù)據(jù)的工作原理圖。步驟230 優(yōu)化適配器,調(diào)用getView方法生成視圖對象,設(shè)置視圖對象的標簽屬性,并將已生成的視圖對象緩存在本地;在步驟230中,在繪制列表視圖之前,會先調(diào)用getView方法獲取Item數(shù)組的個數(shù),之后每繪制一個Item數(shù)組就會重復(fù)調(diào)用一次getView方法,在此方法內(nèi)就可以引用事先定義好的xml (可擴展標記語言)來確定顯示的效果并返回一個視圖對象作為一個Item 數(shù)組顯示出來。也正是在這個過程中完成了適配器的主要轉(zhuǎn)換功能,把數(shù)據(jù)以開發(fā)者想要的效果顯示出來;也正是getView的重復(fù)調(diào)用,使得列表視圖的使用更為簡單和靈活,但當(dāng)列表中有大量的數(shù)據(jù)(例如1000000項時)需要加載的時候,getView的重復(fù)調(diào)用就會占據(jù)大量內(nèi)存,影響性能及效率。本發(fā)明的重點在于保存并利用已生成的視圖對象,減少系統(tǒng)加載的視圖個數(shù),并充分利用視圖對象的tag標簽,避免系統(tǒng)一次性大量加載使用的數(shù)據(jù)。 為了清楚說明步驟230,請一并參閱圖4,是本發(fā)明優(yōu)化適配器的方法的流程圖。本發(fā)明優(yōu)化適配器的方法包括步驟231 判斷參數(shù)convertView是否為空,如果convertView為空,執(zhí)行步驟 232 ;如果convertView不為空,執(zhí)行步驟236 ;步驟232 從資源文件中加載一個convertView對象;步驟233 生成convertView對象的標簽對象;步驟234 為convertView對象的屬性賦值;步驟235 設(shè)置 convertView 的標簽屬性為 ViewHolder ;其中,ViewHolder具有緩存功能,可將視圖對象緩存在本地方便下次使用,而不必重新調(diào)用getview獲取數(shù)據(jù)。步驟236 獲取convertView的標簽屬性,并調(diào)用convertView的標簽屬性,為 convertView的每個屬性賦值。其中,屬性賦值代碼如下public View getView(int position, View convert View, ViewGroup parent)
ViewHolder holder; if (convert View == null)
convert View = mInflater.inflate(R.layout.list—item—icon—text, parent, false);
holder = new ViewHolderQ;
holder.text = (TextView) convertView.findViewByld(R.id.text); holder.icon = (ImageView) convert View, find ViewById(R. id. icon); convert View. setTag(holder);
else
holder = (ViewHolder) convertView.getTagQ; }
holder.text.setText(DATA[position]);
holder.icon.setImageBitmap((position & 1) == 1 mlconl : mIcon2);
return convert View; }步驟MO 將適配器添加到列表視圖,顯示視圖對象。在步驟MO中,當(dāng)顯示數(shù)據(jù)是圖片時,先對圖片做處理,以減少內(nèi)存開銷根據(jù)具體ITEM數(shù)組要顯示的圖片大小,把要加載的圖片數(shù)據(jù)先按比例進行壓縮,然后用弱引用保存到本地HashMap中,下次使用時直接從本地HashMap中獲取數(shù)據(jù),避免相同的數(shù)據(jù)需要重復(fù)加載的不便。為了清楚說明步驟對0,請一并參閱圖5,是本發(fā)明列表視圖數(shù)據(jù)顯示的方法的流程圖。本發(fā)明列表視圖數(shù)據(jù)顯示的方法包括以下步驟步驟Ml 判斷本地緩存是否存在圖片數(shù)據(jù),如果本地緩存不存在圖片數(shù)據(jù),執(zhí)行步驟M2 ;如果本地緩存存在圖片數(shù)據(jù),執(zhí)行步驟M3 ;步驟M2 連接網(wǎng)絡(luò)進行異步加載圖片;其中,獲取網(wǎng)絡(luò)數(shù)據(jù)或需要大量計算時采用異步方式加載圖片,ListView異步加載圖片是非常實用的方法,凡是是要通過網(wǎng)絡(luò)獲取圖片資源一般使用這種方法比較好, ListView異步加載圖片的Java主代碼如下
public class AsyncImageLoader {
private HashMap<String, SoftReference<Drawable>> imageCache; public AsyncImageLoader() {
imageCache=newHashMap<String,
SoftReference<Drawable (); }
public Drawable loadDrawable(final String imageUrl, final ImageCallback imageCallback) {
if (imageCache. containsKey(imageUrl)) {
SoftReference<Drawable>softReference=
imageCache. get(imageUrl);
Drawable drawable = softReference. get();if (drawable ! = null) { return drawable;
final Handler handler = new HandlerQ {
public void handleMessage(Message message) { imageCallback.imageLoaded((Drawable)
message.obj, imageUrl);
new Thread() { @Override public void run() { Drawable
drawable
IoadTm ageFrom Url (i m ageUrl);
imageCache.put(imageUrl,new
SoftReference<Drawable>(drawable));
Message message = handler. obtainMessage(0,
drawable);
handler. sendMessage(message);
}
}. start(); return null;
public static Drawable loadImageFromUrl(String url) { URL m;
InputStream i = null;
try
m = new URL(url);i = (InputStream) m.getContent(); } catch (MalformedURLException el) {
el .printStackTrace(); } catch (IOException e) { e.printStackTrace();
}
Drawable d = Drawable.createFromStream(i, "src"); return d;
}
public interface ImageCallback {
public void imageLoaded(Drawable imageDrawable, String
imageUrl);
}
}步驟M3 :獲取實際圖片的大??;步驟244 根據(jù)實際圖片的長和寬按一定比例算出圖片壓縮比;其中,圖片壓縮比例可根據(jù)不同需求進行設(shè)置。步驟M5 根據(jù)圖片壓縮比將實際圖片壓縮為需要的圖片;步驟M6 將壓縮后的圖片用弱引用保存到HashMap中供下次使用。代碼如下
public static Bitmap fetchDrawable(String urlString, int widghet, int height) { if (url String == null) { return null;
}
SoftReference<Bitmap>drawableRef=
drawableMap.get(urlString);/ΜΛ map 中去獲圖片
File file = new File(urlString);//根椐 URL 得到文件類型 Bitmap tem = null;if(file.isFile()) {
BitmapFactory. Optionsoptions=new
BitmapFactory.Options();
options. in JustDecodeB ounds = true; BitmapFactory.decodeFile(urlString, options);//解碼圖片 if (drawableRef != null && options.outHeight == height && options.out Width == widghet) {
Bitmap drawable = drawableRef.get(); if (drawable ! = null) { return drawable;
}
drawableMap.remove(urlString); }
options.inSampleSize=
Tools.computeInitialSampleSize(options, -1, widghet * height);//壓縮圖片
options.inPurgeable = true; options.inlnputShareable = true; options. in JustDecodeB ounds = false; try {
tem = BitmapFactory.decodeFile(urlString, options); } catch (Error e) {
e.printStackTrace();
}
if (tem != null) {//把圖片放到 map 中
drawableRef = new SoftReference<Bitmap>(tem); drawableMap .put(url String, drawableRef); } else {
Log.e(LOG_TAG, " [fetchDrawable] could not getreturn tem;
}步驟247 判斷當(dāng)前列表視圖的滾動狀態(tài),如果當(dāng)前列表視圖的滾動狀態(tài)為快速滾動,執(zhí)行步驟248 ;如果當(dāng)前列表視圖的滾動狀態(tài)為停止?jié)L動或慢速滾動,執(zhí)行步驟M9 ;步驟M8 顯示默認圖片;步驟M9 根據(jù)相應(yīng)Item數(shù)組的id顯示具體圖片;步驟250 結(jié)束本次顯示。其中,代碼如下
Listview.setOnscrollListener(new OnScrollListenerQ { @Override
public void onScrollStateChanged(AbsListView view, int scroll State) { if (scrollState == OnScrollListener.SCROLL—STATE—IDLE
IlscrollState==
OnScrollListener.SCROLL—STATE—TOUCH—SCROLL) { //如果listview正在高速滾動、則用默認圖片顯示
if (scrollState == OnScrollListener.SCROLL—STATE—FLING
IlscrollState
OnScrollListener.SCROLL—STATE—TOUCH—SCROLL) {
//如果listview沒有高速滾動、則用顯示
具體圖片
});請參閱圖6,是本發(fā)明第一實施例的提高列表刷新頻率的裝置的結(jié)構(gòu)示意圖。本發(fā)明第一實施例的提高列表刷新頻率的裝置包括數(shù)據(jù)確定模塊、數(shù)據(jù)存儲模塊、數(shù)組構(gòu)建模塊、視圖優(yōu)化模塊和視圖顯示模塊,其中數(shù)據(jù)確定模塊用于準備列表視圖要顯示的數(shù)據(jù);其中,顯示數(shù)據(jù)包括字符串、圖片或/和其他基本組件,這些數(shù)據(jù)將會通過適配器被映射顯示到ListView(列表視圖)上。數(shù)據(jù)存儲模塊用于使用動態(tài)數(shù)組保存數(shù)據(jù);其中,可根據(jù)需求使用一維動態(tài)數(shù)組或多維動態(tài)數(shù)組。數(shù)組構(gòu)建模塊用于構(gòu)建適配器;其中,適配器就是Item數(shù)組,動態(tài)數(shù)組中有多少個數(shù)據(jù)元素就生成相同個數(shù)的Item數(shù)組;適配器是用來把數(shù)據(jù)映射到列表視圖上的中介, 是列表視圖界面與數(shù)據(jù)之間的橋梁,當(dāng)列表里的每一項顯示到頁面時,都會調(diào)用適配器的 getView方法返回一個View (視圖)對象。視圖優(yōu)化模塊用于優(yōu)化適配器,生成視圖對象,設(shè)置視圖對象的標簽屬性,并將已生成的視圖對象緩存在本地;其中,在繪制列表視圖之前,會先調(diào)用getView方法獲取Item 數(shù)組的個數(shù),之后每繪制一個Item數(shù)組就會重復(fù)調(diào)用一次getView方法,在此方法內(nèi)就可以引用事先定義好的xml (可擴展標記語言)來確定顯示的效果并返回一個視圖對象作為一個Item數(shù)組顯示出來。也正是在這個過程中完成了適配器的主要轉(zhuǎn)換功能,把數(shù)據(jù)以開發(fā)者想要的效果顯示出來;也正是getView的重復(fù)調(diào)用,使得列表視圖的使用更為簡單和靈活,但當(dāng)列表中有大量的數(shù)據(jù)(例如1000000項時)需要加載的時候,getView的重復(fù)調(diào)用就會占據(jù)大量內(nèi)存,影響性能及效率。本發(fā)明的重點在于保存并利用已生成的視圖對象, 減少系統(tǒng)加載的視圖個數(shù),并充分利用視圖對象的tag標簽,避免系統(tǒng)一次性大量加載使用的數(shù)據(jù)。視圖顯示模塊用于把適配器添加到列表視圖,顯示視圖對象;其中,當(dāng)顯示數(shù)據(jù)是圖片時,先對圖片做處理,以減少內(nèi)存開銷根據(jù)具體ITEM數(shù)組要顯示的圖片大小,把要加載的圖片數(shù)據(jù)先按比例進行壓縮,然后用弱引用保存到本地HashMap中,下次使用時直接從本地HashMap中獲取數(shù)據(jù),避免相同的數(shù)據(jù)需要重復(fù)加載的不便。請參閱圖7,是本發(fā)明第二實施例的提高列表刷新頻率的裝置的結(jié)構(gòu)示意圖。本發(fā)明第二實施例的提高列表刷新頻率的裝置包括數(shù)據(jù)確定模塊、數(shù)據(jù)存儲模塊、數(shù)組構(gòu)建模塊、視圖優(yōu)化模塊和視圖顯示模塊,數(shù)據(jù)確定模塊用于準備列表視圖要顯示的數(shù)據(jù);其中,顯示數(shù)據(jù)包括字符串、圖片或/和其他基本組件,這些數(shù)據(jù)將會通過適配器被映射顯示到ListView(列表視圖)上。數(shù)據(jù)存儲模塊用于使用動態(tài)數(shù)組保存數(shù)據(jù);其中,可根據(jù)需求使用一維動態(tài)數(shù)組或多維動態(tài)數(shù)組。數(shù)組構(gòu)建模塊用于構(gòu)建適配器,生成適配器的Item數(shù)組和動態(tài)數(shù)組對應(yīng)的數(shù)據(jù)元素;其中,適配器就是Item數(shù)組,動態(tài)數(shù)組中有多少個數(shù)據(jù)元素就生成相同個數(shù)的Item 數(shù)組;適配器是用來把數(shù)據(jù)映射到列表視圖上的中介,是列表視圖界面與數(shù)據(jù)之間的橋梁, 當(dāng)列表里的每一項顯示到頁面時,都會調(diào)用適配器的getView方法返回一個View(視圖) 對象。視圖優(yōu)化模塊用于優(yōu)化適配器,調(diào)用getView方法生成視圖對象,設(shè)置視圖對象的標簽屬性,并將已生成的視圖對象緩存在本地;其中,在繪制列表視圖之前,會先調(diào)用 getView方法獲取Item數(shù)組的個數(shù),之后每繪制一個Item數(shù)組就會重復(fù)調(diào)用一次getView 方法,在此方法內(nèi)就可以引用事先定義好的xml (可擴展標記語言)來確定顯示的效果并返回一個視圖對象作為一個Item數(shù)組顯示出來。也正是在這個過程中完成了適配器的主要轉(zhuǎn)換功能,把數(shù)據(jù)以開發(fā)者想要的效果顯示出來;也正是getView的重復(fù)調(diào)用,使得列表視圖的使用更為簡單和靈活,但當(dāng)列表中有大量的數(shù)據(jù)(例如1000000項時)需要加載的時候,getView的重復(fù)調(diào)用就會占據(jù)大量內(nèi)存,影響性能及效率。本發(fā)明的重點在于保存并利用已生成的視圖對象,減少系統(tǒng)加載的視圖個數(shù),并充分利用視圖對象的tag標簽,避免系統(tǒng)一次性大量加載使用的數(shù)據(jù)。視圖優(yōu)化模塊具體還包括視圖判斷單元、視圖加載單元、視圖設(shè)置單元和屬性賦值單元視圖判斷單元用于判斷參數(shù)convertView是否為空,如果convertView為空,通過視圖加載單元加載視圖對象;如果convertView不為空,通過屬性賦值單元為convertView 的屬性賦值;視圖加載單元用于從資源文件中加載一個convertView對象;視圖設(shè)置單元用于為convertView對象生成標簽對象、為convertView對象的屬性賦值、為convertView對象的屬性賦值、并設(shè)置convertView的標簽屬性為ViewHolder ; 其中,ViewHolder具有緩存功能,可將view數(shù)據(jù)緩存在本地方便下次使用,而不必重新調(diào)用getview獲取數(shù)據(jù)。屬性賦值單元用于獲取convertView的標簽屬性,并調(diào)用convertView的標簽屬性,為convertView的每個屬性賦值。其中,屬性賦值代碼如下
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list—item—icon—text, parent, false);
holder = new ViewHolderQ;
holder.text = (TextView) convertView.findViewByld(R.id.text); holder.icon = (ImageView) convertView.findViewById(R.id.icon);
convertView. setTag(holder); }else
holder = (ViewHolder) convertView.getTagQ;
holder.text.setText(DATA[position]);
holder.icon.setImageBitmap((position & 1) == 1 mlconl : mIcon2);
return convert View; }視圖顯示模塊用于把適配器添加到列表視圖,顯示視圖對象;其中,當(dāng)顯示數(shù)據(jù)是圖片時,先對圖片做處理,以減少內(nèi)存開銷根據(jù)具體ITEM數(shù)組要顯示的圖片大小,把要加載的圖片數(shù)據(jù)先按比例進行壓縮,然后用弱引用保存到本地HashMap中,下次使用時直接從本地HashMap中獲取數(shù)據(jù),避免相同的數(shù)據(jù)需要重復(fù)加載的不便;視圖顯示模塊具體還包括緩存判斷單元、圖片加載單元、圖片壓縮單元、圖片保存單元、狀態(tài)判斷單元和圖片顯示單元,緩存判斷單元用于判斷本地緩存是否存在圖片數(shù)據(jù),如果本地緩存不存在圖片數(shù)據(jù),通過圖片加載單元加載圖片;如果本地緩存存在圖片數(shù)據(jù),通過圖片壓縮單元壓縮圖片;圖片加載單元用于連接網(wǎng)絡(luò)進行異步加載圖片;其中,獲取網(wǎng)絡(luò)數(shù)據(jù)或需要大量計算時采用異步方式加載圖片,LiStView異步加載圖片是非常實用的方法,凡是是要通過網(wǎng)絡(luò)獲取圖片資源一般使用這種方法比較好,ListView異步加載圖片的Java主代碼如下
public class AsyncImageLoader {
private HashMap<String, SoftReference<Drawable>> imageCache; public AsyncImageLoader() {
imageCache=newHashMap<String,
SoftReference<Drawable (); }public Drawable loadDrawable(final String imageUrl, final ImageCallback imageCallback) {
if (imageCache. containsKey(imageUrl)) {
S oftReference<Drawable> softReference = imageCache.get(imageUrl);
Drawable drawable = softReference.get(); if (drawable != null) { return drawable:
final Handler handler = new Handler() {
public void handleMessage(Message message) { imageCallback.imageLoaded((Drawable)
message.obj, imageUrl);
}
};
new Thread() { @Override public void run() {
Drawabledrawable=
loadlmageFromUrl(imageUrl);
imageCache.put(imageUrl,new
SoftReference<Drawable>(drawable));
Message message = handler.obtainMessage(0,
drawable);
handler.sendMessage(message);
}.start(); return null;public static Drawable loadImageFromUrl(String url) { URL m;
InputStream i = null; try {
m = new URL(url); i = (InputStream) m.getContent(); } catch (MalformedURLException el) {
el .printStackTrace(); } catch (IOException e) { e.printStackTrace();
}
Drawable d = Drawable.createFromStream(i, "src"); return d;
}
public interface ImageCallback {
public void imageLoaded(Drawable imageDrawable, String
imageUrl);
}
}圖片壓縮單元用于獲取實際圖片的大小,根據(jù)實際圖片的長和寬按一定比例算出圖片壓縮比,并根據(jù)圖片壓縮比將實際圖片壓縮為需要的圖片;其中,圖片壓縮比例可根據(jù)不同需求進行設(shè)置。圖片保存單元用于將壓縮后的圖片用弱引用保存到HashMap中供下次使用;代碼
如下
public static Bitmap fetchDrawable( String url String, int widghet, int height) { if (url String == null) { return null;
}SoftReference<Bitmap>drawableRef=
drawableMap.get(urlString);///Λ map 中去獲圖片
File file = new File(urlString);//根據(jù) URL 得到文件類型 Bitmap tem = null;
if(file.isFile()) {
BitmapFactory.Optionsoptions=new
BitmapFactory.Options();
options, in JustDecodeBounds = true; BitmapFactory.decodeFile(urlString, options);//解碼圖片 if (drawableRef != null && options.outHeight == height && options.out Width == widghet) {
Bitmap drawable = drawableRef.get(); if (drawable ! = null) { return drawable;
}
drawableMap.remove(urlString); }
options.inSampleSize=
Tools.computeInitialSampleSize(options, -1, widghet * height);//壓縮圖片 options. inPurgeable = true; options .inlnputShareable = true; options.inJustDecodeBounds = false; try {
tem = BitmapFactory.decodeFile(urlString, options); } catch (Error e) {
e.printStackTrace();
}
if (tem !=null) {/對巴圖片放到map中drawableRef = new SoftReference<Bitmap>(tem) drawableMap .put(url String, drawableRef);
else
Log.e(LOG_TAG, " [fetchDrawable] could not get
thumbnail")
return tem狀態(tài)判斷單元用于判斷當(dāng)前列表視圖的滾動狀態(tài),并根據(jù)不同的滾動狀態(tài)通過圖片顯示單元顯示相應(yīng)的圖片;圖片顯示單元用于根據(jù)當(dāng)前列表視圖的滾動狀態(tài)顯示相應(yīng)的圖片,具體為如果當(dāng)前列表視圖的滾動狀態(tài)為快速滾動,則顯示默認圖片;如果當(dāng)前列表視圖的滾動狀態(tài)為停止?jié)L動或慢速滾動,則根據(jù)相應(yīng)Item數(shù)組的id顯示具體圖片。其中,代碼如下
Listview.setOnscrollListener(new OnScrollListenerQ { @Override
public void onScrollStateChanged(AbsListView view, int scroll State) { if (scrollState == OnScrollListener.SCROLL—STATE—IDLE
scroll State
OnScrollListener.SCROLL—STATE—TOUCH—SCROLL) { //如果listview正在高速滾動、則用默認圖片顯示
if (scrollState == OnScrollListener.SCROLL—STATE—FLING
scrollStateOnScrollListener.SCROLL—STATE—TOUCH—SCROLL) {
//如果listview沒有高速滾動、則用顯示
具體圖片
});本發(fā)明提高列表刷新頻率的方法及裝置通過存儲和利用已生成的視圖對象,減少系統(tǒng)生成的視圖個數(shù),并充分利用視圖對象的tag標簽,避免系統(tǒng)大量生成一次性使用的數(shù)據(jù),例如如果每個列表視圖每屏要顯示X個ITEM數(shù)組,則不管這個列表視圖有多少項,只會分別生成X+1個convertVi ew和ViewHoIder對象,減少了系統(tǒng)內(nèi)存開銷,大大提高了性能;并且對圖片加載方式采用了壓縮、保存和根據(jù)滾動狀態(tài)顯示三種步驟的優(yōu)化,使得列表視圖顯示圖片的速度更快,滾動更流暢。以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進等,均應(yīng)包含在本發(fā)明的保護范圍之內(nèi)。
權(quán)利要求
1.一種提高列表刷新頻率的方法,包括步驟a 準備列表視圖要顯示的數(shù)據(jù),并使用動態(tài)數(shù)組保存數(shù)據(jù);步驟b 構(gòu)建適配器,生成適配器的項目數(shù)組和動態(tài)數(shù)組對應(yīng)的數(shù)據(jù)元素;步驟c 優(yōu)化適配器,生成視圖對象,設(shè)置視圖對象的標簽屬性,并將已生成的視圖對象緩存在本地;步驟d 將適配器添加到列表視圖,顯示視圖對象。
2.根據(jù)權(quán)利要求1所述的提高列表刷新頻率的方法,其特征在于,所述步驟c還包括判斷參數(shù)convertView是否為空,如果convertView為空,則從資源文件中加載一個 convertView對象,生成convertView對象的標簽對象,為convertView對象的屬性賦值,并設(shè)置convertView的標簽屬性為ViewHolder。
3.根據(jù)權(quán)利要求2所述的提高列表刷新頻率的方法,其特征在于,所述步驟c還包括 如果convertView不為空,則獲取convertView的標簽屬性,并調(diào)用convertView的標簽屬性,為convertView的每個屬性賦值。
4.根據(jù)權(quán)利要求2所述的提高列表刷新頻率的方法,其特征在于,所述步驟d還包括 判斷本地緩存是否存在圖片數(shù)據(jù),如果本地緩存不存在圖片數(shù)據(jù),連接網(wǎng)絡(luò)進行異步加載圖片;如果本地緩存存在圖片數(shù)據(jù),則獲取實際圖片的大小。
5.根據(jù)權(quán)利要求4所述的提高列表刷新頻率的方法,其特征在于,所述步驟d還包括 根據(jù)實際圖片的長和寬算出圖片壓縮比,根據(jù)圖片壓縮比將實際圖片壓縮為需要的圖片, 并將壓縮后的圖片用弱引用進行保存供下次使用。
6.根據(jù)權(quán)利要求5所述的提高列表刷新頻率的方法,其特征在于,所述步驟d還包括 判斷當(dāng)前列表視圖的滾動狀態(tài),如果當(dāng)前列表視圖的滾動狀態(tài)為快速滾動,顯示默認圖片; 如果當(dāng)前列表視圖的滾動狀態(tài)為停止?jié)L動或慢速滾動,根據(jù)相應(yīng)Item數(shù)組的id顯示具體圖片。
7.一種提高列表刷新頻率的裝置,其特征在于,包括數(shù)據(jù)確定模塊、數(shù)據(jù)存儲模塊、數(shù)組構(gòu)建模塊、視圖優(yōu)化模塊和視圖顯示模塊,所述數(shù)據(jù)確定模塊用于準備列表視圖要顯示的數(shù)據(jù),所述數(shù)據(jù)存儲模塊用于使用動態(tài)數(shù)組保存數(shù)據(jù),所述數(shù)組構(gòu)建模塊用于構(gòu)建適配器,所述視圖優(yōu)化模塊用于優(yōu)化適配器,生成視圖對象,設(shè)置視圖對象的標簽屬性,并將已生成的視圖對象緩存在本地,所述視圖顯示模塊用于把適配器添加到列表視圖,顯示視圖對象。
8.根據(jù)權(quán)利要求7所述的提高列表刷新頻率的裝置,其特征在于,所述視圖優(yōu)化模塊具體還包括視圖判斷單元、視圖加載單元、視圖設(shè)置單元和屬性賦值單元,所述視圖判斷單元用于判斷參數(shù)convertView是否為空,如果convertView為空,通過視圖加載單元加載視圖對象;如果convertView不為空,通過屬性賦值單元為convertView的屬性賦值;所述視圖加載單元用于從資源文件中加載一個convertView對象;所述視圖設(shè)置單元用于為 convertView對象生成標簽對象、為convertView對象的屬性賦值、為convertView對象的屬性賦值、并設(shè)置convertView的標簽屬性為ViewHolder ;所述屬性賦值單元用于獲取 convertView的標簽屬性為convertView的每個屬性賦值。
9.根據(jù)權(quán)利要求8所述的提高列表刷新頻率的裝置,其特征在于,所述視圖顯示模塊還包括緩存判斷單元、圖片加載單元、圖片壓縮單元和圖片保存單元,所述緩存判斷單元用于判斷本地緩存是否存在圖片數(shù)據(jù),如果本地緩存不存在圖片數(shù)據(jù),通過圖片加載單元加載圖片;如果本地緩存存在圖片數(shù)據(jù),通過圖片壓縮單元壓縮圖片;所述圖片加載單元用于連接網(wǎng)絡(luò)進行異步加載圖片;所述圖片壓縮單元用于獲取實際圖片的大小,根據(jù)實際圖片的長和寬算出圖片壓縮比,并根據(jù)圖片壓縮比將實際圖片壓縮為需要的圖片;所述圖片保存單元用于將壓縮后的圖片用弱引用保存到HashMap中供下次使用。
10.根據(jù)權(quán)利要求9所述的提高列表刷新頻率的裝置,其特征在于,所述視圖顯示模塊還包括狀態(tài)判斷單元和圖片顯示單元,所述狀態(tài)判斷單元用于判斷當(dāng)前列表視圖的滾動狀態(tài),并根據(jù)不同的滾動狀態(tài)通過圖片顯示單元顯示相應(yīng)的圖片;所述圖片顯示單元用于根據(jù)當(dāng)前列表視圖的滾動狀態(tài)顯示相應(yīng)的圖片,具體包括如果當(dāng)前列表視圖的滾動狀態(tài)為快速滾動,則顯示默認圖片;如果當(dāng)前列表視圖的滾動狀態(tài)為停止?jié)L動或慢速滾動,則根據(jù)相應(yīng)Item數(shù)組的id顯示具體圖片。
全文摘要
本發(fā)明屬于多媒體技術(shù)領(lǐng)域,尤其涉及一種提高列表刷新頻率的方法及裝置。本發(fā)明提高列表刷新頻率的方法,包括步驟a準備列表視圖要顯示的數(shù)據(jù),并使用動態(tài)數(shù)組保存數(shù)據(jù);步驟b構(gòu)建適配器,生成適配器的Item數(shù)組和動態(tài)數(shù)組對應(yīng)的數(shù)據(jù)元素;步驟c優(yōu)化適配器,生成視圖對象,設(shè)置視圖對象的標簽屬性,并將已生成的視圖對象緩存在本地;步驟d將適配器添加到列表視圖,顯示視圖對象。本發(fā)明提高列表刷新頻率的方法及裝置的實施可避免系統(tǒng)大量生成一次性使用的數(shù)據(jù),減少了系統(tǒng)內(nèi)存開銷,大大提高了性能,使得列表視圖顯示圖片的速度更快,滾動更流暢。
文檔編號G06F9/44GK102520918SQ20111029650
公開日2012年6月27日 申請日期2011年9月27日 優(yōu)先權(quán)日2011年9月27日
發(fā)明者史佳佳 申請人:深圳市五巨科技有限公司