Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> [android] 手機衛士黑名單功能(ListView優化),androidlistview

[android] 手機衛士黑名單功能(ListView優化),androidlistview

編輯:關於android開發

[android] 手機衛士黑名單功能(ListView優化),androidlistview


上一篇記錄了使用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;
        }

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved