歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android 中ListView的優化

Android 中ListView的優化

日期:2017/3/1 10:03:30   编辑:Linux編程

首先定義listView

布局文件就不說了,一個是activity對應的布局,一個是listview中的item布局。(這個如果不知道就百度吧,應該很多)

首先是把這個listView顯示出來,在activity中兩個步驟:
1:找到listview對應的布局 xxx = (強轉)findviewbyid(對應id)
2:設置適配器: xxx.setadapt(這裡放適配器);
3:新建適配器: new myadapt(這裡可以選擇實現adapter的接口,也可以選擇繼承baseadapter,區別在於baseadapt已經輔助實現了一些虛函數,所以我們不需要再去寫那麼多方法,使代碼看起來比較混亂)


public class MyListAdapter extends BaseAdapter
{


public int getCount()
{
return blcaknumberlist.size();
}


public Object getItem(int position)
{
return null;
}


public long getItemId(int position)
{
return 0;
}

public View getView(int position, View convertView, ViewGroup parent)
{
//R.layout.list_blacknumber_item,這個是對應的item,就用不多說了吧
View view = View.inflate(getApplicationContext(),
R.layout.list_blacknumber_item, null);
//這裡填寫對應的item的數據填寫,舉個例子,假如item裡面有一個id為 tv_list_num的textview
tv_list_num = (TextView) view.findViewById(R.id.tv_list_num);//獲取了id
tv.settext(這裡面填充需要往裡面設置的內容);


return view;
}
}

4:到這裡一個listview已經建立完成了。

如果就這樣使用這個listview的話,我們可能會遇到的問題
1:如果數據量很龐大,那麼打開那個activity的時候會出現一個白屏(如果這樣的話,用戶體驗可謂糟糕之極呀)。
2:在滾動listView的時候會發現有一點卡,操作起來不流暢。
3:內存消耗很大,占用資源很多。

我逐個的說下優化方案:
對於第一點:出現的那個白屏,是由於在顯示前做了一個比較耗時的操作,例如做了大量的數據查詢或者操作。
解決方案1:就是將耗時操作放到線程中去做,這樣耗時就不會造成屏幕卡住,而我們也可以用一些個比較美觀的進度條來提示用戶,我們目前正在進行的操作,這樣用戶應該就能比較舒服,不會認為你這個程序有毛病,而放棄這個程序。
解決方案2:就是將耗時操作分片。當然也建議放到線程中,其次,我們將一次性需要耗時很多的操作並不一次性做完,而是分次去做。形象的說:如果我們的電話本中有1000個號碼,我們不需要去全部找出來,而是首先找出10條左右,正好顯示一頁,這樣時間會很短,當我們去拖動這個listview的時候,我們再去加載其他的選項,表現在數據庫上就是分頁的查找了。
這樣一優化,我想這個listview不單單是不會出現打開那個activity的時候卡住,而且很快,內存的消耗也降低了很多,原來需要將1000條數據全部加載到listview中,現在只需要加載幾十條,那內存節省的肯定不是一點點吧??


對於第二點:listview拖動的時候卡,要解決這個問題首先我們要清楚原因:原因是1:我們由下向上拖動listview的時候,Android系統會自動的去銷毀我們看不到的部分,並且創建進入我們視野的部分,所以上面的item會不停的被銷毀,而進入窗口的activity會不停的被創建。而創建一個item會消耗大量的資源,所以導致卡。
解決方案:重復利用已經建好的item。這個思想是和線程池和連接池的思路是一樣一樣的。我們如果能看到的item的個數是9個,那麼我們就建立10個這樣的item,當我們一個item消失的時候,我們不是去銷毀這個對象,而是把這個對象給我們即將進入視野的這個item去使用。這樣就可以重復的利用這個item,就不需要重復的去創建item了,還會卡嗎??


對於第三點,我想,第一點和第二點解決以後,第三點就迎刃而解了。

Copyright © Linux教程網 All Rights Reserved