編輯:關於android開發
上一篇記錄了使用ListView展示出來了100條數據,當慢慢拖動的時候,不會有問題,但是當拖動很快的時候,應用會報anr錯誤
查看錯誤日志,看到報OutOfMemoryError,內存不足
ListView在顯示條目的時候,每顯示出來一條都會調用一下getView()方法
這個方法裡面將xml文件轉成View對象非常的消耗資源,要避免頻繁調用:
在重寫的getView()方法中,會傳遞進來一個View對象convertView
當手向上拖動ListView的時候,上面隱藏出去一條的條目會保存在convertView對象中,這個convertView對象可以作為xml轉換成的目標View對象
此時,創建新的View對象,只會在第一次屏幕展示的時候創建,之後的條目顯示,都是使用的之前緩存的View對象
下面調用View對象的findViewById()方法,也非常消耗內存:
在android布局中,是個典型的樹結構,在查找控件的時候,需要遍歷整個的結構,有可能非常消耗時間
定義一個內部類ViewHolder
定義屬性根據業務
在getView()方法中,獲取ViewHolder對象
賦值ViewHolder對象的屬性,findViewById()查找到的View控件對象
當轉換成的View對象創建的時候,調用View對象的setTag()方法,參數:VIewHolder對象
使用View對象的getTag()方法,獲取出ViewHolder對象使用
class ViewHolder{ public TextView phoneView; public TextView modeView; } private class MyAdapter extends BaseAdapter { @Override public int getCount() { // TODO Auto-generated method stub return infos.size(); } @Override public View getView(int position, View convertView, ViewGroup parent) { View view; ViewHolder holder=new ViewHolder(); if(convertView==null){ view = View.inflate(CallSmsSafeActivity.this, R.layout.list_call_sms_safe_item, null); holder.phoneView=(TextView) view .findViewById(R.id.tv_main_phone); holder.modeView=(TextView) view .findViewById(R.id.tv_block_mode); view.setTag(holder); System.out.println("創建新的View對象"+position); }else{ view=convertView; holder=(ViewHolder) view.getTag(); System.out.println("使用歷史View對象"+position); } holder.phoneView.setText(infos.get(position).get("phone")); switch (infos.get(position).get("mode")) { case "1": holder.modeView.setText("電話攔截"); break; case "2": holder.modeView.setText("短信攔截"); break; case "3": holder.modeView.setText("全部攔截"); break; default: break; } return view; }
Android應用安全開發之淺談網頁打開APP,androidapp一、網頁打開APP簡介 Android有一個特性,可以通過點擊網頁內的某個鏈接打開APP,或者在其他A
A DB2 Performance Tuning Roadmap--Q-BASED A/A IMPLEMENATIONWhy Active/Active ? - Bus
ListFragment的使用,ListFragment使用ListFragment繼承了Fragment,顧名思義,ListFragment是一種特殊的Fragment
簡單登錄案例(SharedPreferences存儲賬戶信息)&聯網請求圖片並下載到SD卡(文件外部存儲),sharedpreferences 新人剛學習And